100%注释后的贪吃蛇程序

  • 格式:doc
  • 大小:70.50 KB
  • 文档页数:12

#include

C语言的图形库文件,其后下面函数在文件内:setfillstyle(),bar(),setcolor()

#include C语言的标准输入输出库文件

#include

C语言的标准库文件,其后下面函数在文件内:int rand(void)

#include

C的标准库文件, 其后下面函数在文件内:kbhit()

#include

C语言的标准库文件,其后下面函数在文件内:bioskey()

语法点:文件包含P97 && 函数P66

#define MAX 200

#define MAXX 30

#define MAXY 30

语法点:宏定义P95

#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

设定每个键在dos下的码,以便后面调用key = bioskey(0)时用

如UP表示上方向键,它在系统的键码是18432,后面的键以此类推

#define TRUE 1

#define FALSE 0

C++中使用BOOL类型代替

#define GAMEINIT 1 游戏初始标志

#define GAMESTART 2 游戏开始标志

#define GAMEHAPPY 3 游戏成功标志

#define GAMEOVER 4 游戏结束标志

struct SPlace

{ int x;

int y;

int st;

} place[MAX]; 语法点:结构体P151

struct SPlace 用于记录蛇身体的一点的结构体,结构体内:x, y为蛇身中某点在屏幕上的十字坐标,st为状态标志,值为1时则该结构体所存值为蛇身一点,需要显示;值为0时表示结构体不再存蛇身点数据的有效值,不显示. struct SPlace数组 place[MAX]用于记录组成蛇身体所有点的信息。开始时蛇身只有两点,每吃一个食物后,蛇身点数加1。当蛇移动时,组成蛇身的点的数据也会发生变化。

int speed; 控制游戏速度的变量,值越大,速度越快。

int count; 记录蛇吃食物数量

int score; 游戏得到的分值

int control; 游戏按键的控制,它的不同值表示按上下左右四种状态

int head; 蛇头点信息存在place[MAX]数组中的下标值

int tear; 蛇尾点信息存在place[MAX]数组中的下标值

int x, y;

int babyx, babyy; 食物的在屏幕的X,Y坐标

int classa; 游戏的当前等级,等级越高,速度越快

int eat;

int game;

语法点:数据类型P10 && 变量P12

int gamedelay[]={20000, 4000, 3000, 2000, 1000, 500, 250, 100};

int gamedelay2[]={1000, 1};

语法点:数组P104 && 变量属性P84

延迟1 gamedelay[],用于控制速度的参数,延迟2 gamedelay2[],和延迟1一起来控制画面切换的speed:gamedelay[classa] + gamedelay2[hit]

static int hitme = TRUE, hit = TRUE;

语法点:变量的属性p84

void init(void); 初始化函数声明

void nextstatus(void); 下一状态计算函数声明

void draw(void); 绘制函数声明

语法点:函数P64

void init(void) 初始化函数,把游戏的所有用到的资源都初始化

{

int i;

for (i = 0; i < MAX; i++)

{

place[i].x = 0; 蛇身体点数组place[i],记录某点在屏幕坐标

place[i].y = 0; place[i]的所有值赋0,这些点开始都不使用

place[i].st = FALSE; 组成蛇的身体的点开始都不使用,也不用显示

}语法点:FOR语句P48 && 结构体P151 place[0].st = TRUE; 开始的蛇身体只有2个点,这两个点要显示

place[1].st = TRUE;

place[1].x = 1; 2个点:place[0]是蛇尾,place[1]是蛇头

speed = 9; 游戏开始的速度是9,gamedelay[classa] + gamedelay2[hit]

count = 0; 游戏开始所吃食物数量为0

score = 0; 游戏开始分数为0,吃食物后分数增加

control = 4; control = 4时,游戏开始默认的前进方向是右方向

control = 3时,游戏开始默认的前进方向是左方向

control = 2时,游戏开始默认的前进方向是上方向

control = 1时,游戏开始默认的前进方向是下方向

head = 1; place[tear]是蛇尾,place[head]是蛇头

tear = 0; head和tear标志着蛇头蛇尾信息在place数组的位置

x = 1; 游戏开始蛇的坐标为(1,0)点,即也是蛇头的坐标

y = 0;

babyx = rand()%MAXX;

babyy = rand()%MAXY;

babyx和babyy是食物点的十字坐标,坐标由系统随机产生。函数 int rand(void)定义在下面文件中,#include rand()会返回一随机数值,范围在0至2147483647。rand()%MAXX和babyy = rand()%MAXY使得食物的坐标最终会落入屏幕内。

eat = FALSE; 当前EAT状态量表示还没有吃到此刻的食物

game = GAMESTART; 当前GAME状态量表示游戏开始

}

void nextstatus(void) 下一状态计算函数,用于计算出游戏的下一个画面的状态

{

int i;

int exit; 表示退出状态标志,它的值表示当前是否处理退出状态

int xx, yy;

xx, yy表示保持相同方向前进后,下一步蛇头可能的坐标

xx = x;

yy = y;

switch (control) control表示当前所按下的方向键,定义于前的全局变量

{

case 1:

y--; y表示在按下方向键后,此刻新的蛇头的y坐标

yy = y - 1; xx, yy表示保持相同下方向前进后一步,下一步蛇头可能的坐标

这样做是为了检测蛇头就要碰墙这种状态。

break;

按方向键的下方向时,蛇头点的下一个坐标要在y方向下移一个单位,x方向坐标保持不变. case 2: 表示游戏状态中按上方向键,上方向时,蛇头点要整体y方向上移一个坐标,x方向坐标保持不变

y++; y表示在按上方向键后,此刻新的蛇头的坐标

yy = y + 1; xx, yy表示保持相同方向前进后,下一步蛇头可能的坐标

这样做是为了检测蛇头就要碰墙这种状态。

break;

按方向键的上方向时,蛇头点的下一个坐标要在y方向下移一个单位,x方向坐标保持不变.

case 3:

x--; x, y表示在按左方向键后,此刻新的蛇头的坐标

xx = x - 1; xx, yy表示保持相同方向前进后,下一步蛇头可能的坐标

break;

按方向键的左方向时,蛇头点的下一个坐标要在y方向下移一个单位,x方向坐标保持不变.

case 4: 表示游戏状态中按右方向键,右方向时,蛇身要整体x方向右移一个坐标,y方向坐标保持不变

x++; x, y表示在按右方向键后,此刻新的蛇头的坐标

xx = x + 1; xx, yy表示保持相同方向前进后,下一步蛇头可能的坐标

break;

按下方向键的右方向时,蛇头点的下一个坐标要在y方向下移一个单位,x方向坐标保持不变

}

hit = TRUE;

hit用于标明一种状态,当蛇头下一步就要撞到墙或自身某点,但现在还没撞到的状态,此刻只要改变前进的方向,蛇就不会撞,我们要把画面切换的时间变慢,也就是要把游戏的速度变慢,以使游戏者有时间在这种状态改变运行方向,以免撞上。

if (((control == 1) ||(control ==2)) &&((y < 1) ||(y >= MAXY - 1)) ||

(((control == 3) ||(control == 4)) &&((x < 1) ||(x >= MAXX - 1))))

{

hit = FALSE;

}

上面的判断有没有出现下面2种情况:1蛇头出界了,这种情况后面的代码处理,2蛇此时没撞上,但即将撞上墙壁,上面说了x,y是当前蛇头的,xx,yy是当前蛇头在不改前进方向的情况下,蛇头下一步可能坐标,也就是下一状态就要撞上墙壁时,我们要把控制相邻两个画面切换的时间减小,以便有时间在马上要撞上后,改变方向。后面代码if (stchange >

gamedelay[classa] + gamedelay2[hit])就是控制这个时间延迟的,其中gamedelay2[hit](hit==false)>gamedelay2[hit](hit==true),以便尽快检测到具体情况的发生

if ((y < 0) ||(y >= MAXY) || (x < 0) ||(x >= MAXX))

{ 蛇出界发生的情况,游戏结束。蛇出界分水平和垂直出界

game = GAMEOVER;当前GAME状态量表示游戏结束