C课程设计贪吃蛇小益智游戏内附完整源码及附件doc.docx

上传人:b****7 文档编号:8732660 上传时间:2023-02-01 格式:DOCX 页数:20 大小:55.67KB
下载 相关 举报
C课程设计贪吃蛇小益智游戏内附完整源码及附件doc.docx_第1页
第1页 / 共20页
C课程设计贪吃蛇小益智游戏内附完整源码及附件doc.docx_第2页
第2页 / 共20页
C课程设计贪吃蛇小益智游戏内附完整源码及附件doc.docx_第3页
第3页 / 共20页
C课程设计贪吃蛇小益智游戏内附完整源码及附件doc.docx_第4页
第4页 / 共20页
C课程设计贪吃蛇小益智游戏内附完整源码及附件doc.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

C课程设计贪吃蛇小益智游戏内附完整源码及附件doc.docx

《C课程设计贪吃蛇小益智游戏内附完整源码及附件doc.docx》由会员分享,可在线阅读,更多相关《C课程设计贪吃蛇小益智游戏内附完整源码及附件doc.docx(20页珍藏版)》请在冰豆网上搜索。

C课程设计贪吃蛇小益智游戏内附完整源码及附件doc.docx

C课程设计贪吃蛇小益智游戏内附完整源码及附件doc

温馨提示

程序语言:

C、C++、C#、Python(红色字体表示本课设使用的程序设计语言)

图形功能选项:

Win32控制台程序(黑框、文本界面)、Win32程序、MFC、WinForm、DirectX10(黑体标明表示本课设的程序图形类别,默认为非图形界面Win32控制台程序)

数据结构:

基础类型、数组、链表、双向链表、搜索树(非平衡二叉树)、平衡二叉树、链表与平衡二叉树相结合、堆栈、队列、串、图(黑体标明表示本课设使用的数据结构)

C++语言项:

STL库(黑体标明表示使用C++的STL库)

编译环境:

Windows764位旗舰版(Linux及其他环境请谨慎下载)

集成开发环境:

VisualC++6.0、DEVC++、CodeBlocks、VisualStudio2015均可通过编译。

(浅蓝色字体表示需要运行修改后的版本,请用户自行选择源代码测试)

分多头文件编译:

否(所有代码基本都包含在一个文件内,如需试验头文件功能,请自行参考相关文献)

内容说明:

1、课设题目及预览内容将在第二页开始展示。

2、代码行数:

259行

3、目录所示内容,本文基本涵盖,如无内容,会在本页进行说明。

4、附录绝对包含用户使用手册及程序完整源代码和详细注释。

5、如需下载其他头文件(例如DirectX需另行配置),本文会在此进行说明。

6、本文撰写内容仅供学习参考,另外,由于本人水平有限,编写之处难免存在错误和纰漏,恳请各位老师或同学批评指正。

 

上机报告

 

程序实践名称:

________________________________

学生姓名:

________________________________

专业:

________________________________

班级:

________________________________

学号:

________________________________

指导教师:

________________________________

上机成绩:

________________________________

上机地点:

________________________________

上机时间:

____________年_______月_______日

一、上机目的与上机要求(可以有多个目标及要求,对应多个上机内容)

1、上机目的(具体的目的,类似于“提出问题”)

将理论用于实践,更充分的掌握课本的知识,巩固并加深对课本知识的理解,进一步提高我们的动手编程能力。

编写程序既能锻炼我们的动手能力,又能培养提高我们的学习热情。

贪吃蛇是一个很简单而且比较益智的小游戏,编写起来比较简单,而且我们所学的知识也恰好能解决这个问题。

首先,我们需要明确一下编写贪吃蛇的框架。

其次,需要几个类控制整个游戏的运作。

最后,如何解决蛇移动和吃到食物的问题。

2、上机要求(具体的上机要求及相关的问题分析,类似于“分析问题”)

由于游戏比较简单,所以一个类足够驾驭这个游戏的运作。

还有蛇的移动,因为蛇吃到一个食物,相应的长度就加一,这样,应该拆成蛇头、蛇身、蛇尾来进行比较方便操作,蛇头控制移动方向,而且蛇头吃到了食物,则蛇尾不需要去除。

二、上机设备(环境)及要求

操作系统:

Windows7

编译环境:

VC6.0++

三、上机内容与步骤(类似于“解决问题”)

1、步骤1

(1)上机内容(明确的上机内容):

解决问题的思路和方法(系统/方法/算法等),图文结合

首先,定义一个二维数组来储存整个地图的内容;

其次,再定义一个二维数组来记录蛇每部分的运动方向;

最后,分析一下整个游戏的关键:

一开始,我们把蛇分成了三个部分,蛇头、蛇身、蛇尾。

如图所示,黄色的是墙,这是初始状态的地图。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

食物

 

 

 

 

 

 

 

 

蛇尾

蛇头

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

食物

 

 

 

 

 

 

 

 

蛇尾→

蛇头→

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

食物

 

 

 

 

 

 

 

 

蛇尾

蛇身

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

根据方向绘制蛇头,如下图:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

食物

 

 

 

 

 

 

 

 

蛇尾

蛇身

蛇头

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

擦除蛇尾,如下图:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

食物

 

 

 

 

 

 

 

 

蛇身

蛇头

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

再绘制蛇尾,如下图:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

食物

 

 

 

 

 

 

 

 

蛇尾

蛇头

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

这样便完成了蛇的移动,同样的方向的记录也是类似的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

食物

 

 

蛇头

蛇头↑

 

 

蛇尾

蛇尾↑

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

注:

有箭头代表蛇的方向。

当蛇吃到食物的时候,只需要在食物的地方绘制蛇头,而原来蛇头的地方绘制蛇身即可,无须擦除蛇尾再进行绘制,然后重新产生食物,如下图。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

蛇头

蛇头↑

 

 

蛇身

蛇身↑

 

 

蛇尾

蛇尾↑

 

 

 

 

 

 

 

 

食物

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

当检测到按键的时候,先改变蛇的移动方向,再移动蛇即可。

(2)主要实现(详细的关键代码)

voidRetroSnaker:

:

move()

{

switch(directionMap[hearY][hearX])

{

caseUP:

if(FOOD==map[hearY-1][hearX])//吃到食物

againFood();

elseif(EMPTY==map[hearY-1][hearX])//什么都没遇到

erasingTheTail();//擦除尾巴

else{

gameOver=true;//没有遇到食物或者空,则表示游戏结束

break;

}

erasingTheHear(UP);

break;

caseDOWN:

if(FOOD==map[hearY+1][hearX])//吃到食物

againFood();

elseif(EMPTY==map[hearY+1][hearX])//什么都没遇到

erasingTheTail();//擦除尾巴

else{

gameOver=true;//没有遇到食物或者空,则表示游戏结束

break;

}

erasingTheHear(DOWN);

break;

caseLEFT:

if(FOOD==map[hearY][hearX-1])//吃到食物

againFood();

elseif(EMPTY==map[hearY][hearX-1])//什么都没遇到

erasingTheTail();//擦除尾巴

else{

gameOver=true;//没有遇到食物或者空,则表示游戏结束

break;

}

erasingTheHear(LEFT);

break;

caseRIGHT:

if(FOOD==map[hearY][hearX+1])//吃到食物

againFood();

elseif(EMPTY==map[hearY][hearX+1])//什么都没遇到

erasingTheTail();//擦除尾巴

else{

gameOver=true;//没有遇到食物或者空,则表示游戏结束

break;

}

erasingTheHear(RIGHT);

break;

default:

break;

}

}

四:

上机运行结果与分析

(详细的程序运行结果,图/表/文相结合,并对结果进行较全面的对比分析,类似于“验证问题”)

与预期的结论一致,运行结果满足预期效果。

五:

结论(讨论)

1、上机结论(对应前面的上机目的)

通过本次上机,充分的锻炼了我解决问题的能力,让我更加的了解到知识得运用才能熟练的掌握,也提高了我的学习兴趣和热情。

2、讨论(存在的问题及可能的改进方向)

游戏界面比较单一,只有蛇和食物,没有统计分数和排行榜,也没有游戏结束的画面,还不能调整游戏的难度,蛇的速度基本是恒定的,无法动态修改。

这是我需要改进的地方。

六、教师评审

教师评语

实验成绩

(虽然上机主要侧重于验证问题,但是建议各位老师从解决“工程技术问题”,特别是“复杂工程问题”的角度去评审学生上机过程及上机报告,主要内容包括提出问题、分析问题、解决问题及验证问题。

要有较详细的评审意见。

 

签名:

日期:

附录

用户使用手册

1、编译运行即开始游戏。

2、按小写字母wsad即可进行游戏的操作。

3、按任意键暂停游戏

程序源代码

#include

#include

#include

#include

#include

usingnamespacestd;

#defineN20//地图大小

#defineWALL5//墙

#defineHEAR1//蛇头

#defineTAIL2//蛇尾

#defineBODY3//蛇身

#defineFOOD4//食物

#defineEMPTY0//空

classRetroSnaker{

public:

RetroSnaker(){Init();}

boolgameOver;//游戏是否结束

voidmove();

voidmove(charch);

private:

intmap[N][N];//二维地图

intdirectionMap[N][N];//方向图

inthearX,hearY;//蛇头坐标

inttailX,tailY;//蛇尾坐标

intfoodX,foodY;//食物坐标

booleatFood;//标记是否吃到食物

voidInit();//初始化

voidgotoXY(intx,inty);//光标跳转到屏幕的相应位置

voidagainFood();//食物被吃,再次产生食物

voiderasingTheTail();//擦除尾巴

voiderasingTheHear(charch);//擦除蛇头

};

voidRetroSnaker:

:

move()

{

switch(directionMap[hearY][hearX])

{

caseUP:

if(FOOD==map[hearY-1][hearX])//吃到食物

againFood();

elseif(EMPTY==map[hearY-1][hearX])//什么都没遇到

erasingTheTail();//擦除尾巴

else{

gameOver=true;//没有遇到食物或者空,则表示游戏结束

break;

}

erasingTheHear(UP);

break;

caseDOWN:

if(FOOD==map[hearY+1][hearX])//吃到食物

againFood();

elseif(EMPTY==map[hearY+1][hearX])//什么都没遇到

erasingTheTail();//擦除尾巴

else{

gameOver=true;//没有遇到食物或者空,则表示游戏结束

break;

}

erasingTheHear(DOWN);

break;

caseLEFT:

if(FOOD==map[hearY][hearX-1])//吃到食物

againFood();

elseif(EMPTY==map[hearY][hearX-1])//什么都没遇到

erasingTheTail();//擦除尾巴

else{

gameOver=true;//没有遇到食物或者空,则表示游戏结束

break;

}

erasingTheHear(LEFT);

break;

caseRIGHT:

if(FOOD==map[hearY][hearX+1])//吃到食物

againFood();

elseif(EMPTY==map[hearY][hearX+1])//什么都没遇到

erasingTheTail();//擦除尾巴

else{

gameOver=true;//没有遇到食物或者空,则表示游戏结束

break;

}

erasingTheHear(RIGHT);

break;

default:

break;

}

}

voidRetroSnaker:

:

move(charch)

{

directionMap[hearY][hearX]=ch;

move();

}

voidRetroSnaker:

:

Init()

{

inti=0,j=0;

gameOver=false;

eatFood=false;

for(i=0;i

for(j=0;j

map[i][j]=EMPTY;//清空二维数组

directionMap[i][j]=EMPTY;//清空方向图

}

for(i=0;i

map[0][i]=WALL;

map[N-1][i]=WALL;

map[i][0]=WALL;

map[i][N-1]=WALL;

}

//初始化蛇头

hearX=N/2;

hearY=N/2;

map[hearY][hearX]=HEAR;

directionMap[hearY][hearX]=RIGHT;//记录蛇头的移动方向

//初始化蛇尾

tailX=N/2-1;

tailY=N/2;

map[tailY][tailX]=TAIL;

directionMap[tailY][tailX]=RIGHT;//记录蛇尾的移动方向

//初始化食物

srand(unsigned(time(NULL)));//随机播种

do{

foodX=rand()%(N-1)+1;//产生随机数1~(N-1)

foodY=rand()%(N-1)+1;

}while(EMPTY!

=map[foodY][foodX]);

map[foodY][foodX]=FOOD;

//首次显示游戏界面

for(i=0;i

for(j=0;j

switch(map[i][j])

{

caseWALL:

cout<<"■";break;

caseHEAR:

cout<<"○";break;

caseBODY:

caseTAIL:

cout<<"●";break;

caseFOOD:

cout<<"★";break;

default:

cout<<"";

break;

}

cout<

}

}

voidRetroSnaker:

:

gotoXY(intx,inty)

{

COORDcoord;

coord.X=2*x;

coord.Y=y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);

}

voidRetroSnaker:

:

againFood()

{

srand(unsigned(time(NULL)));//随机播种

do{

foodX=rand()%(N-1)+1;//产生随机数1~(N-1)

foodY=rand()%(N-1)+1;

}while(EMPTY!

=map[foodY][foodX]);

map[foodY][foodX]=FOOD;

gotoXY(foodX,foodY);

cout<<"★";

}

voidRetroSnaker:

:

erasingTheTail()

{

gotoXY(tailX,tailY);//擦除尾巴

cout<<"";

map[tailY][tailX]=EMPTY;

if(UP==directionMap[tailY][tailX]){

directionMap[tailY][tailX]=EMPTY;

tailY--;

}

elseif(DOWN==directionMap[tailY][tailX]){

directionMap[tailY][tailX]=EMPTY;

tailY++;

}

elseif(LEFT==directionMap[tailY][tailX]){

directionMap[tailY][tailX]=EMPTY;

tailX--;

}

else{

directionMap[tailY][tailX]=EMPTY;

tailX++;

}

map[tailY][tailX]=TAIL;

}

voidRetroSnaker:

:

erasingTheHear(charch)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1