谁有推箱子C语言源代码?

谁有推箱子C语言源代码?,第1张

/* 推箱子游戏 */

#include <dos.h>

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#include <conio.h>

#include <bios.h>

#include <alloc.h>

/* 定义二维数组ghouse来记录屏幕上各点的状态,

其中:0表示什么都没有,'b'表示箱子,'w'表示墙壁,'m'表示目的地,'i'表示箱子在目的地。 */

char ghouse[20][20]

/* 以下函数为直接写屏函数,很酷的函数哦!是我朋友告诉我的。 */

char far *screen=(char far* )0xb8000000

void putchxy(int y,int x,char ch,char fc,char bc)

{

screen[(x*160)+(y<<1)+0]=ch

screen[(x*160)+(y<<1)+1]=(bc*16)+fc

}

/* 定义判断是否胜利的数据结构 */

typedef struct winer {

int x,y

struct winer *p

}winer

/* 箱子位置的数据结构 */

typedef struct boxs {

int x,y

struct boxs *next

}boxs

/* 在特定的坐标上画墙壁并用数组记录状态的函数 */

void printwall(int x,int y)

{

putchxy(y-1,x-1,219,MAGENTA,BLACK)

ghouse[x][y]='w'

}

/* 在特定的坐标上画箱子并用数组记录状态的函数 */

void printbox(int x,int y)

{

putchxy(y-1,x-1,10,WHITE,BLACK)

ghouse[x][y]='b'

}

/* 在特定的坐标上画目的地并用数组记录状态的函数 */

void printwhither1(int x,int y,winer **win,winer **pw)

{

winer *qw

putchxy(y-1,x-1,'*',YELLOW,BLACK)

ghouse[x][y]='m'

if(*win==NULL)

{

*win=*pw=qw=(winer* )malloc(sizeof(winer))

(*pw)->x=x(*pw)->y=y(*pw)->p=NULL

}

else

{

qw=(winer* )malloc(sizeof(winer))

qw->x=xqw->y=y(*pw)->p=qw(*pw)=qwqw->p=NULL

}

}

/* 在特定的坐标上画目的地并用数组记录状态的函数 */

void printwhither(int x,int y)

{

putchxy(y-1,x-1,'*',YELLOW,BLACK)

ghouse[x][y]='m'

}

/* 在特定的坐标上画人的函数 */

void printman(int x,int y)

{

gotoxy(y,x)

_AL=02_CX=01_AH=0xa

geninterrupt(0x10)

}

/* 在特定的坐标上画箱子在目的地上并用数组记录状态的函数 */

void printboxin(int x,int y)

{

putchxy(y-1,x-1,10,YELLOW,BLACK)

ghouse[x][y]='i'

}

/* 初始化函数,初始化数组和屏幕 */

void init()

{

int i,j

system("cls")

for(i=0i<20i++)

for(j=0j<20j++)

ghouse[i][j]=0

_AL=3

_AH=0

geninterrupt(0x10)

gotoxy(40,4)

printf("Welcome to push box world!")

gotoxy(40,6)

printf("Press up,down,left,right to play.")

gotoxy(40,8)

printf("Press Esc to quit it.")

gotoxy(40,10)

printf("Press space to reset the game.")

gotoxy(40,12)

printf("April 30th 2004.")

}

/* 第一关的图象初始化 */

winer *inithouse1()

{

int x,y

winer *win=NULL,*pw

gotoxy(8,2)

printf("Level No.1")

for(x=1,y=5y<=9y++)

printwall(x+4,y+10)

for(y=5,x=2x<=5x++)

printwall(x+4,y+10)

for(y=9,x=2x<=5x++)

printwall(x+4,y+10)

for(y=1,x=3x<=8x++)

printwall(x+4,y+10)

for(x=3,y=3x<=5x++)

printwall(x+4,y+10)

for(x=5,y=8x<=9x++)

printwall(x+4,y+10)

for(x=7,y=4x<=9x++)

printwall(x+4,y+10)

for(x=9,y=5y<=7y++)

printwall(x+4,y+10)

for(x=8,y=2y<=3y++)

printwall(x+4,y+10)

printwall(5+4,4+10)

printwall(5+4,7+10)

printwall(3+4,2+10)

printbox(3+4,6+10)

printbox(3+4,7+10)

printbox(4+4,7+10)

printwhither1(4+4,2+10,&win,&pw)

printwhither1(5+4,2+10,&win,&pw)

printwhither1(6+4,2+10,&win,&pw)

printman(2+4,8+10)

return win

}

/* 第三关的图象初始化 */

winer *inithouse3()

{int x,y

winer *win=NULL,*pw

gotoxy(8,3)

printf("Level No.3")

for(x=1,y=2y<=8y++)

printwall(x+4,y+10)

for(x=2,y=2x<=4x++)

printwall(x+4,y+10)

for(x=4,y=1y<=3y++)

printwall(x+4,y+10)

for(x=5,y=1x<=8x++)

printwall(x+4,y+10)

for(x=8,y=2y<=5y++)

printwall(x+4,y+10)

for(x=5,y=5x<=7x++)

printwall(x+4,y+10)

for(x=7,y=6y<=9y++)

printwall(x+4,y+10)

for(x=3,y=9x<=6x++)

printwall(x+4,y+10)

for(x=3,y=6y<=8y++)

printwall(x+4,y+10)

printwall(2+4,8+10)

printwall(5+4,7+10)

printbox(6+4,3+10)

printbox(4+4,4+10)

printbox(5+4,6+10)

printwhither1(2+4,5+10,&win,&pw)

printwhither1(2+4,6+10,&win,&pw)

printwhither1(2+4,7+10,&win,&pw)

printman(2+4,4+10)

return win

}

/* 第二关的图象初始化 */

winer *inithouse2()

{int x,y

winer *win=NULL,*pw

gotoxy(8,2)

printf("Level No.2")

for(x=1,y=4y<=7y++)

printwall(x+4,y+10)

for(x=2,y=2y<=4y++)

printwall(x+4,y+10)

for(x=2,y=7x<=4x++)

printwall(x+4,y+10)

for(x=4,y=1x<=8x++)

printwall(x+4,y+10)

for(x=8,y=2y<=8y++)

printwall(x+4,y+10)

for(x=4,y=8x<=8x++)

printwall(x+4,y+10)

for(x=4,y=6x<=5x++)

printwall(x+4,y+10)

for(x=3,y=2x<=4x++)

printwall(x+4,y+10)

for(x=4,y=4x<=5x++)

printwall(x+4,y+10)

printwall(6+4,3+10)

printbox(3+4,5+10)

printbox(6+4,6+10)

printbox(7+4,3+10)

printwhither1(5+4,7+10,&win,&pw)

printwhither1(6+4,7+10,&win,&pw)

printwhither1(7+4,7+10,&win,&pw)

printman(2+4,6+10)

return win

}

/* 第四关的图象初始化 */

winer *inithouse4()

{int x,y

winer *win=NULL,*pw

gotoxy(8,2)

printf("Level No.4")

for(x=1,y=1y<=6y++)

printwall(x+4,y+10)

for(x=2,y=7y<=8y++)

printwall(x+4,y+10)

for(x=2,y=1x<=7x++)

printwall(x+4,y+10)

for(x=7,y=2y<=4y++)

printwall(x+4,y+10)

for(x=6,y=4y<=9y++)

printwall(x+4,y+10)

for(x=3,y=9x<=5x++)

printwall(x+4,y+10)

for(x=3,y=3y<=4y++)

printwall(x+4,y+10)

printwall(3+4,8+10)

printbox(3+4,5+10)

printbox(4+4,4+10)

printbox(4+4,6+10)

printbox(5+4,5+10)

printbox(5+4,3+10)

printwhither1(3+4,7+10,&win,&pw)

printwhither1(4+4,7+10,&win,&pw)

printwhither1(5+4,7+10,&win,&pw)

printwhither1(4+4,8+10,&win,&pw)

printwhither1(5+4,8+10,&win,&pw)

printman(2+4,2+10)

return win

}

/* 移动在空地上的箱子到空地上 */

movebox(int x,int y,char a)

{switch(a)

{

case 'u':ghouse[x-1][y]=0printf(" ")

printbox(x-2,y)printman(x-1,y)

ghouse[x-2][y]='b'break

case 'd':ghouse[x+1][y]=0printf(" ")

printbox(x+2,y)printman(x+1,y)

ghouse[x+2][y]='b'break

case 'l':ghouse[x][y-1]=0printf(" ")

printbox(x,y-2)printman(x,y-1)

ghouse[x][y-2]='b'break

case 'r':ghouse[x][y+1]=0printf(" ")

printbox(x,y+2)printman(x,y+1)

ghouse[x][y+2]='b'break

default: break

}

}

/* 移动在目的地上的箱子到空地上 */

moveinbox(int x,int y,char a)

{switch(a)

{

case 'u':ghouse[x-1][y]='m'printf(" ")

printbox(x-2,y)printman(x-1,y)

ghouse[x-2][y]='b'break

case 'd':ghouse[x+1][y]='m'printf(" ")

printbox(x+2,y)printman(x+1,y)

ghouse[x+2][y]='b'break

case 'l':ghouse[x][y-1]='m'printf(" ")

printbox(x,y-2)printman(x,y-1)

ghouse[x][y-2]='b'break

case 'r':ghouse[x][y+1]='m'printf(" ")

printbox(x,y+2)printman(x,y+1)

ghouse[x][y+2]='b'break

default: break

}

}

/* 移动在空地上的箱子到目的地上 */

moveboxin(int x,int y,char a)

{switch(a)

{

case 'u':ghouse[x-1][y]=0printf(" ")

printboxin(x-2,y)printman(x-1,y)

ghouse[x-2][y]='i'break

case 'd':ghouse[x+1][y]=0printf(" ")

printboxin(x+2,y)printman(x+1,y)

ghouse[x+2][y]='i'break

case 'l':ghouse[x][y-1]=0printf(" ")

printboxin(x,y-2)printman(x,y-1)

ghouse[x][y-2]='i'break

case 'r':ghouse[x][y+1]=0printf(" ")

printboxin(x,y+2)printman(x,y+1)

ghouse[x][y+2]='i'break

default: break

}

}

/* 移动在目的地上的箱子到目的地 */

moveinboxin(int x,int y,char a)

{switch(a)

{

case 'u':ghouse[x-1][y]='m'printf(" ")

printboxin(x-2,y)printman(x-1,y)

ghouse[x-2][y]='i'break

case 'd':ghouse[x+1][y]='m'printf(" ")

printboxin(x+2,y)printman(x+1,y)

ghouse[x+2][y]='i'break

case 'l':ghouse[x][y-1]='m'printf(" ")

printboxin(x,y-2)printman(x,y-1)

ghouse[x][y-2]='i'break

case 'r':ghouse[x][y+1]='m'printf(" ")

printboxin(x,y+2)printman(x,y+1)

ghouse[x][y+2]='i'break

default: break

}

}

/* 判断特定的坐标上的状态 */

int judge(int x,int y)

{int i

switch(ghouse[x][y])

{

case 0: i=1break

case 'w': i=0break

case 'b': i=2break

case 'i': i=4break

case 'm': i=3break

default: break

}

return i

}

/* 处理按下键盘后,人物移动的主函数 */

move(int x,int y,char a)

{switch(a)

{

case 'u':if(!judge(x-1,y)) {gotoxy(y,x)break}

else if(judge(x-1,y)==1||judge(x-1,y)==3)

{if(judge(x,y)==3)

{ printwhither(x,y)printman(x-1,y)break}

else

{printf(" ")printman(x-1,y)break}

}

else if(judge(x-1,y)==2)

{ if(judge(x-2,y)==1)

{movebox(x,y,'u')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x-1)

}

else if(judge(x-2,y)==3)

{ moveboxin(x,y,'u')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x-1)

}

else gotoxy(y,x)

break

}

else if(judge(x-1,y)==4)

{ if(judge(x-2,y)==1)

{moveinbox(x,y,'u')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x-1)

}

else if(judge(x-2,y)==3)

{ moveinboxin(x,y,'u')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x-1)

}

else gotoxy(y,x)

break

}

case 'd':if(!judge(x+1,y)) {gotoxy(y,x)break}

else if(judge(x+1,y)==1||judge(x+1,y)==3)

{if(judge(x,y)==3)

{ printwhither(x,y)printman(x+1,y)break}

else

{printf(" ")printman(x+1,y)break}

}

else if(judge(x+1,y)==2)

{ if(judge(x+2,y)==1)

{movebox(x,y,'d')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x+1)

}

else if(judge(x+2,y)==3)

{moveboxin(x,y,'d')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x+1)

}

else gotoxy(y,x)

break

}

else if(judge(x+1,y)==4)

{ if(judge(x+2,y)==1)

{moveinbox(x,y,'d')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x+1)

}

else if(judge(x+2,y)==3)

{moveinboxin(x,y,'d')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x+1)

}

else gotoxy(y,x)

break

}

case 'l':if(!judge(x,y-1)) {gotoxy(y,x)break}

else if(judge(x,y-1)==1||judge(x,y-1)==3)

{if(judge(x,y)==3)

{ printwhither(x,y)printman(x,y-1)break}

else

{printf(" ")printman(x,y-1)break}

}

else if(judge(x,y-1)==2)

{ if(judge(x,y-2)==1)

{movebox(x,y,'l')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y-1,x)

}

else if(judge(x,y-2)==3)

{moveboxin(x,y,'l')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y-1,x)

}

else gotoxy(y,x)

break

}

else if(judge(x,y-1)==4)

{ if(judge(x,y-2)==1)

{moveinbox(x,y,'l')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y-1,x)

}

else if(judge(x,y-2)==3)

{moveinboxin(x,y,'l')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y-1,x)

}

else gotoxy(y,x)

break

}

case 'r':if(!judge(x,y+1)) {gotoxy(y,x)break}

else if(judge(x,y+1)==1||judge(x,y+1)==3)

{if(judge(x,y)==3)

{printwhither(x,y)printman(x,y+1)break}

else

{printf(" ")printman(x,y+1)break}

}

else if(judge(x,y+1)==2)

{ if(judge(x,y+2)==1)

{movebox(x,y,'r')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y+1,x)

}

else if(judge(x,y+2)==3)

{moveboxin(x,y,'r')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y+1,x)

}

else gotoxy(y,x)

break

}

else if(judge(x,y+1)==4)

{ if(judge(x,y+2)==1)

{moveinbox(x,y,'r')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y+1,x)

}

else if(judge(x,y+2)==3)

{moveinboxin(x,y,'r')

if(judge(x,y)==3) printwhither(x,y)gotoxy(y+1,x)

}

else gotoxy(y,x)

break

}

default: break

}

}

/* 按下空格键后,回到本关开头的函数 */

void reset(int i)

{switch(i)

{

case 0: init()

inithouse1()break

case 1: init()

inithouse2()break

case 2: init()

inithouse3()break

case 3: init()

inithouse4()break

default:break

}

}

/* 主函数main */

main()

{int key,x,y,s,i=0

winer *win,*pw

_AL=3_AH=0

geninterrupt(0x10)

init()

win=inithouse1()

do{

_AH=3

geninterrupt(0x10)

x=_DH+1y=_DL+1

while(bioskey(1)==0)

key=bioskey(0)

switch(key)

{

case 0x4800:move(x,y,'u')break/* 按下向上键后 */

case 0x5000:move(x,y,'d')break/* 按下向下键后 */

case 0x4b00:move(x,y,'l')break/* 按下向左键后 */

case 0x4d00:move(x,y,'r')break/* 按下向右键后 */

case 0x3920:reset(i)break/* 按下空格键后 */

default:break

}

s=0

pw=win

while(pw)

{

if(ghouse[pw->x][pw->y]=='m') s++

pw=pw->p

}

if(s==0)

{

free(win)

gotoxy(25,2)

printf("Congratulate! You have passed Level %d!",i+1)

getch()

i++

switch(i)

{

case 1: init()

win=inithouse2()break

case 2: init()

win=inithouse3()break

case 3: init()

win=inithouse4()break

case 4: gotoxy(8,14)

printf("Great! You have passed all the levels! Press any key to quit!")

key=0x011bgetch()break

default: break

}

}

}while(key!=0x011b)

_AL=3

_AH=0

geninterrupt(0x10)

}

#include<stdio.h>

#include<stdlib.h>

typedef struct ele{

int vno/*物品号*/

struct ele *link/*另一物品的指针*/

}ELE

typedef struct hnode{

int remainder/*箱子尚剩空间*/

ELE *head/*箱内物品链首元指针*/

struct hnode *next/*箱子链的后继箱子指针*/

}HNODE

main()

{

int n,i,box_count,box_volume,*a

HNODE *box_h,*box_t,*j

ELE *p,*q

printf("输入箱子容积 ")

scanf("%d",&box_volume)

printf("输入物品种数 ")

scanf("%d",&n)

a=(int *)malloc(sizeof(int )*n)/*存储物品体积信息的数组*/

printf( "请按体积大小顺序输入各物品的体积: ")

for(i=0i<ni++)

scanf("%d",a+i)

box_h=box_t=NULL/*预置已用箱子链为空*/

box_count=0/*预置已用箱子计数器为0*/

for(i=0i<ni++)

{ /*从第一只箱子开始顺序寻找能放入物品i 的箱子j*/

p=(ELE *)malloc(sizeof(ELE))

p->vno=i

for(j=box_hj!=NULLj=j->next)

if(j->remainder>=a[i ])

break/*找到还可以装物品i的箱子*/

if(j==NULL)

{/*已用箱子都不能装物品i*/

j=(HNODE *)malloc(sizeof(HNODE)) /*使用一只新的箱子*/

j->remainder=box_volume-a[i ]

j->head=NULL

if(box_h==NULL)

box_h=box_t=j /* box-t有什么用处,能解释一下吗?*/

else box_t=box_t->next=j/*此外box-t又有什么用(在程序中),请说详一细*/

j->next=NULL

box_count++

}

else

j->remainder=a[i ] /*将物品i放入箱子j*/

for(q=j->headq!=NULL&&q->link!=NULLq=q->link)/*从这里起是放入物品号*/

if(q==NULL)

{

p->link=j->head

j->head=p

}

else

{

p->link=NULL

q->link=p

}

}/*for i*/

}

VB推箱子游戏(完整源代码)

VB推箱子游戏完整源代码,带声音、画面清淅,如codefans.net截图演示,本游戏最大的亮点是可以自动寻找路径,可以选定关卡、设计关卡、打开、关闭声音特效,总体来说是非常不错的小游戏,对学习用VB编写小游戏的朋友很有一定帮助。

下载地址:

http://www.codefans.net/soft/4648.shtml


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8009532.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存