题目:贪吃蛇
专业:计算机
班级: 软件
姓名:
成绩:
指导教师:
完成日期:2008年09月23日
一、目的
1. 进一步掌握和利用C语言进行程设计的能力;
2、 进一步理解和运用结构化程设计的思想和方法;
3、 初步掌握开发一个小型实用系统的基本方法;
4、 学会调试一个较长程序的基本方法;
5、 学会利用流程图或N-S图表示算法;
6、 掌握书写程设计开发文档的能力(书写课程设计报告);
二、内容与设计思想。
(1).系统功能与分析(填写你所设计的菜单及流程图)。
功能:进行贪食蛇游戏
分析:定义键盘方向键操作,随机数发生器产生食物,并分别利用函数判断贪食蛇的长度及游戏是否成功等.
并能够输入游戏成绩.
(2).数据结构
struct Food
{
int x/*食物的横坐标*/
int y/*食物的纵坐标*/
int yes/*判断是否要出现食物的变量*/
}food/*食物的结构体*/
struct Snake
}
int x[N]
int y[N]
int node/*蛇的节数*/
int direction/*蛇移动方向*/
int life/* 蛇的生命,0活着,1死亡*/
}snake
(3).模块设计
根据功能需要:
源文件 :#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
函数名 功能
void main() 游戏主程序
void Init(void) 图形驱动
void Close(void) 图形结束
void DrawK(void) 开始画面
void GameOver(void) 结束游戏
void GamePlay(void) 玩游戏具体过程
void PrScore(void)输出成绩
(3)总体设计思想:
利用图形驱动,制作美观的游戏界面.
通过随机函数产生随机数,控制游戏过程食物的出现.
定义键盘操作,控制游戏过程蛇的移动方向.
画出边界,并判断游戏是否结束.
统计游戏过程蛇吃的食物数量,计算并输出游戏成绩.
(4)调试过程: 测试数据及结果,出现了哪些问题,如何修改的
这里,你就写一下你平时出错的地方,与如何修改的.这里我也不好帮你写.
(5)程序有待改进的地方及本次实习的收获和建议
收获:加深认识了程序编译过程的中团队合作的重要性.
提高了自己的编程能力
(7)源程序清单(主要代码)
清单只要将上面的程序全部粘帖就可以了.
#include<graphics.h>#include<stdlib.h>
#include<dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key
int score=0
int gamespeed=32000
struct Food /*食物的结构体*/
{
int x/*食物的横坐标*/
int y/*食物的纵坐标*/
int yes/*食物是否出现的变量*/
}food
struct Snack /*蛇的结构体*/
{
int x[N]
int y[N]
int node/*蛇的节数*/
int direction/*蛇的方向*/
int life/*蛇的生命,0活着,1死亡*/
}snake
void Init(void)/*图形驱动*/
void Close(void)/*关闭游戏函数*/
void DrawK(void)/*画图函数*/
void GameOver(void)/*输出失败函数*/
void GamePlay()/*游戏控制函数 主要程序*/
void PrScore(void)/*分数输出函数*/
DELAY(char ch)/*调节游戏速度*/
{
if(ch=='3')
{
delay(gamespeed)/*delay是延迟函数*/
delay(gamespeed)
}
else if(ch=='2')
{
delay(gamespeed)
}
}
Menu()/*游戏开始菜单*/
{
char ch
printf("Please choose the gamespeed:\n")
printf("1-Fast 2-Normal 3-Slow\n")
printf("\nPlease Press The numbers..\n")
do
{ch=getch()}
while(ch!='1'&&ch!='2'&&ch!='3')
clrscr()
return(ch)
}
/*主函数*/
void main(void)
{
int ch
ch=Menu()
Init()
DrawK()
GamePlay(ch)
Close()
}
void Init(void)
{
int gd=DETECT,gm
initgraph(&gd,&gm,"c:\\tc")
cleardevice()
}
void DrawK(void)
{
setcolor(11)
setlinestyle(SOLID_LINE,0,THICK_WIDTH)
for(i=50i<=600i+=10)
{
rectangle(i,40,i+10,49)/*画出上边框*/
rectangle(i,451,i+10,460)/*画出下边框*/
}
for(i=40i<=450i+=10)
{
rectangle(50,i,59,i+10)/*画出左边框*/
rectangle(601,i,610,i+10)/*画出右边框*/
}
}
void GamePlay(char ch)
{
randomize()/*随机数发生器*/
food.yes=1/*1代表要出现食物,0表示以存在食物*/
snake.life=0
snake.direction=1
snake.x[0]=100snake.y[0]=100
snake.x[1]=110snake.y[1]=100
snake.node=2
PrScore()
while(1) /*可以重复游戏*/
{
while(!kbhit()) /*在没有按键的情况下蛇自己移动*/
{
if(food.yes==1) /*需要食物*/
{
food.x=rand()%400+60
food.y=rand()%350+60/*使用rand函数随机产生食物坐标*/
while(food.x%10!=0)
food.x++
while(food.y%10!=0)
food.y++/*判断食物是否出现在整格里*/
food.yes=0/*现在有食物了*/
}
if(food.yes==0) /*有食物了就要显示出来*/
{
setcolor(GREEN)
rectangle(food.x,food.y,food.x+10,food.y-10)
}
for(i=snake.node-1i>0i--) /*贪吃蛇的移动算法*/
{
snake.x[i]=snake.x[i-1]
snake.y[i]=snake.y[i-1]/*贪吃蛇的身体移动算法*/
}
switch(snake.direction) /*贪吃蛇的头部移动算法,以此来控制移动*/
{
case 1:snake.x[0]+=10break
case 2:snake.x[0]-=10break
case 3:snake.y[0]-=10break
case 4:snake.y[0]+=10break
}
for(i=3i<snake.nodei++) /*判断是否头部与身体相撞*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver()
snake.life=1
break
}
}
/*下面是判断是否撞到墙壁*/
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)
{
GameOver()
snake.life=1
}
if(snake.life==1) /*如果死亡就退出循环*/
break
if(snake.x[0]==food.x&&snake.y[0]==food.y) /*判断蛇是否吃到食物*/
{
setcolor(0)
rectangle(food.x,food.y,food.x+10,food.y-10)/*吃的食物后用黑色将食物擦去*/
snake.x[snake.node]=-20snake.y[snake.node]=-20/*现把增加的一节放到看不到的地方去*/
snake.node++
food.yes=1
score+=10
PrScore()
}
setcolor(4)/*每次移动后将后面的身体擦去*/
for(i=0i<snake.nodei++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10)
delay(gamespeed)
DELAY(ch)
setcolor(0)
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10)
}
if(snake.life==1)
break
key=bioskey(0)/*接受按键*/
if(key==ESC)
break
else
if(key==UP&&snake.direction!=4)/*判断是否改变方向*/
snake.direction=3
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4
}
}
void GameOver(void)
{
cleardevice()
setcolor(RED)
settextstyle(0,0,4)
outtextxy(200,200,"GAME OVER")
getch()
}
void PrScore(void)
{
char str[10]
setfillstyle(SOLID_FILL,YELLOW)
bar(50,15,220,35)
setcolor(6)
settextstyle(0,0,2)
sprintf(str,"scord:%d",score)
outtextxy(55,20,str)
}
void Close(void)
{
getch()
closegraph()
}
贪吃蛇
#include "graphics.h"
#include "stdio.h"
#define MAX 200
#define MAXX 30
#define MAXY 30
#define UP 18432
#define DOWN 20480
#define LEFT 19200
#define RIGHT 19712
#define ESC 283
#define ENTER 7181
#define PAGEUP 18688
#define PAGEDOWN 20736
#define KEY_U 5749
#define KEY_K 9579
#define CTRL_P 6512
#define TRUE 1
#define FALSE 0
#define GAMEINIT 1
#define GAMESTART 2
#define GAMEHAPPY 3
#define GAMEOVER 4
struct SPlace
{
int x
int y
int st
} place[MAX]
int speed
int count
int score
int control
int head
int tear
int x,y
int babyx,babyy
int class
int eat
int game
int gamedelay[]={5000,4000,3000,2000,1000,500,250,100}
int gamedelay2[]={1000,1}
static int hitme=TRUE,hit = TRUE
void init(void)
void nextstatus(void)
void draw(void)
void init(void)
{
int i
for(i=0i<MAXi++)
{
place[i].x = 0
place[i].y = 0
place[i].st = FALSE
}
place[0].st = TRUE
place[1].st = TRUE
place[1].x = 1
speed = 9
count = 0
score = 0
control = 4
head = 1
tear = 0
x = 1
y = 0
babyx = rand()%MAXX
babyy = rand()%MAXY
eat = FALSE
game = GAMESTART
}
void nextstatus(void)
{
int i
int exit
int xx,yy
xx = x
yy = y
switch(control)
{
case 1: y-- yy = y-1 break
case 2: y++ yy = y+1 break
case 3: x-- xx = x-1 break
case 4: x++ xx = x+1 break
}
hit = TRUE
if ( ((control == 1) || (control ==2 )) && ( (y < 1) ||(y >= MAXY-1)) ||
(((control == 3) || (control == 4)) && ((x < 1) ||(x >= MAXX-1) ) ) )
{
hit = FALSE
}
if ( (y < 0) ||(y >= MAXY) ||
(x < 0) ||(x >= MAXX) )
{
game = GAMEOVER
control = 0
return
}
for (i = 0 i < MAX i++)
{
if ((place[i].st) &&
(x == place[i].x) &&
(y == place[i].y) )
{
game = GAMEOVER
control = 0
return
}
if ((place[i].st) &&
(xx == place[i].x) &&
(yy == place[i].y) )
{
hit = FALSE
goto OUT
}
}
OUT:
if ( (x == babyx) && (y == babyy) )
{
eat = TRUE
count ++
score += (1+class) * 10
}
head ++
if (head >= MAX) head = 0
place[head].x = x
place[head].y = y
place[head].st= TRUE
if (eat == FALSE)
{
place[tear].st = FALSE
tear ++
if (tear >= MAX) tear = 0
}
else
{
eat = FALSE
exit = TRUE
while(exit)
{
babyx = rand()%MAXX
babyy = rand()%MAXY
exit = FALSE
for( i = 0 i< MAX i++ )
if( (place[i].st)&&( place[i].x == babyx) && (place[i].y == babyy))
exit ++
}
}
if (head == tear) game = GAMEHAPPY
}
void draw(void)
{
char temp[50]
int i,j
for (i = 0 i < MAX i++ )
{
setfillstyle(1,9)
if (place[i].st)
bar(place[i].x*15+1,place[i].y*10+1,place[i].x*15+14,place[i].y*10+9)
}
setfillstyle(1,4)
bar(babyx*15+1,babyy*10+1,babyx*15+14,babyy*10+9)
setcolor(8)
setfillstyle(1,8)
bar(place[head].x*15+1,place[head].y*10+1,place[head].x*15+14,place[head].y*10+9)
/* for( i = 0 i <= MAXX i++ )
line( i*15,0, i*15, 10*MAXY)
for( j = 0 j <= MAXY j++ )
line( 0, j*10, 15*MAXX, j*10)
*/
rectangle(0,0,15*MAXX,10*MAXY)
sprintf(temp,"Count: %d",count)
settextstyle(1,0,2)
setcolor(8)
outtextxy(512,142,temp)
setcolor(11)
outtextxy(510,140,temp)
sprintf(temp,"1P: %d",score)
settextstyle(1,0,2)
setcolor(8)
outtextxy(512,102,temp)
setcolor(12)
outtextxy(510,100,temp)
sprintf(temp,"Class: %d",class)
setcolor(8)
outtextxy(512,182,temp)
setcolor(11)
outtextxy(510,180,temp)
}
main()
{
int pause = 0
char temp[50]
int d,m
int key
int p
static int keydown = FALSE
int exit = FALSE
int stchange = 0
d = VGA
m = VGAMED
initgraph( &d, &m, "" )
setbkcolor(3)
class = 3
init()
p = 1
while(!exit)
{
if (kbhit())
{
key = bioskey(0)
switch(key)
{
case UP: if( (control != 2)&& !keydown)
control = 1
keydown = TRUE
break
case DOWN: if( (control != 1)&& !keydown)
control = 2
keydown = TRUE
break
case LEFT: if( (control != 4)&& !keydown)
control = 3
keydown = TRUE
break
case RIGHT: if( (control != 3)&& !keydown)
control = 4
keydown = TRUE
break
case ESC: exit = TRUEbreak
case ENTER: init()break
case PAGEUP: class -- if (class<0) class = 0 break
case PAGEDOWN: class ++if (class>7) class = 7 break
case KEY_U: if( ( (control ==1) ||(control ==2))&& !keydown)
control = 3
else if(( (control == 3) || (control == 4))&& !keydown)
control = 1
keydown = TRUE
break
case KEY_K: if( ( (control ==1) ||(control ==2))&& !keydown)
control = 4
else if(( (control == 3) || (control == 4))&& !keydown)
control = 2
keydown = TRUE
break
case CTRL_P:pause = 1 - pause break
}
}
stchange ++
putpixel(0,0,0)
if (stchange > gamedelay[class] + gamedelay2[hit])
{
stchange = 0
keydown = FALSE
p = 1 - p
setactivepage(p)
cleardevice()
if (!pause)
nextstatus()
else
{
settextstyle(1,0,4)
setcolor(12)
outtextxy(250,100,"PAUSE")
}
draw()
if(game==GAMEOVER)
{
settextstyle(0,0,6)
setcolor(8)
outtextxy(101,101,"GAME OVER")
setcolor(15)
outtextxy(99,99,"GAME OVER")
setcolor(12)
outtextxy(100,100,"GAME OVER")
sprintf(temp,"Last Count: %d",count)
settextstyle(0,0,2)
outtextxy(200,200,temp)
}
if(game==GAMEHAPPY)
{
settextstyle(0,0,6)
setcolor(12)
outtextxy(100,300,"YOU WIN")
sprintf(temp,"Last Count: %d",count)
settextstyle(0,0,2)
outtextxy(200,200,temp)
}
setvisualpage(p)
}
}
closegraph()
}
具体的编译和界面还是要靠你。
内含源码、贪吃蛇流程图、函数讲解以及函数流程图
链接:https://pan.baidu.com/s/1VCi66fbV7dj_hgcgIRbwKA
提取码:73j5 复制这段内容后打开百度网盘手机App,操作更方便哦