信息技术学院本科课程设计报告Word文件下载.docx
《信息技术学院本科课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《信息技术学院本科课程设计报告Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
1.程序总体结构
图2贪吃蛇程序系统的构图
2.界面设计
如图,通过W、S、A、D、space键进行操作
3.输入方式设计
A用W、S、A、D、键控制蛇的上下左右移动,space键停止,esc键结束。
B游戏目标:
操纵屏幕上那条可爱的小蛇,在方框中不停吃豆豆,而每吃一个豆豆,蛇的身体都变的更长一些,即增加一颗星星。
游戏的难度也会随之加大。
C游戏终止:
终止条件1——蛇头撞到墙上;
终止条件2——蛇身形成一个圈,也就是蛇头碰到自身的任何一处
4.重要数据的数据结构设计
5.函数设计
6.函数调用图
7.实体属性图
四、关键技术、难点及其解决方法
五、测试方法
六、总结
附录1
程序源代码
#include<
windows.h>
stdlib.h>
time.h>
stdio.h>
string.h>
conio.h>
#defineN21
intapple[3];
charscore[3];
chartail[3];
voidgotoxy(intx,inty)//输出坐标
{
COORDpos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
voidcolor(intb)//颜色函数
HANDLEhConsole=GetStdHandle((STD_OUTPUT_HANDLE));
SetConsoleTextAttribute(hConsole,b);
}
intBlock(charhead[2])//判断出界
if((head[0]<
1)||(head[0]>
N)||(head[1]<
1)||(head[1]>
N))
return1;
return0;
intEat(charsnake[2])//吃了苹果
if((snake[0]==apple[0])&
&
(snake[1]==apple[1]))
{
apple[0]=apple[1]=apple[2]=0;
gotoxy(N+44,10);
color(13);
printf("
%d"
score[0]*10);
color(11);
}
voidDraw(char**snake,intlen)//蛇移动
if(apple[2]){
gotoxy(apple[1]*2,apple[0]);
color(12);
●"
);
gotoxy(tail[1]*2,tail[0]);
if(tail[2])
{color(14);
★"
else
■"
gotoxy(snake[0][1]*2,snake[0][0]);
color(14);
putchar('
\n'
char**Move(char**snake,chardirx,int*len)//控制方向
inti,full=Eat(snake[0]);
memcpy(tail,snake[(*len)-1],2);
for(i=(*len)-1;
i>
0;
--i)
memcpy(snake[i],snake[i-1],2);
switch(dirx)
{
case'
w'
:
W'
--snake[0][0];
break;
s'
S'
++snake[0][0];
a'
A'
--snake[0][1];
d'
D'
++snake[0][1];
default:
;
}
if(full)
snake=(char**)realloc(snake,sizeof(char*)*((*len)+1));
snake[(*len)]=(char*)malloc(sizeof(char)*2);
memcpy(snake[(*len)],tail,2);
++(*len);
++score[0];
if(score[3]<
16)
++score[3];
tail[2]=1;
tail[2]=0;
returnsnake;
voidinit(charplate[N+2][N+2],char***snake_x,int*len)//初始化
inti,j;
char**snake=NULL;
*len=3;
score[0]=score[3]=3;
snake=(char**)realloc(snake,sizeof(char*)*(*len));
for(i=0;
i<
*len;
++i)
snake[i]=(char*)malloc(sizeof(char)*2);
3;
++i)
snake[i][0]=N/2+1;
snake[i][1]=N/2+1+i;
for(i=1;
=N;
for(j=1;
j<
++j)
plate[i][j]=1;
apple[0]=rand()%N+1;
apple[1]=rand()%N+1;
apple[2]=1;
N+2;
gotoxy(0,i);
for(j=0;
switch(plate[i][j])
case0:
printf("
□"
color(11);
continue;
case1:
(*len);
gotoxy(snake[i][1]*2,snake[i][0]);
*snake_x=snake;
voidManual()
gotoxy(N+30,2);
color(10);
按WSAD移动方向"
gotoxy(N+30,4);
按space键暂停"
gotoxy(N+30,8);
历史最高分为:
"
gotoxy(N+44,8);
score[1]*10);
gotoxy(N+30,12);
你现在得分为:
0"
intFile_in()//取记录的分数
FILE*fp;
if((fp=fopen("
C:
\\tcs.txt"
"
a+"
))==NULL)
gotoxy(N+18,N+2);
文件不能打开\n"
exit(0);
if((score[1]=fgetc(fp))!
=EOF);
else
score[1]=0;
intFile_out()//存数据
if(score[1]>
score[0])
{gotoxy(10,10);
puts("
闯关失败加油耶"
gotoxy(0,N+2);
w+"
if(fputc(--score[0],fp)==EOF)
输出失败\n"
gotoxy(10,10);
恭喜您打破记录"
voidFree(char**snake,intlen)//释放空间
inti;
len;
free(snake[i]);
free(snake);
intmain(void)
intlen;
charch='
g'
;
chara[N+2][N+2]={{0}};
char**snake;
srand((unsigned)time(NULL));
File_in();
init(a,&
snake,&
len);
Manual();
while(ch!
=0x1B)//按ESC结束
Draw(snake,len);
if(!
apple[2]){
Sleep(200-score[3]*10);
setbuf(stdin,NULL);
if(kbhit())
gotoxy(0,N+2);
ch=getche();
snake=Move(snake,ch,&
if(Block(snake[0])==1)
gotoxy(N+2,N+2);
你输了"
File_out();
Free(snake,len);
getche();