C语言小程序推箱子问题

C语言小程序推箱子问题,第1张

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

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

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

#define STARTX 180

#define STARTY80

#define BKCOLOR BLACK

#define MANCOLOR RED

#define OBJECTCOLOR YELLOW

#define TIMEINT 2

#define STARNUM 300

#define STEPMAX 5

#include<string.h>

#include<bios.h>

#include<stdio.h>

#include<dos.h>

#include<graphics.h>

#include<conio.h>

#include<time.h>

#include<stdlib.h>

#include<stdio.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%4DrawMenu(Ide)break}

case Key_Up:{Ide--Ide=(Ide+4)%4DrawMenu(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=-1ad.y=0flag=1DirectionKey=Keybreak}

case Key_Down:{ad.x=1ad.y=0flag=1DirectionKey=Keybreak}

case Key_Left:{ad.x=0ad.y=-1flag=1DirectionKey=Keybreak}

case Key_Right:{ad.x=0ad.y=1flag=1DirectionKey=Keybreak}

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=0i<10i++)

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

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+1>MAX) MissionNum=1

else MissionNum++

InitMission(MissionNum)

setbkcolor(BKCOLOR)

cleardevice()

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

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

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=0i<STEPMAXi++)

{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]-=1InitPic(map[p.x][p.y],p.x,p.y)

p.x=p.x+a.xp.y=p.y+a.y

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

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]-=1map[p.x+a.x][p.y+a.y]=1map[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.xp.y=p.y+a.yflag=1BoxMove[i]=1}

else flag=0

break}

case 3:flag=0break

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

p.x=p.x+a.xp.y=p.y+a.y

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

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]-=1map[p.x+a.x][p.y+a.y]=5map[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.xp.y=p.y+a.yflag=1BoxMove[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=0n<4n++)

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=0i<STARNUMi++)

{

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=0i<STARNUMi++)

{

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-old<TIMEINT) return 0

else

{

old=tmreturn 1

}

}

int JudgeWin()

{

int n=0,i,j

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

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

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

if(n==BoxNum) return 1

else return 0

}

void InitMission1() /*第九关*/

{

int i,j

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

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

map[i][j]=0

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

map[0][i]=3

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

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

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

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

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

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

map[2][i]=2

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

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

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

map[4][4]=4

p.x=3p.y=5

map[3][5]=1

BoxNum=5

}

void InitMission2()

{

int i,j

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

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

map[i][j]=0

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

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

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

{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=1p.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=0i<MAXi++)

{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=0i<MAXi++)

{

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

r[i].second=0

gettime(&r[i].t)

getdate(&r[i].d)

}

for(i=0i<MAXi++)

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=1ad.y=0MoveBack(ad)break}

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

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

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

}

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

}

}

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

{

int i=(StepNum-1)%STEPMAX

if(BoxMove[i]==0)

{

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

p.x=p.x+a.xp.y=p.y+a.y

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

}

else if(BoxMove[i]==1)

{

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

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

p.x=p.x+a.xp.y=p.y+a.y

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

}

}

说到小程序游戏,让我第一个想到的就是微信面的小程序里的游戏,当我无聊的时候,就会拿起手中的手机,点开微信,在点开小程序,里面有超多好玩的小游戏。有了小程序游戏,就不怕无聊了。在这里,和大家来分享哪些小程序游戏值得玩一玩。

第一款小游戏:欢乐球球。这个游戏,我已经玩到了8530,看到这个结果之后,我自己都惊呆了,在微信排名的最顶端。这款游戏,真的超级超级解压,每词玩这个小程序游戏的时候,脑袋瓜里面想的就是要比上次玩的更好。不过,玩久了眼睛真的很累,拿手机久了,手真的很酸,最后看到游戏有了突破,又非常的开心。这个游戏成绩可以一直保持,不会过期。

第二款游戏:跳一跳。这款游戏,刚开始玩的时候,老是掉了在坑里面,每次玩的时候, 都是集中注意的在玩,我在想,我当初考试的时候,都还没这么专注呢。这个游戏很好玩,但是不好的就是,成绩只保留一个星期内,过了星期天,又重头开始了。

第三款游戏:异世恋歌。是一款画风少女漫画液弊情的小游戏,进去是一个魔法世界,有不同的人物展示,然后会跟你一一对话,并且设置情节的发展。这款小程序游戏,推荐年龄较小的小姑娘玩特别的合适。

第四款游戏:热狗快跑。这款游戏也是玩到不想听袭来的那种,但是要记得要控制好方向,不然就伏正会掉下去的哦。

第五款游戏:再见吧渣男。这款游戏简直太好玩、太过瘾了。通过各个场景找出男友出轨的证据,然后进缺埋悔行惩罚他,惩罚的时候真的太过瘾了。有些感情失败的妹子,可以玩玩这个游戏,或许可以帮助你走出不开心的日子。


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

原文地址: http://outofmemory.cn/yw/12507129.html

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

发表评论

登录后才能评论

评论列表(0条)

保存