加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

贪吃蛇游戏 C语言程序设计

(2011-07-31 19:14:51)
标签:

贪吃蛇

课程设计报告

c语言

游戏

it

分类: C_and_CPP
好多图挂了 看我csdn博客吧 http://blog.csdn.net/neolone/article/details/6648757

1 需求分析

【阐述课程设计应该完成的功能】

使用键盘的上下左右,来控制蛇的运动方向,ESC键退出,并显示得分。

 

2 系统分析和设计

2.1 数据结构的设计和选择的理由

本游戏中涉及的主要数据结构是如何表示运动的蛇、食物状态等问题。
2.1.1 从游戏参考画面中我们可以看到,贪吃蛇的身体是一节节的,由一个个大小相同的方块组成,那么我们可以用一个(x,y)坐标为左上角的、固定宽度的正方形来表示一节蛇身。为表示连续的多节身体,那么我们可以采用数组(或链表,或线性表)等数据结构来表示。下面以数组方式为例:
struct Point {
    int x, y;
}

struct Point nodes[MAX_LENGTH];  //蛇身数组,MAX_LENGTH为最大蛇长

贪吃蛇是在不断的运动的,我们研究蛇的运动可以发现这样的特点:
1. 蛇头由键盘控制,键盘不操作时,保持原有方向运动;(用 intdirection;表示) 
2. 运动时,蛇身后面一节移动到前面一节的位置。当我们用nodes[0]表示蛇头的时候,nodes[1]运动到nodes[0]处;nodes[2]运动到nodes[1]处...。
3. 吃到一个食物以后,蛇身会增加一节。即该数组中的有效数据个数加一。(用int length;表示)

根据上面的情况,我们可以设计蛇的数据结构如下:
struct Snake {
   struct Point nodes[MAX_LENGTH];  //蛇身数组,保存每节蛇身的坐标。MAX_LENGTH为最大蛇长
    int length;    //当前蛇长
    int direction; //蛇头运动方向
    int live;      //蛇活的,还是已经死了?
}

2.1.2 关于食物
,有两个属性:
1. 坐标位置
2. 状态:存在,或被吃。
故我们用以下结构表示:
struct Food {
    struct Point position;  //食物的位置
    int exist;             //存在?还是被吃?
}

 

2.2 系统模块划分和模块结构

void main() {

       init();                           

       l=1;                            

       while(l)                         

       {

          select();                      

          gamePlay();                   

       }

       close();                          

}

2.3 流程图

 

 http://hi.csdn.net/attachment/201107/31/0_1312110348qCne.gifC语言程序设计" />

 

 

 

 

2.4 数据类型、全局变量和函数说明

2.4.1数据类型

struct Point {                                        

       intx, y;         

};

 

struct Snake {                                       

       structPoint nodes[MAX_LENGTH];                

       intlength;                                      

       intdirection;                                    

       intlive;                                                     

} snake;

                                          

struct Food {                                       

       structPoint position;                             

       intexist;                                       

} food;

 

2.4.2全局变量

Score                                                                                   \\得分

left,top,right,bottom                                                               \\游戏区域范围

lastx,lasty                                                                             \\用来保存最后一节蛇的位置

keyCode                                                                               \\用来保存按下的键

 

2.4.3函数说明

void init(void);                                                               \\初始化程序,给一些初始值赋值

void gamePlay(void);                                                      \\游戏主循环

void close(void);                                   \\关闭游戏

void drawWall(void);                               \\画墙

void createFood(void);                              \\创造一个食物

void drawFood(void);                                                     \\画出食物

void drawSnake(void);                                                    \\画出蛇

void drawScore(void);                                                    \\画出分数

int touchWall(void);                                 \\判断是否碰到墙

int touchSelf(void);                                                        \\判断是否碰到自己

void gameOver(void);                                                       \\游戏结束

void moveSnake(void);                               \\移动蛇

int oppositeDirection(int keyCode);                     \\判断是否方向有误

int foodEat(void);                                                             \\判断是否吃到食物

void expandSnake(void);                              \\把蛇增长一节

 

3 程序测试和运行结果

----------------------------------------------------------------------------选择速度开始或退出

http://hi.csdn.net/attachment/201107/31/0_13121104968CsR.gifC语言程序设计" />

----------------------------------------------------------------------------------------游戏运行中

http://hi.csdn.net/attachment/201107/31/0_1312110527CcdK.gifC语言程序设计" />

--------------------------------------------------------------------------------------------------------游戏结束

4 课程报告小结

【遇到的问题及解决方法分析等】

4.1分数重叠显示

解决方法:每次都用一块黑的矩形覆盖

setfillstyle(1,16);

        bar(45,45,150,80);

4.2速度太快

解决方法:循环delay

for(d=0;d<4;d++)

        delay(GAME_SPEED);

4.3食物可能出现在蛇身上

解决方法:依次判断,若重叠则重新生成食物

void createFood() {

       inti;

label:

   food.position.x=left+10*((int)rand());

   food.position.y=top+10*((int)rand());

       for(i=0;i<=snake.length-1;i++){

        if(snake.nodes[i].x==food.position.x&&snake.nodes[i].y==food.position.y)

              gotolabel;

       }

附录A:程序源代码

 



这是资源地址,源代码http://download.csdn.net/source/3483954

设计报告http://download.csdn.net/source/3483963

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有