092213112 刘泽中
3.6.5 退出程序流程图 (略)
4.程序详细分析
4.1 部分函数功能描述
4.1.1 void init();/*用于图形模式初始化*/
4.1.2 void initPacman(Face *face,int r,int c,int size,int x0,int y0)
/*pacman的一些初始值设置(坐标,初始位置,大小等)*/
4.1.3 void initMonster(Monster *monster,int x,int y,enum Direction dir)
/*Monster的一些初始设置(坐标,运动方向)*/
4.1.4 void drawBlock(int i,int j)/*用于画整个地图盘面*/ 4.1.5 void drawBall(int i,int j)/*用于画地图上的金豆*/ 4.1.6 void drawWall(int i,int j) /*画地图中的墙*/
4.1.7 void drawGame()/*调用上面三个函数,完成整个地图的绘制*/ 4.1.8 void drawPacman(Face *face)/*画主角Pacman*/
4.1.9 void drawmonster(int i,int j,int color)/*画第二男主角Monster*/ 4.1.10 void delays()/*设置延时,用于处理动画效果,易修改*/ 4.1.11 void drawCaidan()/*用于绘画选择关卡里面的提示菜单界面*/ 4.1.12 void moveFace(Face *face)/*移动第一男主角Pacman*/
4.1.13 void moveMonster(Monster *monster)/*移动第二男主角Monster*/ 4.1.14 void clearFace(int i,int j)/*清除第一男主角Pacman的图案*/ 4.1.15 void clearMonster(int i,int j) /*清除第二男主角Monster的图案*/ 4.1.16 void changeDir(Face *face,enum Direction dir)/*调整Pacman运动方向*/ 4.1.17 void srandMonster(Monster *monster)/*为Monster随机产生一个方向*/ 4.1.18 void Win()/*显示赢了的画面并输出分数*/ 4.1.19 void gameOver()/*显示输了的画面并输出分数*/ 4.1.20 void DoError()/*输了的声音*/ 4.1.21 void DoWin()/*赢了的声音*/
4.1.22 void DoOK()/*第一男主角Pacman改变一次方向的声音*/ 4.1.23 void gamePlay()/*整个游戏的主要核心函数*/ 4.1.24 void showLevel()/*在屏幕上输出第几关的函数*/
常熟理工学院
4.1.25 void loadLevel()/*读取相应等级的地图函数*/
4.1.26 void Help()/*选择关卡里面F8键对应产生的帮助信息*/ 4.1.27 void softHighscore()/*排行榜的显示*/ 4.1.28 void chooseKard()/*选择关卡主界面*/
4.1.29 void showMenu()/*程序运行开始前显示五彩的游戏名称Pacman*/ 4.1.30 void Menu()/*游戏的主菜单*/
4.1.31 int main()/*主函数用于调用init及Menu来实现整个程序的运转*/
4.2 结构体的定义
4.2.1 Pacman的定义: typedef struct{
int r,c;
int startX,startY; int isLive;
enum Direction dir;
}Face;/*定义Pacman,成员包括坐标,起始位置,死活的标志以及运动方向*/ 4.2.2 Monster的定义: typedef struct{ int x; int y;
enum Direction dir;
}Monster; /*定义Monster,成员包括坐标,运动方向*/
4.3部分函数源码分析
4.3.1 图形模式初始化函数
void init(){ int gdriver,gmode; gdriver=DETECT;
initgraph(&gdriver,&gmode,\ cleardevice();/*清屏*/ }
4.3.2 文件的读取函数
void loadFile(){
092213112 刘泽中
FILE *fp; int i,k=0,m=0;
if((fp=fopen(\判断文件是否能打开*/
printf(\ exit(1);
}
for(i=0;i<8;i++){/*格式化读取函数*/
fscanf(fp,\ }
fclose(fp);/*关闭文件*/ }
4.3.3 对文件内的信息进行排序
void sortHighscore(){/*运用选择法进行排序*/ int i,k,j; int temp; char temp2[20]; for(i=0;i<9;i++){ k=i;
for(j=i+1;j<9;j++)
if(highScorescore[j]>highScorescore[k]) k=j;
temp=highScorescore[k];/*拷贝分数到中间变量*/
strcpy(temp2,highScorename[k]); /*拷贝姓名到中间变量*/ highScorescore[k]=highScorescore[i]; strcpy(highScorename[k],highScorename[i]); highScorescore[i]=temp; strcpy(highScorename[i],temp2); }
saveHighscore();/*调用saveHighscore()函数将排好序的函数写入文件*/
}
4.3.4 画地图界面函数 void drawGame(){
常熟理工学院
int i,j,size;
till=0;/*用于计算地图中金豆的总个数*/ for(i=0;i<10;i++)
for(j=0;j<10;j++)
str2[i][j]=str[i][j];/*拷贝地图用于gamePlay里面的判断*/ for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(str[i][j]==0)/*如果是0就是路,否则就是墙*/
drawBlock(i,j);/*画路*/ else drawWall(i,j);/*画墙*/
size=imagesize(ORGX+1*W,ORGY+1*H,ORGX+1*W+W-1,ORGY+1*H+H-1); buff=(void*)malloc(size); /*计算缓存大小,把格子存入缓存区用于清除*/
getimage(ORGX+1*W,ORGY+1*H,ORGX+1*W+W-1,ORGY+1*H+H-1,buff); for(i=0;i<10;i++)
}
4.3.5 画第一男主角Pacman
void drawPacman(Face *face){ int x0,y0;
x0=ORGX+face->c*W+W/2;/*计算男主角的中心坐标*/
y0=ORGY+face->r*W+W/2; setfillstyle(1,RED); setcolor(RED);
if(face->dir==RIGHT){ /*默认方向右*/
clearFace(face->r,face->c); /*擦除Pacman*/
pieslice(x0,y0,30,330,12); /*画扇形*/
pieslice(x0,y0,0,360,12);/*画圆,制作动画效果*/ delays(); /*延时,制作动画效果*/ }else{
for(j=0;j<10;j++) }
if(str[i][j]==0){/*如果是路的话*/
drawBall(i,j);/*画金豆*/ till++;/*金豆的总个数加1*/
092213112 刘泽中
setcolor(RED);
circle(x0,y0,12); /*画圆*/ floodfill(x0,y0,RED); /*填充红色*/ setfillstyle(1,WHITE); setcolor(WHITE);
delays(); /*延时*/
switch(face->dir){ case UP: /*上*/
pieslice(x0,y0,60,120,12);break; pieslice(x0,y0,240,300,12);break;
pieslice(x0,y0,150,210,12);break;
case DOWN: /*下*/ case LEFT: /*左*/ } }
}
4.3.6 Pacman的移动(Monster移动与之相仿,故略)
void moveFace(Face *face){
switch(face->dir){/*if语句用来判断是否为墙*/ }
4.3.7 Pacman的清除(Monster清除与之相仿,故略)
void clearFace(int i,int j){/*将存入缓存的那一块图取出来覆盖*/ putimage(ORGX+j*W,ORGY+i*H,buff,COPY_PUT);
}
4.3.8 随机产生怪物方向的函数
case UP:if(str[face->r-1][face->c]==0) face->r--;break; case DOWN:if(str[face->r+1][face->c]==0) face->r++;break; case LEFT:if(str[face->r][face->c-1]==0) face->c--;break; case RIGHT:if(str[face->r][face->c+1]==0) face->c++;break;
}