500行C语言程序_第1页
500行C语言程序_第2页
500行C语言程序_第3页
500行C语言程序_第4页
500行C语言程序_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一 、 题目阐述:通过本学期对C语言的学习,对程序编译有了初步的了解,并运用了各种函数(如文件包含,宏定义,结构体,函数调用等)编写了这个推箱子游戏。二 、 设计思路: 程序中“3”代表墙壁,“2”代表箱子,“4”代表目的地,“0”代表空,“5”代表人+目的地,“ 1“ 代表人,“6“代表箱子+目的地,用“Enter”键选择关数,按“p“键可以毁步,但最多只能毁5次。通过上下左右键实现箱子的上下左右移动,在可移动的范围内,推送到目的地。在推动的过程中若彻底失败,便按r键重新启动游戏。三、主要解决问题的方法及技术关键1、 主要问题及解决方法函数的定义及调用光标的定位设置处理问题光标的定位设置处理

2、是通过void gotoxy(int x,int y)函数实现的。定位设置手段是通过型参x、y获取定位点,应用int86的中断调用完成光标定位。 数组函数,switch,if语句,for循环语句的应用2、 技术关键光标定位C语言中循环语句的使用 C语言绘图及定义函数的使用Input name();Char;Printf(“nnPlease input your name”)C=getchar();C!=y&c!=y&c!C!=y&c!=yintgd=DETECT,gm;Judgeide();Key!=key-EnterCASEKey=bio=key(0);bio=key(1)IFSetbkco

3、lor(BKCOLOR);Idc=0Idc=1Game();break;ViewRecord();bio=keyIdc=2DeleteRecord=();bio=keyIdc=3exit(0);Key=Key_EnterInti,I,flog;NextMission();time(&t1);break;flag=1Flog=0;1IFIFThe end.四: 程序清单:#define MAX 2 /*游戏中总关数*/#define STARTX 180#define STARTY 80#define BKCOLOR BLACK#define MANCOLOR RED#define OBJECT

4、COLOR YELLOW#define TIMEINT 2#define STARNUM 300#define STEPMAX 5#include#include#include#include#include#include#include#include#include#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 Ke

5、y_Left 0x4b00typedef struct starint x;int y;int c;Star;Star sSTARNUM;typedef struct recordchar name20;int second;struct time t;struct date d;Record;Record rMAX;typedef struct cint x;int y;Add;typedef struct aint x;int y;Player;Player p;char name20; /*进入游戏时记录玩家的姓名*/time_t t1,t2; /*游戏结束时的时间*/int Ide;

6、/*开始进入游戏时,选择菜单时返的功能号(1,2,3)*/int MissionNum; /*玩家正在玩的关数*/int BoxNum; /*目的地的个数*/int Key; /*玩家按键*/int map1010; /*地图.(空=0),(人=1),(箱子=2),(墙=3),(目的地=4),(人+目的地=5),(箱子+目的地=6)*/int StepNum;int DirectionKey; /*用来表示方向键最后一次按键*/int BoxMoveSTEPMAX;int StepSTEPMAX;/*函数定义*/void InputName();void Init();void MainMen

7、u();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 )

8、;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.

9、start game 2.view records 3.delete records 4.exit game)*/void InputName()char c;clrscr(); do printf(nnPlease 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,c:tc);vo

10、id 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() Change

11、Star(); /*改变背景*/ 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;NextMissi

12、on();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

13、=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;jMAX) MissionNum=1

14、;else MissionNum+;InitMission(MissionNum);setbkcolor(BKCOLOR);cleardevice();for(i=0;i10;i+) for(j=0;j10;j+) InitPic(mapij,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+) Stepi=BoxMovei=0;StepNum=0;int Move(A

15、dd a)int flag;int i=StepNum%STEPMAX;switch(mapp.x+a.xp.y+a.y) case 0:mapp.xp.y-=1;InitPic(mapp.xp.y,p.x,p.y); p.x=p.x+a.x;p.y=p.y+a.y; mapp.xp.y+=1;InitPic(mapp.xp.y,p.x,p.y);flag=1;break; case 2:if(mapp.x+2*a.xp.y+2*a.y=0|mapp.x+2*a.xp.y+2*a.y=4) mapp.xp.y-=1;mapp.x+a.xp.y+a.y=1;mapp.x+2*a.xp.y+2*a

16、.y+=2; InitPic(mapp.xp.y,p.x,p.y); InitPic(mapp.x+a.xp.y+a.y,p.x+a.x,p.y+a.y); InitPic(mapp.x+2*a.xp.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;BoxMovei=1; else flag=0; break; case 3:flag=0;break; case 4:mapp.xp.y-=1;InitPic(mapp.xp.y,p.x,p.y); p.x=p.x+a.x;p.y=p.y+a.y; mapp.xp.y+=1

17、;InitPic(mapp.xp.y,p.x,p.y);flag=1;break; case 6:if(mapp.x+2*a.xp.y+2*a.y=0|mapp.x+2*a.xp.y+2*a.y=4) mapp.xp.y-=1;mapp.x+a.xp.y+a.y=5;mapp.x+2*a.xp.y+2*a.y+=2; InitPic(mapp.xp.y,p.x,p.y); InitPic(mapp.x+a.xp.y+a.y,p.x+a.x,p.y+a.y); InitPic(mapp.x+2*a.xp.y+2*a.y,p.x+2*a.x,p.y+2*a.y); p.x=p.x+a.x;p.y=

18、p.y+a.y;flag=1;BoxMovei=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-

19、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

20、,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

21、 *s4=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,sn);setcolor(RED);outtextxy(250,170+j*20,sj);void DrawStar()int w,h,i,dotx,doty,color,maxcolor;w=getmaxx();h=getmaxy();maxcolor=getmaxcolor();for(i=0;iSTARNUM;i+) si

22、.x=1+random(w-1); si.y=1+random(h-1); si.c=random(maxcolor); putpixel(si.x,si.y,si.c); void ChangeStar()int i,maxcolor;maxcolor=getmaxcolor();for(i=0;iSTARNUM;i+) si.c=random(maxcolor); putpixel(si.x,si.y,si.c); int TimeCome() static long tm, old; tm=biostime(0,tm); if(tm-oldTIMEINT) return 0; else

23、old=tm; return 1; int JudgeWin()int n=0,i,j;for(i=0;i10;i+) for(j=0;j10;j+) if(mapij=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+) mapij=0;for(i=0;i=5;i+) map0i=3;for(i=5;i=7;i+) map2i=mapi-11=3;for(i=1;i=4;i+) map6i=map5i+3=mapi0=3;map3

24、7=map47=map15=3;for(i=2;i=4;i+) map2i=2;map34=map45=2;for(i=2;i=3;i+) map3i=map4i=4;map44=4;p.x=3;p.y=5;map35=1;BoxNum=5;void InitMission2()int i,j;for(i=0;i10;i+) for(j=0;j10;j+) mapij=0;for(i=1;i=5;i+) map0i=map6i=3;for(i=2;i=4;i+) map1i+3=mapi7=mapi+25=mapi0=3;map11=map21=map50=map55=map46=map60=

25、3;map24=map33=map42=map43=2;map23=map32=map34=map44=4;p.x=1;p.y=3;map13=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(ntttRecord Informationn);printf(Record-holder Achieveme

26、nt(s)t Time(h:m:s)ttDate(y/m/d);for(i=0;iMAX;i+) fseek(fp,i*sizeof(Record),0); fread(&ri,sizeof(Record),1,fp); printf(n%-10st%dtt %02d:%02d:%02dtt%02d/%02d/%02d,,ri.second,ri.t.ti_hour,ri.t.ti_min,ri.t.ti_sec,ri.d.da_year,ri.d.da_mon,ri.d.da_day);fclose(fp);gotoxy(10,25);printf(Press any key

27、to return mainmenu.);void DeleteRecords()int i;FILE *fp;fp=fopen(record,w);for(i=0;iMAX;i+) strcpy(,nameless); ri.second=0; gettime(&ri.t); getdate(&ri.d); for(i=0;iMAX;i+) fwrite(&ri,sizeof(Record),1,fp);fclose(fp);void JudgeRecord()int i=MissionNum-1;time(&t2);if(ri.second=0|difftime(t2,t1)

28、ri.second) gotoxy(10,3);printf(ttYou have broken the record); ri.second=difftime(t2,t1); strcpy(,name); gettime(&ri.t); getdate(&ri.d); WriteRecord(); else gotoxy(10,3);printf(ttYou have pass this mission);gotoxy(10,4);printf(ttpress any key continue.);getch();getch();void WriteRecord()FILE *fp;int i=MissionNum-1;fp=fopen(record,rt+);fseek(fp,i*sizeof(Record),0);fwrite(&rMissionNum-1,sizeof(Record),1,fp);fc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论