c语言小游戏代码大全推箱子(c语言编写推箱子游戏)

http://www.itjxue.com  2023-03-06 09:18  来源:未知  点击次数: 

C语言小程序推箱子问题

你好,这是推箱子的全部代码

/*图形模式下的推箱子*/

#define MAX 2 /*游戏中总关数*/

#define STARTX 180

#define STARTY 80

#define BKCOLOR BLACK

#define MANCOLOR RED

#define OBJECTCOLOR YELLOW

#define TIMEINT 2

#define STARNUM 300

#define STEPMAX 5

#includestring.h

#includebios.h

#includestdio.h

#includedos.h

#includegraphics.h

#includeconio.h

#includetime.h

#includestdlib.h

#includestdio.h

#define Key_R 0x1372

#define Key_Up 0x4800

#define Key_Enter 0x1c0d

#define Key_Down 0x5000

#define Key_P 0x1970

#define Key_Esc 0x11b

#define Key_Right 0x4d00

#define Key_Left 0x4b00

typedef struct star

{

int x;

int y;

int c;

}Star;

Star s[STARNUM];

typedef struct record

{

char name[20];

int second;

struct time t;

struct date d;

}Record;

Record r[MAX];

typedef struct c

{

int x;

int y;

}Add;

typedef struct a

{

int x;

int y;

}Player;

Player p;

char name[20]; /*进入游戏时记录玩家的姓名*/

time_t t1,t2; /*游戏结束时的时间*/

int Ide; /*开始进入游戏时,选择菜单时返的功能号(1,2,3)*/

int MissionNum; /*玩家正在玩的关数*/

int BoxNum; /*目的地的个数*/

int Key; /*玩家按键*/

int map[10][10]; /*地图.(空=0),(人=1),(箱子=2),(墙=3),(目的地=4),(人+目的地=5),(箱子+目的地=6)*/

int StepNum;

int DirectionKey; /*用来表示方向键最后一次按键*/

int BoxMove[STEPMAX];

int Step[STEPMAX];

/*函数定义*/

void InputName();

void Init();

void MainMenu();

void JudgeRecord();

void WriteRecord();

void JudgeIde();

void DrawMenu(int );

void Game();

void InitMission(int );

void NextMission();

void InitPic(int ,int ,int );

int Move(Add );

void DrawWall(int ,int );

void DrawBack(int ,int );

void DrawBox(int ,int );

void DrawObject(int ,int );

void DrawMan(int ,int );

void DrawStar();

int JudgeWin();

void InitMission1();

void InitMission2();

int TimeCome();

void ChangeStar();

void InputName();

void ViewRecords();

void DeleteRecords();

void RegisterStep();

void ReverselyMove();

void MoveBack(Add );

void main()

{

InputName();

Init(); /*驱动显卡*/

srand(time(t1));

MainMenu(); /*画开始菜单(1.start game 2.view records 3.delete records 4.exit game)*/

}

void InputName()

{

char b;

char c;

do

{

printf("\n\nPlease input your password:");

scanf("%s",b);

}while(b!='l');

clrscr();

do

{

printf("\n\nPlease input your name:");

scanf("%s",name);

printf("Are you sure the name right(Y/N):");

do

{

c=getch();

}while(c!='Y'c!='y'c!='N'c!='n');

}while(c!='Y'c!='y');

}

void Init()

{

int gd=DETECT,gm;

initgraph(gd,gm,"d:\\tc");

}

void MainMenu()

{

setbkcolor(BKCOLOR);

cleardevice();

DrawStar(); /*画开始菜单的背景画面*/

DrawStar();

Ide=0,Key=0;

DrawMenu(Ide);

do

{

if(bioskey(1)) /*有键按下则处理按键*/

{

Key=bioskey(0);

switch(Key)

{

case Key_Down: {Ide++;Ide=Ide%4;DrawMenu(Ide);break;}

case Key_Up: {Ide--;Ide=(Ide+4)%4;DrawMenu(Ide);break;}

}

}

else {if(TimeCome()) ChangeStar();} /*改变背景*/

}while(Key!=Key_Enter);

JudgeIde(); /*根据Ide运行不同的程序*/

}

void JudgeIde()

{

switch(Ide)

{

case 0:Game();break;

case 1:{ViewRecords();bioskey(0);MainMenu();break;}

case 2:{DeleteRecords();ViewRecords();bioskey(0);MainMenu();break;}

case 3:exit(0);

}

}

void Game()

{

int i,j,flag;

Add ad;

MissionNum=0;

NextMission();

do

{

flag=0;

Key=bioskey(0);

switch(Key)

{

case Key_Enter:{NextMission();time(t1);break;}

case Key_Up:{ad.x=-1;ad.y=0;flag=1;DirectionKey=Key;break;}

case Key_Down:{ad.x=1;ad.y=0;flag=1;DirectionKey=Key;break;}

case Key_Left:{ad.x=0;ad.y=-1;flag=1;DirectionKey=Key;break;}

case Key_Right:{ad.x=0;ad.y=1;flag=1;DirectionKey=Key;break;}

case Key_R:{MissionNum--;NextMission();break;}

case Key_Esc:{MainMenu();break;}

case Key_P:{ReverselyMove();break;}

}

if(flag==1)

{if(Move(ad)) {RegisterStep(); if(JudgeWin()) {JudgeRecord();NextMission();}}}

}while(1);

}

void InitMission(int n)

{

int i,j;

for(i=0;i10;i++)

for(j=0;j10;j++)

map[i][j]=0;

switch(n)

{

case 1:InitMission1();break; /*第一关*/

case 2:InitMission2();break; /*第二关*/

}

}

void InitPic(int n,int i,int j)

{

switch(n)

{

case 0:DrawBack(i,j);break;

case 1:DrawMan(i,j);break;

case 2:DrawBox(i,j);break;

case 3:DrawWall(i,j);break;

case 4:DrawObject(i,j);break;

case 5:DrawMan(i,j);break;

case 6:DrawBox(i,j);break;

}

}

void NextMission()

{

int i,j;

if(MissionNum+1MAX) MissionNum=1;

else MissionNum++;

InitMission(MissionNum);

setbkcolor(BKCOLOR);

cleardevice();

for(i=0;i10;i++)

for(j=0;j10;j++)

InitPic(map[i][j],i,j);

switch(MissionNum)

{

case 1:outtextxy(200,230,"Mission 1");break;

case 2:outtextxy(200,230,"Mission 2");break;

}

time(t1);

for(i=0;iSTEPMAX;i++)

{Step[i]=BoxMove[i]=0;}

StepNum=0;

}

int Move(Add a)

{

int flag;

int i=StepNum%STEPMAX;

switch(map[p.x+a.x][p.y+a.y]) /*看下一位置为什么*/

{

case 0:{map[p.x][p.y]-=1;InitPic(map[p.x][p.y],p.x,p.y);

p.x=p.x+a.x;p.y=p.y+a.y;

map[p.x][p.y]+=1;InitPic(map[p.x][p.y],p.x,p.y);flag=1;break;}

case 2:{if(map[p.x+2*a.x][p.y+2*a.y]==0||map[p.x+2*a.x][p.y+2*a.y]==4)

{map[p.x][p.y]-=1;map[p.x+a.x][p.y+a.y]=1;map[p.x+2*a.x][p.y+2*a.y]+=2;

InitPic(map[p.x][p.y],p.x,p.y);

InitPic(map[p.x+a.x][p.y+a.y],p.x+a.x,p.y+a.y);

InitPic(map[p.x+2*a.x][p.y+2*a.y],p.x+2*a.x,p.y+2*a.y);

p.x=p.x+a.x;p.y=p.y+a.y;flag=1;BoxMove[i]=1;}

else flag=0;

break;}

case 3:flag=0;break;

case 4:{map[p.x][p.y]-=1;InitPic(map[p.x][p.y],p.x,p.y);

p.x=p.x+a.x;p.y=p.y+a.y;

map[p.x][p.y]+=1;InitPic(map[p.x][p.y],p.x,p.y);flag=1;break;}

case 6:{if(map[p.x+2*a.x][p.y+2*a.y]==0||map[p.x+2*a.x][p.y+2*a.y]==4)

{map[p.x][p.y]-=1;map[p.x+a.x][p.y+a.y]=5;map[p.x+2*a.x][p.y+2*a.y]+=2;

InitPic(map[p.x][p.y],p.x,p.y);

InitPic(map[p.x+a.x][p.y+a.y],p.x+a.x,p.y+a.y);

InitPic(map[p.x+2*a.x][p.y+2*a.y],p.x+2*a.x,p.y+2*a.y);

p.x=p.x+a.x;p.y=p.y+a.y;flag=1;BoxMove[i]=1;}

else flag=0;

break;}

}

return flag;

}

void DrawWall(int i,int j)

{

DrawBack(i,j);

setfillstyle(9,1);

bar(STARTX+20*j-9,STARTY+20*i-9,STARTX+20*j+9,STARTY+20*i+9);

}

void DrawMan(int i,int j)

{

DrawBack(i,j);

setcolor(MANCOLOR);

circle(STARTX+20*j,STARTY+20*i,9);

arc(STARTX+20*j-3,STARTY+20*i-2,20,160,3);

arc(STARTX+20*j+4,STARTY+20*i-2,20,160,3);

arc(STARTX+20*j,STARTY+20*i-2,220,320,7);

}

void DrawBack(int i,int j)

{

setfillstyle(1,BKCOLOR);

bar(STARTX+20*j-9,STARTY+20*i-9,STARTX+20*j+9,STARTY+20*i+9);

}

void DrawObject(int i,int j)

{

DrawBack(i,j);

setcolor(OBJECTCOLOR);

line(STARTX+20*j-9,STARTY+20*i,STARTX+20*j+9,STARTY+20*i);

line(STARTX+20*j-9,STARTY+20*i-9,STARTX+20*j+9,STARTY+20*i+9);

line(STARTX+20*j-9,STARTY+20*i+9,STARTX+20*j+9,STARTY+20*i-9);

}

void DrawBox(int i,int j)

{

DrawBack(i,j);

setfillstyle(9,3);

bar(STARTX+20*j-9,STARTY+20*i-9,STARTX+20*j+9,STARTY+20*i+9);

}

void DrawMenu(int j)

{

int n;

char *s[4]={"1.Start Game","2.View Records","3.Delete Records","4.Exit Game"};

settextstyle(0,0,1);

setcolor(GREEN);

for(n=0;n4;n++)

outtextxy(250,170+n*20,s[n]);

setcolor(RED);

outtextxy(250,170+j*20,s[j]);

}

void DrawStar()

{

int w,h,i,dotx,doty,color,maxcolor;

w=getmaxx();

h=getmaxy();

maxcolor=getmaxcolor();

for(i=0;iSTARNUM;i++)

{

s[i].x=1+random(w-1);

s[i].y=1+random(h-1);

s[i].c=random(maxcolor);

putpixel(s[i].x,s[i].y,s[i].c);

}

}

void ChangeStar()

{

int i,maxcolor;

maxcolor=getmaxcolor();

for(i=0;iSTARNUM;i++)

{

s[i].c=random(maxcolor);

putpixel(s[i].x,s[i].y,s[i].c);

}

}

int TimeCome()

{

static long tm, old;

tm=biostime(0,tm);

if(tm-oldTIMEINT) return 0;

else

{

old=tm; return 1;

}

}

int JudgeWin()

{

int n=0,i,j;

for(i=0;i10;i++)

for(j=0;j10;j++)

if(map[i][j]==6) n++;

if(n==BoxNum) return 1;

else return 0;

}

void InitMission1() /*第九关*/

{

int i,j;

for(i=0;i10;i++)

for(j=0;j10;j++)

map[i][j]=0;

for(i=0;i=5;i++)

map[0][i]=3;

for(i=5;i=7;i++)

{map[2][i]=map[i-1][1]=3;}

for(i=1;i=4;i++)

{map[6][i]=map[5][i+3]=map[i][0]=3;}

map[3][7]=map[4][7]=map[1][5]=3;

for(i=2;i=4;i++)

map[2][i]=2;

map[3][4]=map[4][5]=2;

for(i=2;i=3;i++)

{map[3][i]=map[4][i]=4;}

map[4][4]=4;

p.x=3;p.y=5;

map[3][5]=1;

BoxNum=5;

}

void InitMission2()

{

int i,j;

for(i=0;i10;i++)

for(j=0;j10;j++)

map[i][j]=0;

for(i=1;i=5;i++)

{map[0][i]=map[6][i]=3;}

for(i=2;i=4;i++)

{map[1][i+3]=map[i][7]=map[i+2][5]=map[i][0]=3;}

map[1][1]=map[2][1]=map[5][0]=map[5][5]=map[4][6]=map[6][0]=3;

map[2][4]=map[3][3]=map[4][2]=map[4][3]=2;

map[2][3]=map[3][2]=map[3][4]=map[4][4]=4;

p.x=1;p.y=3;

map[1][3]=1;

BoxNum=4;

}

void ViewRecords()

{

FILE *fp;

int i;

setbkcolor(BKCOLOR);

cleardevice();

if((fp=fopen("record","r"))==NULL)

{

printf("\nerror on open file!");

getch();

exit(1);

}

gotoxy(1,1);

printf("\n\t\t\tRecord Information\n");

printf("Record-holder Achievement(s)\t Time(h:m:s)\t\tDate(y/m/d)");

for(i=0;iMAX;i++)

{fseek(fp,i*sizeof(Record),0);

fread(r[i],sizeof(Record),1,fp);

printf("\n%-10s\t%d\t\t %02d:%02d:%02d\t\t%02d/%02d/%02d",r[i].name,r[i].second,r[i].t.ti_hour,r[i].t.ti_min,r[i].t.ti_sec,r[i].d.da_year,r[i].d.da_mon,r[i].d.da_day);}

fclose(fp);

gotoxy(10,25);

printf("Press any key to return mainmenu...");

}

void DeleteRecords()

{

int i;

FILE *fp;

fp=fopen("record","w");

for(i=0;iMAX;i++)

{

strcpy(r[i].name,"nameless");

r[i].second=0;

gettime(r[i].t);

getdate(r[i].d);

}

for(i=0;iMAX;i++)

fwrite(r[i],sizeof(Record),1,fp);

fclose(fp);

}

void JudgeRecord()

{

int i=MissionNum-1;

time(t2);

if(r[i].second==0||difftime(t2,t1)r[i].second)

{

gotoxy(10,3);printf("\t\tYou have broken the record");

r[i].second=difftime(t2,t1);

strcpy(r[i].name,name);

gettime(r[i].t);

getdate(r[i].d);

WriteRecord();

}

else

{gotoxy(10,3);printf("\t\tYou have pass this mission");}

gotoxy(10,4);

printf("\t\tpress any key continue...");

getch();

getch();

}

void WriteRecord()

{

FILE *fp;

int i=MissionNum-1;

fp=fopen("record","rt+");

fseek(fp,i*sizeof(Record),0);

fwrite(r[MissionNum-1],sizeof(Record),1,fp);

fclose(fp);

}

void RegisterStep()

{

int i;

StepNum++;

i=(StepNum-1)%STEPMAX;

Step[i]=DirectionKey;

}

void ReverselyMove()

{

int i;

Add ad;

i=(StepNum-1)%STEPMAX;

if(Step[i]==0) return;

else

{

switch(Step[i])

{

case Key_Up:{ad.x=1;ad.y=0;MoveBack(ad);break;}

case Key_Down:{ad.x=-1;ad.y=0;MoveBack(ad);break;}

case Key_Left:{ad.x=0;ad.y=1;MoveBack(ad);break;}

case Key_Right:{ad.x=0;ad.y=-1;MoveBack(ad);break;}

}

StepNum--;Step[i]=0;BoxMove[i]=0;

}

}

void MoveBack(Add a) /*一定可以移动*/

{

int i=(StepNum-1)%STEPMAX;

if(BoxMove[i]==0)

{

map[p.x][p.y]-=1;InitPic(map[p.x][p.y],p.x,p.y);

p.x=p.x+a.x;p.y=p.y+a.y;

map[p.x][p.y]+=1;InitPic(map[p.x][p.y],p.x,p.y);

}

else if(BoxMove[i]==1)

{

map[p.x-a.x][p.y-a.y]-=2;InitPic(map[p.x-a.x][p.y-a.y],p.x-a.x,p.y-a.y);

map[p.x][p.y]+=1;InitPic(map[p.x][p.y],p.x,p.y);

p.x=p.x+a.x;p.y=p.y+a.y;

map[p.x][p.y]+=1;InitPic(map[p.x][p.y],p.x,p.y);

}

}

谁有能在vc++6.0上运行的c语言小游戏代码???

最基础的贪吃蛇的代码

#includestdio.h

#includewindows.h//基本型态定义。支援型态定义函数。使用者界面函数 图形装置界面函数。

#includeconio.h //用户通过按键盘产生的对应操作 (控制台)

#includestdlib.h

#includetime.h //日期和时间头文件

#define LEN 30

#define WID 25

int Snake[LEN][WID] = {0}; //数组的元素代表蛇的各个部位

char Sna_Hea_Dir = 'a';//记录蛇头的移动方向

int Sna_Hea_X, Sna_Hea_Y;//记录蛇头的位置

int Snake_Len = 3;//记录蛇的长度

clock_t Now_Time;//记录当前时间,以便自动移动

int Wait_Time ;//记录自动移动的时间间隔

int Eat_Apple = 1;//吃到苹果表示为1

int Level ;

int All_Score = -1;

int Apple_Num = -1;

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); //获取标准输出的句柄 windows.h

//句柄 :标志应用程序中的不同对象和同类对象中的不同的实例 方便操控,

void gotoxy(int x, int y)//设置光标位置

{

COORD pos = {x,y}; //定义一个字符在控制台屏幕上的坐标POS

SetConsoleCursorPosition(hConsole, pos); //定位光标位置的函数windows.h

}

void Hide_Cursor()//隐藏光标 固定函数

{

CONSOLE_CURSOR_INFO cursor_info = {1, 0};

SetConsoleCursorInfo(hConsole, cursor_info);

}

void SetColor(int color)//设置颜色

{

SetConsoleTextAttribute(hConsole, color);

//是API设置字体颜色和背景色的函数 格式:SetConsoleTextAttribute(句柄,颜色);

}

void Print_Snake()//打印蛇头和蛇的脖子和蛇尾

{

int iy, ix, color;

for(iy = 0; iy WID; ++iy)

for(ix = 0; ix LEN; ++ix)

{

if(Snake[ix][iy] == 1)//蛇头

{

SetColor(0xf); //oxf代表分配的内存地址 setcolor:34行自定义设置颜色的函数

gotoxy(ix*2, iy);

printf("※");

}

if(Snake[ix][iy] == 2)//蛇的脖子

{

color = rand()%15 + 1; //rand()函数是产生随机数的一个随机函数。C语言里还有 srand()函数等。

//头文件:stdlib.h

if(color == 14)

color -= rand() % 13 + 1; //变色

SetColor(color);

gotoxy(ix*2, iy);

printf("■");

}

if(Snake[ix][iy] == Snake_Len)

{

gotoxy(ix*2, iy);

SetColor(0xe);

printf("≈");

}

}

}

void Clear_Snake()//擦除贪吃蛇

{

int iy, ix;

for(iy = 0; iy WID; ++iy)

for(ix = 0; ix LEN; ++ix)

{

gotoxy(ix*2, iy);

if(Snake[ix][iy] == Snake_Len)

printf(" ");

}

}

void Rand_Apple()//随机产生苹果

{

int ix, iy;

do

{

ix = rand() % LEN;

iy = rand() % WID;

}while(Snake[ix][iy]);

Snake[ix][iy] = -1;

gotoxy(ix*2, iy);

printf("⊙");

Eat_Apple = 0;

}

void Game_Over()//蛇死掉了

{

gotoxy(30, 10);

printf("Game Over");

Sleep(3000);

system("pause nul");

exit(0);

}

void Move_Snake()//让蛇动起来

{

int ix, iy;

for(ix = 0; ix LEN; ++ix)//先标记蛇头

for(iy = 0; iy WID; ++iy)

if(Snake[ix][iy] == 1)

{

switch(Sna_Hea_Dir)//根据新的蛇头方向标志蛇头

{

case 'w':

if(iy == 0)

Game_Over();

else

Sna_Hea_Y = iy - 1;

Sna_Hea_X = ix;

break;

case 's':

if(iy == (WID -1))

Game_Over();

else

Sna_Hea_Y = iy + 1;

Sna_Hea_X = ix;

break;

case 'a':

if(ix == 0)

Game_Over();

else

Sna_Hea_X = ix - 1;

Sna_Hea_Y = iy;

break;

case 'd':

if(ix == (LEN - 1))

Game_Over();

else

Sna_Hea_X = ix + 1;

Sna_Hea_Y = iy;

break;

default:

break;

}

}

if(Snake[Sna_Hea_X][Sna_Hea_Y]!=1Snake[Sna_Hea_X][Sna_Hea_Y]!=0Snake[Sna_Hea_X][Sna_Hea_Y]!=-1)

Game_Over();

if(Snake[Sna_Hea_X][Sna_Hea_Y] 0)//吃到苹果

{

++Snake_Len;

Eat_Apple = 1;

}

for(ix = 0; ix LEN; ++ix)//处理蛇尾

for(iy = 0; iy WID; ++iy)

{

if(Snake[ix][iy] 0)

{

if(Snake[ix][iy] != Snake_Len)

Snake[ix][iy] += 1;

else

Snake[ix][iy] = 0;

}

}

Snake[Sna_Hea_X][Sna_Hea_Y] = 1;//处理蛇头

}

void Get_Input()//控制蛇的移动方向

{

if(kbhit())

{

switch(getch())

{

case 87:

Sna_Hea_Dir = 'w';

break;

case 83:

Sna_Hea_Dir = 's';

break;

case 65:

Sna_Hea_Dir = 'a';

break;

case 68:

Sna_Hea_Dir = 'd';

break;

default:

break;

}

}

if(clock() - Now_Time = Wait_Time)//蛇到时间自动行走

{

Clear_Snake();

Move_Snake();

Print_Snake();

Now_Time = clock();

}

}

void Init()//初始化

{

system("title 贪吃毛毛蛇");

system("mode con: cols=80 lines=25");

Hide_Cursor();

gotoxy(61, 4);

printf("You Score:");

gotoxy(61, 6);

printf("You Level:");

gotoxy(61, 8);

printf("The Lenght:");

gotoxy(61, 10);

printf("The Speed:");

gotoxy(61, 12);

printf("Apple Num:");

int i;

for(i = 0; i Snake_Len; ++i)//生成蛇

Snake[10+i][15] = i+1;

int iy, ix;//打印蛇

for(iy = 0; iy WID; ++iy)

for(ix = 0; ix LEN; ++ix)

{

if(Snake[ix][iy])

{

SetColor(Snake[ix][iy]);

gotoxy(ix*2, iy);

printf("■");

}

}

}

void Pri_News()//打印信息

{

SetColor(0xe);

gotoxy(73,4);

All_Score += Level;

printf("%3d", All_Score);

gotoxy(73, 6);

printf("%3d", Level);

gotoxy(73, 8);

printf("%3d",Snake_Len);

gotoxy(73, 10);

printf("0.%3ds", Wait_Time/10);

gotoxy(73, 12);

printf("%d", Apple_Num);

}

void Lev_Sys()//等级系统

{

if(((Apple_Num-1) / 10) == Level)

{

++Level;

if(Wait_Time 50)

Wait_Time -= 50;

else

if(Wait_Time 10)

Wait_Time -= 10;

else

Wait_Time -= 1;

}

}

int main(void)

{

Init();

srand((unsigned)time(NULL));//设置随机数的种子

Now_Time = clock();

int speed1=1000,speed2,a;

printf("\n");

printf("请输入你想要的速度\n");

scanf("%d",speed2);

Level=1;

Wait_Time=speed1-speed2;

printf("请输入你想要的苹果数\n");

scanf("%d",a);

while(a--)

Rand_Apple();

while(1)

{

if(Eat_Apple)

{

++Apple_Num;

Rand_Apple();

Lev_Sys();

Pri_News();

}

Get_Input();

Sleep(10);

}

return 0;

}

求C语言小游戏源程序

我的楼主可以自己玩一下

试试吧

#define N 200

#include graphics.h

#include stdlib.h

#include dos.h

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key;

int score=0;/*得分*/

int gamespeed=50000;/*游戏速度自己调整*/

struct Food

{

int x;/*食物的横坐标*/

int y;/*食物的纵坐标*/

int yes;/*判断是否要出现食物的变量*/

}food;/*食物的结构体*/

struct Snake

{

int x[N];

int y[N];

int node;/*蛇的节数*/

int direction;/*蛇移动方向*/

int life;/* 蛇的生命,0活着,1死亡*/

}snake;

void Init(void);/*图形驱动*/

void Close(void);/*图形结束*/

void DrawK(void);/*开始画面*/

void GameOver(void);/*结束游戏*/

void GamePlay(void);/*玩游戏具体过程*/

void PrScore(void);/*输出成绩*/

/*主函数*/

void main(void)

{

Init();/*图形驱动*/

DrawK();/*开始画面*/

GamePlay();/*玩游戏具体过程*/

Close();/*图形结束*/

}

/*图形驱动*/

void Init(void)

{

int gd=DETECT,gm;

initgraph(gd,gm,"c:\\tc");

cleardevice();

}

/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/

void DrawK(void)

{

/*setbkcolor(LIGHTGREEN);*/

setcolor(11);

setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/

for(i=50;i=600;i+=10)/*画围墙*/

{

rectangle(i,40,i+10,49); /*上边*/

rectangle(i,451,i+10,460);/*下边*/

}

for(i=40;i=450;i+=10)

{

rectangle(50,i,59,i+10); /*左边*/

rectangle(601,i,610,i+10);/*右边*/

}

}

/*玩游戏具体过程*/

void GamePlay(void)

{

randomize();/*随机数发生器*/

food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/

snake.life=0;/*活着*/

snake.direction=1;/*方向往右*/

snake.x[0]=100;snake.y[0]=100;/*蛇头*/

snake.x[1]=110;snake.y[1]=100;

snake.node=2;/*节数*/

PrScore();/*输出得分*/

while(1)/*可以重复玩游戏,压ESC键结束*/

{

while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/

{

if(food.yes==1)/*需要出现新食物*/

{

food.x=rand()%400+60;

food.y=rand()%350+60;

while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/

food.x++;

while(food.y%10!=0)

food.y++;

food.yes=0;/*画面上有食物了*/

}

if(food.yes==0)/*画面上有食物了就要显示*/

{

setcolor(GREEN);

rectangle(food.x,food.y,food.x+10,food.y-10);

}

for(i=snake.node-1;i0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/

{

snake.x[i]=snake.x[i-1];

snake.y[i]=snake.y[i-1];

}

/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/

switch(snake.direction)

{

case 1:snake.x[0]+=10;break;

case 2: snake.x[0]-=10;break;

case 3: snake.y[0]-=10;break;

case 4: snake.y[0]+=10;break;

}

for(i=3;isnake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/

{

if(snake.x[i]==snake.x[0]snake.y[i]==snake.y[0])

{

GameOver();/*显示失败*/

snake.life=1;

break;

}

}

if(snake.x[0]55||snake.x[0]595||snake.y[0]55||

snake.y[0]455)/*蛇是否撞到墙壁*/

{

GameOver();/*本次游戏结束*/

snake.life=1; /*蛇死*/

}

if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/

break;

if(snake.x[0]==food.xsnake.y[0]==food.y)/*吃到食物以后*/

{

setcolor(0);/*把画面上的食物东西去掉*/

rectangle(food.x,food.y,food.x+10,food.y-10);

snake.x[snake.node]=-20;snake.y[snake.node]=-20;

/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/

snake.node++;/*蛇的身体长一节*/

food.yes=1;/*画面上需要出现新的食物*/

score+=10;

PrScore();/*输出新得分*/

}

setcolor(4);/*画出蛇*/

for(i=0;isnake.node;i++)

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,

snake.y[i]-10);

delay(gamespeed);

setcolor(0);/*用黑色去除蛇的的最后一节*/

rectangle(snake.x[snake.node-1],snake.y[snake.node-1],

snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);

} /*endwhile(!kbhit)*/

if(snake.life==1)/*如果蛇死就跳出循环*/

break;

key=bioskey(0);/*接收按键*/

if(key==ESC)/*按ESC键退出*/

break;

else

if(key==UPsnake.direction!=4)

/*判断是否往相反的方向移动*/

snake.direction=3;

else

if(key==RIGHTsnake.direction!=2)

snake.direction=1;

else

if(key==LEFTsnake.direction!=1)

snake.direction=2;

else

if(key==DOWNsnake.direction!=3)

snake.direction=4;

}/*endwhile(1)*/

}

/*游戏结束*/

void GameOver(void)

{

cleardevice();

PrScore();

setcolor(RED);

settextstyle(0,0,4);

outtextxy(200,200,"GAME OVER");

getch();

}

/*输出成绩*/

void PrScore(void)

{

char str[10];

setfillstyle(SOLID_FILL,YELLOW);

bar(50,15,220,35);

setcolor(6);

settextstyle(0,0,2);

sprintf(str,"score:%d",score);

outtextxy(55,20,str);

}

/*图形结束*/

void Close(void)

{

getch();

closegraph();

}

c语言推箱子

//空:0??墙:1??箱子:3???巢:4???箱子与巢重合:5

[MAPCOUNT]

map_count=8

[MAP1]

w=8

h=8

nest_count=4

l1=0?0?0?1?1?1?0?0

l2=0?0?0?1?3?1?0?0

l3=1?1?1?1?0?1?0?0

l4=1?3?2?0?2?1?1?1

l5=1?1?1?4?2?0?3?1

l6=0?0?1?2?1?1?1?1

l7=0?0?1?3?1?0?0?0

l8=0?0?1?1?1?0?0?0

[MAP2]

w=9

h=9

nest_count=3

l1=1?1?1?1?1?0?0?0?0

l2=1?4?0?0?1?0?0?0?0

l3=1?0?2?2?1?0?1?1?1

l4=1?0?2?0?1?0?1?3?1

l5=1?1?1?0?1?1?1?3?1

l6=0?1?1?0?0?0?0?3?1

l7=0?1?0?0?0?1?0?0?1

l8=0?1?0?0?0?1?1?1?1

l9=0?1?1?1?1?1?0?0?0

[MAP3]

w=10

h=7

nest_count=4

l1=0?1?1?1?1?1?1?1?0?0

l2=0?1?0?0?0?0?0?1?1?1

l3=1?1?2?1?1?1?0?0?0?1

l4=1?0?4?0?2?0?0?2?0?1

l5=1?0?3?3?1?0?2?0?1?1

l6=1?1?3?3?1?0?0?0?1?0

l7=0?1?1?1?1?1?1?1?1?0

[MAP4]

w=6

h=8

nest_count=5

l1=0?1?1?1?1?0

l2=1?1?0?0?1?0

l3=1?4?2?0?1?0

l4=1?1?2?0?1?1

l5=1?1?0?2?0?1

l6=1?3?2?0?0?1

l7=1?3?3?5?3?1

l8=1?1?1?1?1?1

//以上为地图数据文件,保存为boxdata.dat文件

//空:0??墙:1??箱子:3???巢:4???箱子与巢重合:5

#include?stdio.h

#include?stdlib.h

#include?stdbool.h

#include?windows.h

#include?string.h

typedef?struct

{

int?x;

int?y;

}?PT;

int**?s;

PT?man;

PT*?nest=NULL;

PT?prev;

int?nest_count=0;

int?map_count=0;

int?gate=1;

int?w,h;

char?work_dir[100]={'\0'};

char?data_file[100]={'\0'};

void?GetDataFromFile();

void?GetIntFromLineString(char*?ch,?int?len,?int?i);

void?Draw();

bool?is_Success();

int?main()

{

printf("Loading...");

CONSOLE_CURSOR_INFO?cci;

cci.bVisible?=?FALSE;

cci.dwSize?=?sizeof(cci);

HANDLE?handle?=?GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleCursorInfo(handle,?cci);

_getcwd(work_dir,100);

strcpy(data_file,work_dir);

strcat(data_file,"\\boxdata.dat");

if(access(data_file,0))

{

printf("Don't?find?map?data?file?!");

getch();

exit(0);

}

while(1)

{

GetDataFromFile();

int?sel=0;

Draw();

while(1)

{

fflush(stdin);

sel=getch();

if(sel==224)

{

sel=getch();

prev=man;

if(sel==77)??//right

{

if(s[man.y][man.x+1]==2)

{

if(s[man.y][man.x+2]==0?||?s[man.y][man.x+2]==3)

{

s[man.y][man.x+2]=2;

s[man.y][man.x+1]=4;

s[man.y][man.x]=0;

}

else

{

continue;

}

}

else?if(s[man.y][man.x+1]==0?||?s[man.y][man.x+1]==3)

{

s[man.y][man.x+1]=4;

s[man.y][man.x]=0;

}

else

{

continue;

}

}

else?if(sel==80)??//down

{

if(s[man.y+1][man.x]==2)

{

if(s[man.y+2][man.x]==0?||?s[man.y+2][man.x]==3)

{

s[man.y+2][man.x]=2;

s[man.y+1][man.x]=4;

s[man.y][man.x]=0;

}

else

{

continue;

}

}

else?if(s[man.y+1][man.x]==0?||?s[man.y+1][man.x]==3)

{

s[man.y+1][man.x]=4;

s[man.y][man.x]=0;

}

else

{

continue;

}

}

else?if(sel==72)??//up

{

if(s[man.y-1][man.x]==2)

{

if(s[man.y-2][man.x]==0?||?s[man.y-2][man.x]==3)

{

s[man.y-2][man.x]=2;

s[man.y-1][man.x]=4;

s[man.y][man.x]=0;

}

else

{

continue;

}

}

else?if(s[man.y-1][man.x]==0?||?s[man.y-1][man.x]==3)

{

s[man.y-1][man.x]=4;

s[man.y][man.x]=0;

}

else

{

continue;

}

}

else?if(sel==75)??//left

{

if(s[man.y][man.x-1]==2)

{

if(s[man.y][man.x-2]==0?||?s[man.y][man.x-2]==3)

{

s[man.y][man.x-2]=2;

s[man.y][man.x-1]=4;

s[man.y][man.x]=0;

}

else

{

continue;

}

}

else?if(s[man.y][man.x-1]==0?||?s[man.y][man.x-1]==3)

{

s[man.y][man.x-1]=4;

s[man.y][man.x]=0;

}

else

{

continue;

}

}

int?i;

for(i=0;inest_count;i++)

{

if(nest[i].x==prev.x??nest[i].y==prev.y)

{

s[prev.y][prev.x]=3;

break;

}

}

Draw();

if(is_Success()==true)

{

gate++;

if(gatemap_count)

{

printf("\n\nmap?is?end!");

fflush(stdin);

getch();

exit(0);

}

break;

}

}

else?if(sel=='q'?||?sel=='Q')

{

exit(0);

}

else?if(sel=='r'?||?sel=='R')

{

break;

}

}

}

return?0;

}

void?GetDataFromFile()

{

int?i;

if(s!=NULL)

{

if(h!=0)

{

for(i=0;ih;i++)

{

free(s+i);

}

free(s);

}

else

{

printf("fail");

getch();

exit(0);

}

}

if(nest!=NULL)

{

free(nest);

}

map_count=GetPrivateProfileInt("MAPCOUNT","map_count",0,data_file);

if(map_countgate)

{

printf("gate?finish!");

getch();

exit(0);

}

char?section[20]={'\0'};

sprintf(section,"MAP%d",gate);

nest_count=GetPrivateProfileInt(section,"nest_count",0,data_file);

nest=(PT*)malloc(sizeof(PT)*nest_count);

w=GetPrivateProfileInt(section,"w",0,data_file);

h=GetPrivateProfileInt(section,"h",0,data_file);

if(w5?||?h5?||?nest_count1)

{

printf("w?or?h?or?box_nest?data?error!");

getch();

exit(0);

}

s=(int**)malloc(sizeof(int*)*h);

for(i=0;ih;i++)

{

*(s+i)=(int*)malloc(sizeof(int)*w);

}

char?key[20]={'\0'};

char?line[50]={'\0'};

int?len;

int?j;

for(i=0;ih;i++)

{

memset(line,'\0',50);

sprintf(key,"l%d",i+1);

GetPrivateProfileString(section,key,"\0",line,50,data_file);

len=strlen(line);

if(len0)

{

line[len++]='?';

line[len]='\0';

}

GetIntFromLineString(line,strlen(line),i);

}

len=0;

for(i=0;ih;i++)

{

for(j=0;jw;j++)

{

if(s[i][j]==3)

{

nest[len].y=i;

nest[len].x=j;

len++;

}

else?if(s[i][j]==5)

{

nest[len].y=i;

nest[len].x=j;

len++;

s[i][j]=2;

}

}

}

}

void?strmyncpy(char*?source,?char*?target,?int?begin,?int?end)

{

int?i=0;

while(1)

{

if(source[begin]!='?')

{

target[i]=source[begin];

}

i++;

begin++;

if(beginend)

{

target[i]='\0';

break;

}

}

}

void?GetIntFromLineString(char*?ch,?int?len,?int?i)

{

int?j=0;

char?c[5]={'\0'};

int?b=0,e=0;

while(elen)

{

if(ch[e]=='?')

{

memset(c,'\0',5);

strmyncpy(ch,c,b,e);

b=e+1;

e++;

s[i][j++]=atoi(c);

}

e++;

}

}

void?Draw()

{

int?i,j,k;

bool?flag=false;

system("cls");

printf("\n\n");

for(i=0;ih;i++)

{

printf("\n\n");

for(j=0;jw;j++)

{

if(s[i][j]==0)

{

printf("????");

}

else?if(s[i][j]==1)

{

printf("?■?");

}

else?if(s[i][j]==2)

{

printf("?★?");

}

else?if(s[i][j]==3)

{

printf("?☆?");

}

else?if(s[i][j]==4)

{

printf("?◎?");

man.x=j;

man.y=i;

}

}

}

}

bool?is_Success()

{

int?i,j;

for(i=0;ih;i++)

{

for(j=0;jw;j++)

{

if(s[i][j]==3)

{

return?false;

}

}

}

for(i=0;inest_count;i++)

{

if(man.x==nest[i].x??man.y==nest[i].y)

{

return?false;

}

}

return?true;

}

c语言推箱子代码

Here you are!

编译通过。

/* 推箱子游戏 */

#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)+(y1)+0]=ch;

screen[(x*160)+(y1)+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=x;qw-y=y;(*pw)-p=qw;(*pw)=qw;qw-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=0;i20;i++)

for(j=0;j20;j++)

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=5;y=9;y++)

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

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=2;y=8;y++)

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

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=4;y=7;y++)

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

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=1;y=6;y++)

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

printwall(x+4,y+10);

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

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]=0;printf(" ");

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

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

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

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

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

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

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

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

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

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]=0;printf(" ");

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

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

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

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

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

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

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

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

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

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=1;break;

case 'w': i=0;break;

case 'b': i=2;break;

case 'i': i=4;break;

case 'm': i=3;break;

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+1;y=_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=0x011b;getch();break;

default: break;

}

}

}while(key!=0x011b);

_AL=3;

_AH=0;

geninterrupt(0x10);

}

(责任编辑:IT教学网)

更多

推荐windows vista文章