C语言课程设计报告书样本

  • 格式:doc
  • 大小:83.81 KB
  • 文档页数:16

下载文档原格式

  / 16
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

海南大学三亚学院《C语言程序设计》课程设计

题目:贪吃蛇算法

专业:计算机科学与技术

班级:计科1001

姓名:杨凯文

学号:1010711035

指导老师:李春林

目录

《C语言程序设计》课程设计 (1)

1. 程序要求 (3)

2. 程序分析与设计 (3)

3.流程图 (4)

4. 源程序清单 (4)

5.调试过程 (12)

6.程序有待改进的地方 (13)

参考文献 (13)

附录 (14)

贪吃蛇算法

1. 程序要求

游戏时,一条蛇在密闭的围墙内,围墙内会随机出现一个食物通过键盘上的4个光标键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被蛇吃掉,这时蛇的身体加长一节,同时计10分。接着又出现食物等待被蛇吃掉。如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体),则游戏结束。

2. 程序分析与设计

思路: 这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有庆平的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来社会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇。

整体设计说明:一个游戏要有开始部分,运行部分,结束部分(注:开始部分与运行部分是一体的)。

3.流程图

开始

为运行部分初始化

运行部分

不是

撞墙或者咬到

自己?

游戏结束继续游戏

4. 源程序清单

#include

#include

#include

#include

#include

using namespace std;

#ifndef SNAKE_H

#define SNAKE_H

class Cmp

{

friend class Csnake;

int rSign; //横坐标

int lSign; //竖坐标

public:

// friend bool isDead(const Cmp& cmp); Cmp(int r,int l){setPoint(r,l);}

Cmp(){}

void setPoint(int r,int l){rSign=r;lSign=l;} Cmp operator-(const Cmp &m)const

{

return Cmp(rSign-m.rSign,lSign-m.lSign); }

Cmp operator+(const Cmp &m)const

{

return Cmp(rSign+m.rSign,lSign+m.lSign);

}

};

const int maxSize = 5; //初始蛇身长度

class Csnake

{

Cmp firstSign; //蛇头坐标

Cmp secondSign;//蛇颈坐标

Cmp lastSign; //蛇尾坐标

Cmp nextSign; //预备蛇头

int row; //列数

int line; //行数

int count; //蛇身长度

vector > snakeMap;//整个游戏界面queue snakeBody; //蛇身

public:

int GetDirections()const;

char getSymbol(const Cmp& c)const

//获取指定坐标点上的字符

{

return snakeMap[c.lSign][c.rSign];

}

Csnake(int n)

//初始化游戏界面大小

{

if(n<20)line=20+2;

else if(n>30)line=30+2;

else line=n+2;

row=line*3+2;

}

bool isDead(const Cmp& cmp)

{

return ( getSymbol(cmp)=='@' || cmp.rSign == row-1 || cmp.rSign== 0 || cmp.lSign == line-1 ||

cmp.lSign == 0 );

}

void InitInstance(); //初始化游戏界面

bool UpdataGame(); //更新游戏界面

void ShowGame(); //显示游戏界面

};

#endif // SNAKE_H

using namespace std;

//测试成功

void Csnake::InitInstance()

{

snakeMap.resize(line); // snakeMap[竖坐标][横坐标] for(int i=0;i

{

snakeMap[i].resize(row);

for(int j=0;j

{

snakeMap[i][j]=' ';

}

}

for(int m=1;m

{

//初始蛇身

snakeMap[line/2][m]='@';

//将蛇身坐标压入队列

snakeBody.push(Cmp(m,(line/2)));

//snakeBody[横坐标][竖坐标]

}

//链表头尾

firstSign=snakeBody.back();

secondSign.setPoint(maxSize-1,line/2);

}