c语言实训贪吃蛇报告书

Python038

c语言实训贪吃蛇报告书,第1张

《高级语言程序设计》课程设计 实验报告

题目:贪吃蛇

专业:计算机

班级: 软件

姓名:

成绩:

指导教师:

完成日期: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,操作更方便哦