《500行C语言程序.doc》由会员分享,可在线阅读,更多相关《500行C语言程序.doc(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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)IFSetbkc
3、olor(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 OBJEC
4、TCOLOR 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 K
5、ey_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 MainMe
7、nu();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);v
10、oid 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() Chang
11、eStar(); /*改变背景*/ 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;NextMiss
12、ion();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;fla
13、g=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=
14、1;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(
15、Add 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*
16、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=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+=
17、1;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*
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;cha
21、r *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+) s
22、i.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;map
24、37=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 Achievem
26、ent(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.name,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(ri.name,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(ri.name,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
29、*fp;int i=MissionNum-1;fp=fopen(record,rt+);fseek(fp,i*sizeof(Record),0);fwrite(&rMissionNum-1,sizeof(Record),1,fp);fclose(fp);void RegisterStep()int i;StepNum+;i=(StepNum-1)%STEPMAX;Stepi=DirectionKey;void ReverselyMove()int i;Add ad;i=(StepNum-1)%STEPMAX;if(Stepi=0) return;else switch(Stepi) case
30、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-;Stepi=0;BoxMovei=0; void MoveBack(Add a) /*一定可以移动*/int i=(StepNum-1)%STEPMAX;if(BoxMovei=0) mapp.xp.y-=
31、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); else if(BoxMovei=1) mapp.x-a.xp.y-a.y-=2;InitPic(mapp.x-a.xp.y-a.y,p.x-a.x,p.y-a.y); 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); 五 设计结果说明1、 设计优点:本程序在TC2.0下运行成功,这个程序的可根据读者意愿通过改变程序中的某个函数得以实现,程序中运用了大量常用C程序循环系统,条件语句,对本学期所学知识有了很好的实践锻炼,同时操作者的兴趣可以增加箱子的数量完成大规模的游戏程序。2、 设计不足:游戏的规模小,不能足以满足操作者。程序中结构不是很清晰,给读者带来杂乱的感觉。
限制150内