吃金豆pacmanTC版_第1页
吃金豆pacmanTC版_第2页
吃金豆pacmanTC版_第3页
吃金豆pacmanTC版_第4页
吃金豆pacmanTC版_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、实训报告实训题目: 吃金豆游戏程序设计 院 系: 计算机科学与工程学院 专 业: 软件工程 班级: 0922131 学 号: 092213101 姓 名: 陈诚 指导教师: 周荣 实训地点: N6-109 开课时间: 2013 至 2014 学年第 二 学期常熟理工学院计算机科学与工程学院 制学生姓名 实训报告成绩 评语: 指导教师(签名) 年 月 日说明:指导教师评分后,实训报告交院办公室保存。目录1. 实训的目的和任务.12. 开发环境.12.1 硬件环境.12.2 软件环境.13. PAC Man 游戏分析.23.1需求分析.23.2界面分析.23.3功能实现分析.34. PAC Man

2、设计.34.1界面功能设计.34.2地图设计.54.3 PAC Man移动设计.54.4魔鬼移动设计.65. 程序流程.76. 总结.97. 附录-源程序.101. 实训的目的和任务 1.1目的: 1:巩固C语言基础,提高C语言编程能力。 2:学习C语言图形函数,并灵活运用这些函数编写游戏、 3:学会使用TC编译器,在TC上运用所学函数实现所需图形。 4:通过游戏使得编程思路有所提高。 5:提高编写报告的的能力。 1.2 任务: 编写吃金豆游戏pac man,pac man 是一个小人不停的吃金豆的游戏,在吃的过程中, 要躲避魔鬼,不能与魔鬼相撞,如果在吃完金豆前与魔鬼相撞,游戏结束,否则玩家

3、赢了,并且通过此关,并且都会显示玩家分数。2.开发环境2.1硬件环境: 电脑Pc机2.2软件环境: 编译器:TC 语言:C语言3. PAC Man 游戏分析3.1:需求分析 吃金豆游戏是用TC编译器编写的程序,所以所有的图像都是通过函数给画出来的,因此如果需要画出特定的图像,一些函数就得熟练运用,在pac man游戏中所需要的主要函数有:函数名作用initgraph初始化图形函数Cleardevice图像清屏函数Setcolor设置颜色circle画园函数setfillstyle设置填充图形的模式settextstyle设置字体的模式rectangle画方形函数Outtextxy,图形模式输出

4、sector画椭圆函数 pieslice画扇形函数floodfill填充封闭图形函数 在吃金豆游戏中,需要从文件中读取地图,在屏幕中显示其地图,通过文件中的0,1和2数字生成金豆,墙,魔鬼,魔鬼是通过电脑随机生成的,而他的移动方向也是随机生成的,而吃金豆的小人是通过玩家通过键盘按上下左右键移动,遇到墙则停止,遇到金豆吃了金豆,当吃完全部金豆则通过当前关卡,通过当前关卡则可以下一关卡,否则不可进行下一关卡,而撞到魔鬼则结束游戏。3.2:界面分析 游戏界面由菜单界面,游戏界面,输赢界面,退出界面4个界面组成,通过这些界面可以使玩家简单的操作游戏,使得游戏更加的美观简洁。菜单界面:玩家进入游戏的初始

5、界面,可以通过此界面选择不同的关卡,由于地图不同,游戏难度也不同,因此玩家必须通过前面的地图,才可以挑战后面的地图。游戏界面:玩家玩游戏时的界面,包括地图,pacman,金豆,魔鬼,玩家移动paman和电脑随机移动魔鬼都显示在此界面中。输赢界面:当玩家吃完金豆与撞到魔鬼时所跳出的界面,通过判断玩家的输赢来进行显示不同的界面。退出界面:当玩家退出游戏时跳出的界面,程序会在询问是否退出,如果玩家依然选择退出,则程序退出,否则返回菜单界面。3.3:功能实现分析 Pacman游戏的游戏背景是从文件中读取字符,并且使其中的字符对应一个一个的墙,用图形 来表示墙,用来表示其中的pacman,用来表示魔鬼,

6、用表示其中的金豆,游戏如果结束也就两种情况,玩家将金豆全部吃完了,也就胜利了,另外就是撞上魔鬼了,则失败了。4. PacMan 设计 4.1:界面功能设计 吃金豆中游戏设计了3个地图,所以在菜单界面中有3个选项,可以选择其中的一个地图进行游戏,初始时是选择第一个地图,即第一个模式,当你选择某个模式时,被选中的模式就会为红色的字体,并且下面会出现你所选择的模式,以便玩家看清自己选择的模式,并且如果玩家没有通过当前所选关卡的前面关卡,当前关卡不可玩,会出现提示信息。 图(1) 退出界面是在菜单界面按ESC退出时所出现的界面,如果继续选择退出,程序会继续退出,否则返回菜单界面,如图(2)。 图(2)

7、 输赢界面是通过pacman是否撞到魔鬼和吃完金豆来判断的,如果吃完所有的豆子,则出现图(4),而撞上魔鬼就会出现图(3),而后可以通过选择是否继续当前关卡还是返回菜单界面选择其他模式。如果玩家通过当前关卡,即出现图(4)界面,则玩家就解锁了下一关卡,可以玩下一关,以此类推,提高了游戏的新颖性。 图(3) 图(4) 这些界面的实现都是通过TC中的画图函数来解决,虽然界面简单,没有更高级的功能,但胜在方便,快捷,使玩家更容易上手,能够熟练的操作游戏。 4.2地图设计 本款游戏设计中有3个地图,存放在文件中,由于游戏设计中规定赢得当前关才可以继续下一关,所以设计中的地图是由简入难的。char tu

8、1330="c:wartu1.txt", "c:wartu2.txt",打开地图地址 "c:wartu3.txt",ab320= "MAP1 model", "MAP2 model",选择的种模式"MAP3 model" setcolor(BLUE); rectangle(x0,y0,x1,y1); setfillstyle(3,BLUE); 画出围墙 floodfill(x0+1,y0+1,BLUE); setcolor(14); circle(x0,y0,5); 画出金豆

9、 setfillstyle(1,14); floodfill(x0+1,y0+1,14); 文件中的地图玩全是由,所组成,代表着墙,代表着空地,则代表着金豆,文件中存在×的数组,这当打开文件后,每次打开一个文件都会将文件中的数据都保存到数组tu25050中,程序也通过这个数组判断是否结束和。4.3 PAC Man移动设计 Pac Man开始出现的位置为第一个金豆出现的位置,默认的一开始行走的方向为向右,遇到围墙则停止运动,直到玩家按下别的方向键,Pacman才开始继续按玩家的思想运行,因此pacman是通过玩家控制其方向的,在行走过程中,要边吃金豆还要躲避魔鬼,不能与魔鬼相撞,否则游

10、戏结束。 setcolor(RED); setfillstyle(1,RED); circle(a,b,9); floodfill(a+1,b+1,RED); setcolor(0); setfillstyle(1,0); pieslice(a,b,x0,y0,10); 画出pacman floodfill(a,b,0); setcolor(14); setfillstyle(1,14); circle(x1,y1,1.5); floodfill(x1,y1,14); PacMan在移动的过程中,是以a,b,c,d这4个变量来控制其的运动的,在tc中,使得一个物体具有移动效果,就得将原来的地址

11、寄存下来,在新的地方画出所需图像,并且擦除原先图形所在地方的图像,pacman也是如此移动,a,b是新的移动地址,c,d是原先的地址,在a,b处画出pacman,c,d处擦除原来的pacman,形成了pacman的动态效果,而变量key是记录从键盘接收的方向,这个方向不仅是pacman移动的方向,也是pacman嘴的方向,使其图形看起来更美观。 接收方向键:key=bioskey(0); 延迟时间: delay(10000); Pacman移动函数:move2(key); 4.4魔鬼移动设计魔鬼是在空白地随机生成的3个魔鬼,是pacman中的障碍部分,如果pacman撞上魔鬼,则会gameov

12、er。在初始化中魔鬼是用椭圆型和圆形这个工具画的,这3个魔鬼的位置保存在数组mst32中,每次魔鬼移动,数组中的值也会随之而改变, ,由于是3个魔鬼,所以移动魔鬼是采用循环,循环3次,每次都移动魔鬼,并且将魔鬼的地址保存到数组中。 for(q=0;q<3;q+) xn=xm=mst1q0;yn=ym=mst1q1;move3(); 移动魔鬼的3次循环mst1q0=xm;mst1q1=ym;移动魔鬼函数: movemaster()画魔鬼函数:drawmaster()随机生成方向是得魔鬼移动:move3()追踪魔鬼:adress()为了怎加游戏的难度,不仅出现了3个鬼,而且使得魔鬼出现简单的

13、追踪功能,当pacman与魔鬼出现在同一行或同一列时,魔鬼就会自动往pacman的那个方向靠拢,使得游戏更加具有难度。 if(i=k) if(j<m) return 1; if(j>m)return 2;根据 pacman判断魔鬼的移动方向 if(j=m) if(i>k) return 4; if(i<k) return 3; return f;5. 程序流程 在运行程序是,会出现一个菜单界面,当玩家选择的关卡已经解锁时,玩家可以任选一个关卡进行游戏,否则玩家这可以从第一关开始,否则会跳出提示信息,当玩家选好关卡时,程序会根据所选关卡打开相应的地图,随后当玩家没有键入方

14、向值时,pacman会根据初始的方向进行运动,而魔鬼也会在随后跟据随机生成的方向在地图中行走,其后根据相应的判段是否gameover或者win,跳出提示让玩家选择结束或者继续当前关卡。 退出游戏 是 否菜单界面选择关卡模式 所选关 卡未解锁退出 游戏 打开地图文件绘制地图 随机生成3个魔鬼和一个pacman pacman 移动的方向 接收键盘传来的方向字符是否键入数值 是 否移动魔鬼移动pacman 判断pacman所运动的下一地方是否为墙判断pacman是否与魔鬼相撞判断pacman是否吃完所有金豆 WinBack 分数 AgainGameover6. 总结 这一次的程序设计是一个吃金豆pa

15、cman的游戏,通过自己的不懈努力终于完善,包括其中的界面,移动思路,pacman,金豆,魔鬼的画图,其中的一些画图函数也通过多种路径解决了,使得自己对图形函数更加的理解与运用,并且TC编译器现在也能灵活运用,能够利用TC编译器和其中的函数画出所需要的图形,使得图像更加的美观。尽管这个程序存在着很多不足,但其功能全面、容易理解、界面友好、操作方便、效率高等优点是本游戏所必需的。通过开发吃金豆这个游戏,我掌握了许多图形界面所需的函数,用到的知识巩固了我组对C语言的学习,但在这次设计中的最大收获并不是掌握这些画图函数,而是学会了设计系统的思维方法。6.附录源程序#include<graphi

16、cs.h>#include <stdio.h>#define UP 0x4800#define DOWN 0x5000#define LEFT 0x4b00#define RIGHT 0x4d00#define ESC 0x11b#define ENTER 7181int du=1,level,q,color4=1,2,3,4,a,b,c,d,mst132,xm,ym,xn,yn,k=0,score3;char tu1330="c:wartu1.txt", "c:wartu2.txt", "c:wartu3.txt"

17、, tu25050, ab320= "MAP1 model", "MAP2 model", "MAP3 model"void init()/* chu shi hua*/ int gdriver,gmode,maxX,maxY; gdriver = DETECT; initgraph(&gdriver,&gmode,"c:tc20bgi");int back() int i,j=0,key; char a10; sprintf(a,"%d",scorek); setcolor(1

18、5);settextstyle(0,0,3);outtextxy(250,170,"Model");outtextxy(140,200,abk);outtextxy(170,270,"YOU Score:");outtextxy(400,270,a); setcolor(15); setfillstyle(1,15); rectangle(150,380,300,420); floodfill(151,381,15); setfillstyle(1,15); rectangle(350,380,480,420); floodfill(351,383,15

19、); setcolor(BLACK); settextstyle(1,0,3); outtextxy(200,390,"Again"); outtextxy(400,390,"Back");setcolor(RED);rectangle(150,380,300,420);outtextxy(200,390,"Again"); while(1) key=bioskey(0); switch(key) case LEFT :j+;break; case RIGHT:j-;break; if(j>1) j=0; if(i<0)

20、j=1; if(key=ENTER) break; if(j=0)setcolor(RED); rectangle(150,380,300,420); outtextxy(200,390,"Again"); setcolor(BLACK); rectangle(350,380,480,420); outtextxy(400,390,"Back"); else setcolor(BLACK); rectangle(150,380,300,420); outtextxy(200,390,"Again"); setcolor(RED); r

21、ectangle(350,380,480,420); outtextxy(400,390,"Back"); return j;int Gameover() int t,i; cleardevice(); setcolor(7); rectangle(120,15,500,475);setfillstyle(1,7); floodfill(121,16,7);settextstyle(0, 0, 5); setcolor(7);outtextxy(130, 60, "GAME OVER"); setcolor(RED);outtextxy(133, 63,

22、 "GAME OVER"); t=back(); return t;int win() int t; cleardevice(); setcolor(7); rectangle(120,15,500,475);setfillstyle(1,7); floodfill(121,16,7);settextstyle(0, 0, 5); setcolor(7);outtextxy(130, 60, " YOU WIN"); setcolor(RED);outtextxy(133, 63, " YOU WIN"); level=k+1; t=

23、back(); return t; void opwar()/*da kai di tu*/ FILE *fp; int i=0,j=0,t; fp=fopen(tu1k,"r");for(i=0;i<20;i+)for(j=0;j<20;j+) fscanf(fp,"%c",&tu2ij); fscanf(fp,"%c",&t);fclose(fp);void drawwar() int i,j,x0,y0,x1,y1,m=0; for(i=0;i<20;i+)for(j=0;j<20;j+)

24、 if(tu2ij='1') x0=55+j*25;y0=55+i*20;x1=x0+25-1;y1=y0+20-1; setcolor(BLUE); rectangle(x0,y0,x1,y1); setfillstyle(3,BLUE); floodfill(x0+1,y0+1,BLUE); else if(tu2ij='0') x0=55+j*25+10; y0=55+i*20+10; if(m=0) a=x0,b=y0,m=1,tu2ij=2; setcolor(14); circle(x0,y0,5); setfillstyle(1,14); floo

25、dfill(x0+1,y0+1,14); for(i=0;i<3;i+) x0=rand()%20+1; y0=rand()%20+1; if(tu2x0y0!='2') i-;continue; mst1i0=65+y0*25; mst1i1=74+x0*20; for(j=0;j<i;j+) if(mst1i0=mst1j0&&mst1i1=mst1j1) i-;continue; if(mst1i0=a&&mst1i1=b) i-;continue; void move2(int koy) int i,j,x0,y0,x1,y1

26、; setcolor(BLACK); setfillstyle(1,BLACK); circle(c,d,9); floodfill(c+5,d-2,BLACK); circle(c,d,9); floodfill(c-5,d-3,0); switch(koy) case LEFT:x0=180;y0=210;x1=a-5;y1=b-4;break; case RIGHT:x0=330;y0=360;x1=a+3,y1=b-3;break; case UP:x0=75;y0=105; x1=a-5;y1=b-3;break; case DOWN:x0=245;y0=285;x1=a-6;y1=

27、b+2;break; setcolor(RED); setfillstyle(1,RED); circle(a,b,9); floodfill(a+1,b+1,RED); j=(a-55)/25; i=(b-55)/20; if(tu2ij='0') scorek+=10;tu2ij=2; setcolor(0); setfillstyle(1,0); pieslice(a,b,x0,y0,10); floodfill(a,b,0); setcolor(14); setfillstyle(1,14); circle(x1,y1,1.5); floodfill(x1,y1,14)

28、;int stop(int a,int b) int i,j; j=(a-55)/25; i=(b-55)/20; if(tu2ij='1') return 1; else return 0;void movemaster(int koy) int i,j; setcolor(BLACK); setfillstyle(1,BLACK); sector(xn,yn,0,180,9,18); floodfill(xn+5,yn-2,BLACK); setcolor(colorq); setfillstyle(1,colorq); sector(xm,ym,0,180,9,18);

29、floodfill(xm,ym,colorq); setcolor(0); setfillstyle(1,0); circle(xm-4,ym-10,2); floodfill(xm-4,ym-10,0); circle(xm+4,ym-10,2); floodfill(xm+4,ym-10,0); for(i=0;i<6;i+) sector(xm-10+i*4,ym,0,180,1,2); floodfill(xm-10+i*4,ym,0); setcolor(15); setfillstyle(1,15); circle(xm-4,ym-9,1); floodfill(xm-4,y

30、m-9,15); circle(xm+4,ym-9,1); floodfill(xm+4,ym-9,15); i=(yn-9-55)/20;j=(xn-55)/25; if(tu2ij='0') setcolor(14); circle(xn,yn-9,5); setfillstyle(1,14); floodfill(xn+1,yn-8,14); int adress(int i,int j,int k,int m) int f=0; if(i=k) if(j<m) return 1; if(j>m) return 2; if(j=m) if(i>k) re

31、turn 4; if(i<k) return 3; return f;int touch1()int i,f=1,j;for(i=0;i<20;i+) for(j=0;j<20;j+) if(tu2ij='0')f=0;break; return f;void move3() int i,f=1,j,k,m,kiy; i=(d-55)/20; j=(c-55)/25; k=(yn-74)/20; m=(xn-65)/25; f=adress(i,j,k,m); if(f=0&&du%5!=0) AB:f=rand()%4+1; else du+

32、; switch(f) case 1:kiy=LEFT; xm-=25; break; case 2:kiy=RIGHT;xm+=25;break; case 3:kiy=UP; ym-=20;break; case 4:kiy=DOWN; ym+=20;break; if(stop(xm,ym)=1) xm=xn;ym=yn; goto AB; movemaster(kiy);delay(200);void drawmaster() int i,j,m,n; setcolor(5); setfillstyle(1,5); sector(xm,ym,0,180,9,18); floodfill

33、(xm,ym,5); setcolor(0); setfillstyle(1,0); circle(xm-4,ym-10,2); floodfill(xm-4,ym-10,0); circle(xm+4,ym-10,2); floodfill(xm+4,ym-10,0); for(i=0;i<6;i+) sector(xm-10+i*4,ym,0,180,1,2); floodfill(xm-10+i*4,ym,0); setcolor(15); setfillstyle(1,15); circle(xm-4,ym-9,1); floodfill(xm-4,ym-9,15); circl

34、e(xm+4,ym-9,1); floodfill(xm+4,ym-9,15);int touch()int t,i1,j1,i2,j2,m1,n1,m2,n2;i1=(d-65)/20;j1=(c-65)/25;i2=(b-65)/20;j2=(a-65)/25; m1=(ym-74)/20; n1=(xm-65)/25; m2=(yn-74)/20; n2=(xn-65)/25; if(i1=m1|m1=i2)&&(j2=n1|n1=j1)|(i1=m2|m2=i2)&&(j2=n2|n2=j1) return 1; return 0;void move()

35、 int key=RIGHT,i; scorek=0; CD:cleardevice(); opwar(); drawwar(); setcolor(RED); setfillstyle(1,RED); circle(a,b,9); floodfill(a+1,b+1,RED); ym=ym+9; fflush(stdin); while(1)AB:while(!kbhit() c=a,d=b; switch(key) case UP:b=b-20;break; case DOWN:b=b+20;break; case LEFT:a=a-25;break; case RIGHT:a=a+25;

36、break; for(q=0;q<3;q+) xn=xm=mst1q0;yn=ym=mst1q1;move3();mst1q0=xm;mst1q1=ym; if(touch()=1) if(Gameover()=0) goto CD; else getch(); key=ESC; goto EF; if(touch1()=1) if(win()=0) goto CD; else getch(); key=ESC; goto EF; if(stop(a,b)=1) a=c,b=d; goto AB; move2(key);delay(100); key=bioskey(0);EF: if(

37、key=ESC) break; void point() char lev10; fflush(stdin); sprintf(lev,"%d",level+2); setcolor(15); settextstyle(3,0,2) ; outtextxy(131,371,"YOU Only Choose Less Than Level"); outtextxy(426,371,lev); setcolor(RED); settextstyle(3,0,2) ; outtextxy(130,370,"YOU Only Choose Less T

38、han Level"); outtextxy(425,370,lev); getch();int tuichu() int key,i=0; setcolor(15); settextstyle(1,0,3); outtextxy(225,160,ab0); outtextxy(225,230,ab1); outtextxy(225,300,ab2); setcolor(15); setfillstyle(1,15); rectangle(130,170,490,270); floodfill(151,171,15); setcolor(7); setfillstyle(1,7);

39、rectangle(130,270,490,320); floodfill(131,271,7); settextstyle(1,0,4); setcolor(RED); outtextxy(151,200,"Do You Want To Exit"); setcolor(15); setfillstyle(1,15); rectangle(135,275,300,315); floodfill(141,290,15); setfillstyle(1,15); rectangle(310,275,480,315); floodfill(321,290,15); setcol

40、or(BLACK); settextstyle(1,0,3); outtextxy(200,280,"YES"); outtextxy(380,280,"NO"); setcolor(RED); rectangle(135,275,300,315); outtextxy(200,280,"YES"); while(1) key=bioskey(0); switch(key) case LEFT :i+;break; case RIGHT:i-;break; if(i>1) i=0; if(i<0) i=1; if(key=

41、ENTER) break; if(i=0)setcolor(RED); rectangle(135,275,300,315); outtextxy(200,280,"YES"); setcolor(BLACK); rectangle(310,275,480,315); outtextxy(380,280,"NO"); else setcolor(BLACK); rectangle(135,275,300,315); outtextxy(200,280,"YES"); setcolor(RED); rectangle(310,275,480,315); outtextxy(380,280,"NO"); return i;void man_i() int x1,x2,y1,y2,key,j,i=0; AB:i=0;k=0;scorek=0; cleardevice(); setcolor(15); setfillstyle(1,15); rectangle(120,40,500,460); rectangle(121,41,501,461); rectangle(119,39,499,459); settextstyl

温馨提示

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

评论

0/150

提交评论