没有合适的资源?快使用搜索试试~ 我知道了~
首页C语言贪吃蛇课程设计实验报告.pdf
资源详情
资源评论
资源推荐

第 1 页 (共 12 页)
《C 语言综合案例分析》课程设计报告
贪吃蛇游戏设计
一、设计目的
1.掌握使用 C 语言开发较大完整项目的流程,锻炼编程调试能力和程
序开发技巧;
2.掌握 EGE 图形库的使用方法;
3.掌握 CodeBlocks 软件的使用方法及调试方法。
二、设计内容
1.游戏开始时,蛇身长度固定为 3 格,位置固定在窗口中心,方向朝
右,初始食物为 1,分数 sorce=0;
2.蛇头撞到自身或围栏游戏结束,从最初级别重新开始,撞到食物蛇
身长度增加一个单位,每吃到一个食物,记录 sum 的值,分数 sorce+=10;
3.蛇吃到一个食物后,身长 length+1,窗口内随机生成另一个食物;
4.蛇不能碰到自己的身体,否则游戏失败退出。
5.用键盘“上下左右”控制蛇的运动方向,用“P”键暂停游戏,用
“ESC”键退出游戏,无控制时蛇默认运动方向为上一步的运动方向,
并按此方向运动;
6.当蛇在运动时,如果按下与当前蛇头相反的方向键,蛇身不变,继
续按原方向运动。
联合体
当多个数据须要共享内存或者多个数据每次仅仅取其一时,需要
使用联合体(union)定义。联合体的特点如下:
1)联合体是一个结构;
2)它的全部成员相对于基地址的偏移量都为 0;
3)此结构空间要大到足够容纳最“宽”的成员;
4)其对齐方式要适合当中全部的成员。
游戏概述
玩家控制贪吃蛇在屏幕上移动,角色只能向左、右方向 90 度转弯,一旦碰到
墙壁或蛇身任何部位就失败。玩家通过吃随机出现的食物来获取分数,同时贪食
蛇的长度也会随着增加。吃的越多,获得的分数越高,同时蛇身也越长。
三、设计原理
1.数据结构设计
游戏背景 draw_block()可采用二维数组网格图类型,考虑到二位数组的位置信
息有两个,操作存储复杂,因此使用联合体结构。可以根据需要选择使用一
维数组还是二位数组。
union ground
{
color_t ground_1D[ACROSS*ERECT] = {BLUE};
color_t ground_2D[ACROSS][ERECT];
}game_ground;
蛇所在位置的存储 int body[MAX_LENGTH_SNAKE] = {0};
为了方便判断每个游戏关卡是否通过,可以加入蛇身长度的存储。建议使用
宏定义。#define MAX_LENGTH_SNAKE 30
贪吃蛇的运动控制
贪吃蛇有四种运动方向,左右有效,前无效(不影响原来运动方向),后则导
机电
工程学院
_________
专业
__自动化
_____
年级
___
1 班___
班 姓名
____
刘智耀
_____
学号
_______18520340112________
………………………………………
装 …………………………………
订 ……………………………
线 …………………………

第 2 页 (共 12 页)
致失败。方向是否错误的判断可和蛇撞墙或撞自身的判断放到一起进
行。
贪吃蛇的运动方向
每次只有蛇头和蛇尾显示发生变化;吃食物时,蛇头变化,蛇尾不
变(身体增长一个单位)。
游戏速度的控制
蛇的运动可以看做是一个有条件控制的循环,当不满足游戏规则时
失败,当蛇达到最大长度时过关。循环过程中加入延时,延时的多少
就可以控制游戏速度。Sleep(5000);//延时 5000ms
2.功能(函数)分解
draw_ground(); //游戏背景
draw_block(); //游戏地板函数
create_food(); //随机生成食物
game_init(int game_speed); //游戏进程操作
scankey();
snake_move(); //贪吃蛇的移动
gotoxy(int x, int y); //将光标移动到控制台的(x,y)坐标点处
3.程序流程图
4.EGE 函数的使用
EGE 图像库是一个类似 graphics.h 的 BGI 图形库,使用方法相当接近,基
本使用方法几乎和 TC 的一样,只要#include "graphics.h"就可以了,目前支持 VC6,
VC2008, VC2010 等 IDE,同时也支持 MinGW 编译器和使用 MinGW 编译器的 IDE(如
Code::Blocks,C-Free,Dev-CPP,eclipse for C/C++)EGE(Easy Graphics Engine),
是 windows 下的简易绘图库,是一个类似 BGI(graphics.h)的面向 C/C++语言新手的图形库,
它的目标也是为了替代 TC 的 BGI 库而存在。
EGE 图像库的优点:
绘图效率较好,特别在批量绘图模式下,640*480 的半透明混合,可以直
接使用 getpixel / putpixel 完成,
并且可以在大约 1.5G CPU 台式机器上达到 60fps
灵活性更强,绘图可以直接针对一个 PIMAGE,不必只能画在屏幕上
功能更多,支持拉伸贴图,支持透明半透明贴图,支持图像模糊滤镜操
作,可以用对话框函数进行图形化的输入
面向动画编程和游戏编程做了功能增强,可以方便地对帧率进行准确的
控制
附带简单的 3D 矢量运算函数和类,便于 3D 计算
支持读写多种格式图片,支持读取 bmp, jpg, png, gif,支持保存为 bmp
和 png
支持 GUI 模式编程
根据设计要求,需要使用以下函数:
1. #include <graphics.h> 为图像库
2. cleardevice();
3. setcolor(LIGHTGRAY); //颜色设置
4. initgraph(HEIGHT, WIDTH);//窗口设置
5. gotoxy(int x, int y); //将光标移动到控制台的(x,y)坐标点处
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;
机电
工程学院
_________
专业
__自动化
_____
年级
___1
班___
班 姓名
___刘智耀
______
学号
_______18520340112_________
1.………………………………………
装 …………………………………
订 ……………………………
线 …………………………

第 3 页 (共 12 页)
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),
coord);
}
四、程序设计
3.......函数源代码及注释(必须有注释)
void draw_ground();
void draw_block(); //声明网
格图函数
void create_food(); //定义食
物类型
void game_init(int game_speed); //设置游
戏速度
void scankey();
void snake_move(); //蛇的移动
void gotoxy(int x, int y); //将光标定到指定坐标(x,y)
union ground
{
color_t ground_1D[ACROSS*ERECT] = {BLUE};
color_t ground_2D[ACROSS][ERECT];
}game_ground;
enum dir{up,down,left,right,P};
enum GameSituation{fail,win,running};
int body[MAX_LENGTH_SNAKE] = {0};
int head_snake = 0,tail_snake = 0,length_snake = 0;
int position_food = 0;
int game_speed =500,game_over = 0,game_level = 0;
int direction = up,situation = running;
int sorce = 0;//记录玩家的得分
int main()
{
game_init(game_speed-game_level*50);
while(1)
{
if(!game_over)
{
switch(situation)
{
case fail:
cleardevice();
game_init(game_speed);
break;
case win:
game_level++;
if(game_speed<=0) game_speed=500;
game_init(game_speed-game_level*50);
break;
机电
工程学院
_________
专业
__自动化
_____
年级
___1
班___
班 姓名
___
刘智耀
______
学号
_______18520340112_________
2.………………………………………
装 …………………………………
订 ……………………………
线 …………………………
剩余11页未读,继续阅读

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0