C课程设计迷宫小游戏.docx

上传人:b****4 文档编号:24313574 上传时间:2023-05-26 格式:DOCX 页数:34 大小:500.48KB
下载 相关 举报
C课程设计迷宫小游戏.docx_第1页
第1页 / 共34页
C课程设计迷宫小游戏.docx_第2页
第2页 / 共34页
C课程设计迷宫小游戏.docx_第3页
第3页 / 共34页
C课程设计迷宫小游戏.docx_第4页
第4页 / 共34页
C课程设计迷宫小游戏.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

C课程设计迷宫小游戏.docx

《C课程设计迷宫小游戏.docx》由会员分享,可在线阅读,更多相关《C课程设计迷宫小游戏.docx(34页珍藏版)》请在冰豆网上搜索。

C课程设计迷宫小游戏.docx

C课程设计迷宫小游戏

温馨提示

程序语言:

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

图形功能选项:

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

数据结构:

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

C++语言项:

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

编译环境:

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

集成开发环境:

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

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

分多头文件编译:

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

容说明:

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

2、代码行数:

525行

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

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

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

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

题目:

基于C++控制台游戏的设计

任务要求:

1.代码量不低于300行,至少有5个函数,不得存在重复代码。

2.游戏设计具有一定可玩性,设计至少3关,界面和交互性友好,不得存在BUG。

3.每个人书写一份课程设计报告,报告中包含如下容:

(1)题目简介(一段题目的简单介绍,一段题目开发的硬软要求)

(2)功能模块划分

(3)界面设计

(4)详细设计(流程图,或代码,每一部分代码要有相应的文字说明)

(5)遇到的问题及解决办法(5个问题以上)

(6)总结与展望

 

本课设文档基于迷宫游戏进行课程设计。

运行截图如下:

 

课程设计报告

 

课题:

学院:

专业:

学生:

学号:

指导老师:

 

20XX年XX月XX日

 

1题目简介1

2功能模块划分2

3界面设计3

4详细设计6

4.1数据结构6

4.2函数说明6

4.3函数设计流程图7

5遇到的问题及解决办法10

6总结与展望11

附录12

1题目简介

人类建造迷宫已有5000年的历史。

在世界的不同文化发展时期,这些奇特的建筑物始终吸引人们沿着弯弯曲曲、困难重重的小路吃力地行走,寻找真相。

迷宫小游戏应运而生。

在游戏中,迷宫被表现为寻找出口的一种益智小游戏。

本课设用★代表人物,○代表出口,■代表围墙,其他制表符(例如:

━、┃、┳等)用来构造道路和阻挡玩家的去路。

玩家要在游戏中,通过复杂的道路找到出口方可胜利。

本游戏一共设计3关,难度由低逐渐提升。

本课设开发基于Windows764位系统,集成开发环境VisualStudio2015Pro。

 

2功能模块划分

本游戏一共分为四个功能模块,分别是开始界面的显示、进行游戏、下一关和通关界面的显示。

1、首先,打开程序的时候会进入一个欢迎界面,按任意键即可开始游戏。

2、玩家通过wsad控制人物(★)的上下左右。

3、每当玩家到达出口(○)会自动显示通过本关卡,并等待玩家按任意键进行下一关游戏。

4、当玩家通过所有的关卡时,将会显示一个通关界面。

具体的功能模块图如下:

 

3界面设计

本程序完全通过文本模式进行,根据上述四大功能模块,需要设计四类用户界面,分别是开始界面,游戏界面,下一个界面,游戏结束界面。

1、首先就是最基本的用户欢迎界面,也称开始界面,如下图3.1所示。

图3.1开始界面

2、其次,就是本程序的关键,也是这个游戏的核心所在,游戏交互界面,如下图3.2所示。

图3.2游戏交互界面

3、接着,就是通过本关卡之后的界面,如图3.3所示。

图3.3通关界面

4、最后,就是通过所有关卡的游戏界面,如图3.4所示。

图3.4游戏通关界面

4详细设计

4.1数据结构

该迷宫小游戏只需设计一个类即可控制整个游戏的运行,通过分析,迷宫小游戏需要一个构造函数Maze()对游戏数据进行初始化,一个显示开始界面的函数ShowUI(),一个绘制游戏界面的函数ShowGame(),一个初始化下一关数据的函数NextCheckpoint(),一个控制人物移动的函数Move(),其过Rand()管理各关卡的地图数据,一个游戏结束界面函数GameOver(),还需要一个Game()函数控制游戏的开始与结束逻辑。

在整个设计中,通过二维数组来映射各种文本字符(★、■等),其中映射数据通过宏定义来实现,这样方便管理与维护。

类的数据结构如下:

classMaze{

public:

Maze();//构造函数,初始化关卡数据

voidShowUI();//显示迷宫开始界面

voidGame();//游戏开始

voidShowGame();//显示游戏界面

voidGameOver();//通关所有关卡,显示游戏结束界面

voidMove();//移动

voidNextCheckpoint();//下一关

private:

intmap[DIMENSION][DIMENSION];//记录关卡地图

intcheckpoint;//记录当前关卡

intx,y;//记录人物在迷宫中的坐标

voidRand();//产生新地图

};

4.2函数说明

迷宫程序设计的函数都是类Maze的成员函数,分别是Maze()、voidShowUI()、voidGame()、voidShowGame()、voidGameOver()、voidMove()、voidNextCheckpoint()、voidRand()。

1、Maze()属于构造函数,初始化第一关的游戏数据,例如人物★的x,y坐标,第一关的游戏地图数据等。

2、ShowUI()展示欢迎进入游戏的界面。

3、Game()控制游戏的进程,比如游戏开始、游戏进行中和结束的函数过程,是程序连贯的关键函数。

4、ShowGame()打印游戏进行中的界面。

5、GameOver()打印游戏结束界面,并结束程序的运行。

6、Move()获取键盘的按键信息,控制人物★在二维数组中的位置,是该游戏程序的核心函数。

7、NextCheckpoint()控制当前是第几关,并可调用Rand()对下一关的地图数据进行初始化。

8、Rand()用来初始化每一个的地图信息和人物位置信息,通过Rand()可方便关卡的增减修改,利于维护。

以下是Game()成员函数的代码,代码质量风格良好。

voidMaze:

:

Game()

{

do{

if(CHECKPOINT==checkpoint)

GameOver();//游戏通关

elseif(RAILING13==map[y][x])

NextCheckpoint();//下一关

else{

ShowGame();//打印迷宫

Move();//移动

}

}while(true);

}

4.3函数设计流程图

迷宫程序设计的函数都是类Maze的成员函数,分别是Maze()、voidShowUI()、voidGame()、voidShowGame()、voidGameOver()、voidMove()、voidNextCheckpoint()、voidRand()。

其中,比较核心的两个函数(Game()与Move()函数)的程序流程图如下所示:

 

 

 

5遇到的问题及解决办法

1、游戏开始设计的时候,不知道如何对控制台进行清屏操作,导致游戏界面比较乱。

通过查阅网上资料,了解到了system(“cls”)函数可实现控制台界面的清屏操作,这

样看起来便简洁了很多。

2、本程序一开始通过cin函数进行键盘按键的读入,导致游戏无法连贯运行。

通过查阅网上资料,_getch()函数,从键盘获取一个按键,但不回显在屏幕上,完成

了游戏的实时运行操作。

3、标记人物★的x,y坐标经常与数组的行列混淆,老是出现map[x][y]这样的错误。

通过细心观察和总结,加深对知识的了解和运用,避免类似这样的非语法错误,养

成良好的代码习惯,下面再说一次map[y][x]才是正确的写法。

4、游戏结束的逻辑思路一直没连贯起来,导致程序进入死循环。

通过查阅相关资料,知道exit(0)可以在代码的任何位置结束程序的运行。

5、由于基础的不扎实以及考虑的不够全面,一开始在Move()的时候只进行了小写字母wsad按键的处理,没有处理大写的WSAD按键,这样会导致大写的时候,无法控制游戏人物的移动。

通过刻苦的学习,在switch里面每个的casew:

上下,再增加一行caseW:

即可,这

样执行同样的代码就无须再复制粘贴一遍了,或者再写一个函数解决。

6总结与展望

在做这个课程设计的时候,我感觉我就像迷宫里的★一样,通过解决一个个的问题,最后通过了一关关的关卡,得到了游戏的胜利。

一路走来着实不易,在一次次调试奔溃中躺过,如果不是老师和同学们的指导和帮助,或许我已经放弃了前进。

这次小游戏的开发,是我人生中的一次淬炼,是我迈向一名出色工程师的试炼。

无数个日日夜夜的积累与奋斗在这次开发中反映的淋漓尽致,人生也像课程设计一样,不能缺少规划和磨练。

只有坚持奋斗,克服一个个困难,才能到达最后的终点,品味风雨后的彩虹。

在此次开发设计中,我领悟了很多的道理,收获了很多以往在课堂上得不到的心得和感悟,也提高了我对C++的兴趣,完成一件作品的成就感不言而喻。

以后,我一定会好好学习,加强自己对软件开发的学习,提高自己的编程能力,成为一名出色的工程师,在C++编程的世界大放异彩。

在此,我要感所有帮助过我的同学和指导老师们,你们的鼓励和帮助是我成功的动力。

 

 

 

附录

用户使用手册

1、根据提示,按任意键即可开始游戏。

2、根据提示,按wsad即可进行游戏的操作。

程序源代码

#include

#include

#include

#include

#defineCHECKPOINT3//第3关通关,即最后一关通关,表示总关卡数

#defineDIMENSION20//迷宫地图数组大小

//定义栏杆

#defineACCESS0//表示迷宫中可以走动的路

#defineRAILING11//栏杆━

#defineRAILING22//栏杆┃

#defineRAILING33//栏杆┏

#defineRAILING44//栏杆┗

#defineRAILING55//栏杆┓

#defineRAILING66//栏杆┛

#defineRAILING77//栏杆┣

#defineRAILING88//栏杆┫

#defineRAILING99//栏杆┳

#defineRAILING1010//栏杆┻

#defineRAILING1111//栏杆╋

#defineRAILING1212//人物★

#defineRAILING1313//出口○

#defineRAILING1414//墙■

usingnamespacestd;

classMaze{

public:

Maze();//构造函数,初始化关卡数据

voidShowUI();//显示迷宫开始界面

voidGame();//游戏开始

voidShowGame();//显示游戏界面

voidGameOver();//通关所有关卡,显示游戏结束界面

voidMove();//移动

voidNextCheckpoint();//下一关

private:

intmap[DIMENSION][DIMENSION];//记录关卡地图

intcheckpoint;//记录当前关卡

intx,y;//记录人物在迷宫中的坐标

voidRand();//产生新地图

};

//主函数入口

intmain(void)

{

Mazem;

m.ShowUI();//显示初始界面

m.Game();//游戏开始

return0;

}

Maze:

:

Maze()

{

checkpoint=0;//第一关

Rand();

system("cls");

}

voidMaze:

:

ShowUI()

{

cout<

cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━┓"<

cout<<"┃┏━━━━━━━━━━━━━━━━━━━━━┓┃"<

cout<<"┃┃┃┃"<

cout<<"┃┃┃┃"<

cout<<"┃┃┃┃"<

cout<<"┃┃┃┃"<

cout<<"┃┃欢迎进入小游戏┃┃"<

cout<<"┃┃┃┃"<

cout<<"┃┃┃┃"<

cout<<"┃┃请按任意键继续......┃┃"<

cout<<"┃┃┃┃"<

cout<<"┃┃┃┃"<

cout<<"┃┃┃┃"<

cout<<"┃┗━━━━━━━━━━━━━━━━━━━━━┛┃"<

cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━┛"<

_getch();

}

voidMaze:

:

Game()

{

do{

if(CHECKPOINT==checkpoint)

GameOver();//游戏通关

elseif(RAILING13==map[y][x])

NextCheckpoint();//下一关

else{

ShowGame();//打印迷宫

Move();//移动

}

}while(true);

}

voidMaze:

:

ShowGame()

{

inti=0,j=0;

system("cls");

cout<

for(i=0;i

for(j=0;j

switch(map[i][j])

{

caseACCESS:

cout<<"";break;

caseRAILING1:

cout<<"━";break;

caseRAILING2:

cout<<"┃";break;

caseRAILING3:

cout<<"┏";break;

caseRAILING4:

cout<<"┗";break;

caseRAILING5:

cout<<"┓";break;

caseRAILING6:

cout<<"┛";break;

caseRAILING7:

cout<<"┣";break;

caseRAILING8:

cout<<"┫";break;

caseRAILING9:

cout<<"┳";break;

caseRAILING10:

cout<<"┻";break;

caseRAILING11:

cout<<"╋";break;

caseRAILING12:

cout<<"★";break;

caseRAILING13:

cout<<"○";break;

caseRAILING14:

cout<<"■";break;

default:

break;

}

if(DIMENSION-1==j)//换行

cout<

}

cout<

}

voidMaze:

:

GameOver()

{

system("cls");

cout<

cout<<"┏━━━━━━━━━━━━━━━━┓"<

cout<<"┃┃"<

cout<<"┃┃"<

cout<<"┃┃"<

cout<<"┃┃"<

cout<<"┃恭喜你已经通关┃"<

cout<<"┃┃"<

cout<<"┃┃"<

cout<<"┃┃"<

cout<<"┃┃"<

cout<<"┗━━━━━━━━━━━━━━━━┛"<

_getch();

exit(0);

}

voidMaze:

:

Move()

{

switch(_getch()){

case'w':

//向上移动

case'W':

if(y>0&&ACCESS==map[y-1][x]){

map[y][x]=ACCESS;

map[--y][x]=RAILING12;

}

elseif(y>0&&RAILING13==map[y-1][x])//出口不覆盖数据

--y;

break;

case's':

//向下移动

case'S':

if(y

map[y][x]=ACCESS;

map[++y][x]=RAILING12;

}

elseif(y

++y;

break;

case'a':

//向左移动

case'A':

if(x>0&&ACCESS==map[y][x-1]){

map[y][x]=ACCESS;

map[y][--x]=RAILING12;

}

elseif(x>0&&RAILING13==map[y][x-1])

--x;

break;

case'd':

//向右移动

case'D':

if(x

map[y][x]=ACCESS;

map[y][++x]=RAILING12;

}

elseif(x

++x;

break;

}

}

voidMaze:

:

NextCheckpoint()

{

checkpoint++;

if(checkpoint>=CHECKPOINT)

return;

Rand();

system("cls");

cout<

"<

_getch();

}

voidMaze:

:

Rand()

{

inti=0,j=0;

for(i=0;i

for(j=0;j

map[i][j]=ACCESS;

for(i=0;i

map[i][0]=RAILING14;

map[i][DIMENSION-1]=RAILING14;

map[0][i]=RAILING14;

map[DIMENSION-1][i]=RAILING14;

}

switch(checkpoint){

case0:

//第一关

map[9][0]=RAILING12;//人物位置

map[9][DIMENSION-1]=RAILING13;//出口位置

x=0;//记录人物的x,y坐标

y=9;

//┃

for(i=3;i<8;i++){

map[i][2]=RAILING2;

map[i][8]=RAILING2;

map[i][10]=RAILING2;

map[i][17]=RAILING2;

}

//┃

for(i=11;i<17;i++){

map[i][2]=RAILING2;

map[i][8]=RAILING2;

map[i][10]=RAILING2;

map[i][17]=RAILING2;

}

//━

for(i=3;i<8;i++){

map[2][i]=RAILING1;

map[8][i]=RAILING1;

map[10][i]=RAILING1;

map[17][i]=RAILING1;

}

//━

for(i=11;i<17;i++){

map[2][i]=RAILING1;

map[8][i]=RAILING1;

map[10][i]=RAILING1;

map[17][i]=RAILING1;

}

//┏

map[2][2]=RAILING3;

map[10][2]=RAILING3;

map[2][10]=RAI

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

当前位置:首页 > 成人教育 > 自考

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

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