C语言编程小游戏毕业论文李俊佶.docx
- 文档编号:12518465
- 上传时间:2023-04-19
- 格式:DOCX
- 页数:20
- 大小:145.33KB
C语言编程小游戏毕业论文李俊佶.docx
《C语言编程小游戏毕业论文李俊佶.docx》由会员分享,可在线阅读,更多相关《C语言编程小游戏毕业论文李俊佶.docx(20页珍藏版)》请在冰豆网上搜索。
C语言编程小游戏毕业论文李俊佶
密级
公开
本科生毕业(学位)论文
基于C语言的小游戏设计
李俊佶
(2009061322)
指导教师姓名:
叶晶晶
职称:
单位:
物理与电子科学系
专业名称:
电子信息工程
论文提交日期:
2012年月日
论文答辩日期:
2012年月日
学位授予单位:
黔南民族师范学院
答辩委员会主席:
论文评阅人:
20年月日
基于C语言的小游戏设计
------十字消方块
李俊佶
(2009061322)
(黔南民族师范学院物理与电子科学系,贵州,都匀,558000)
摘要:
本文研究的主要内容是在具备C语言知识的前提下,如何应用C语言编写一个完整的小游戏,以达到让自身所学知识得到充分运用和发挥的目的。
在此,通过使用C语言编写了一个名为“十字消方块”的新颖小游戏,完整的展现了一个小游戏项目开发的全过程。
编程过程中每一个编程技巧的运用都是对编程者逻辑思维能力和综合应用能力的考验。
关键词:
C语言;小游戏;十字消方块;项目开发;WIN-TC
BasedontheClanguagelittlegamedesign
------Crossawaysquare
Lijun-ji
(2009061322)
(PhysicalandelectronicScience,QiannanNormalCollegeforNationalities,Duyun558000,Guizhou)
Anstract:
ThispaperstudiesthemaincontentistheClanguageknowledgewiththepremiseofhowtouseClanguagetowriteacompletelittergame,inordertoachievetheirowmknowledgeforthepurposeoffullyuse.Here,througntheuseofClanguagetowriteacalled”crossawaysquare”nocellittergame,completeshowedasmallgameprojectdevelopmentprocess.Intheprocessofprogrammingeveryprogrammingusetheskillsofprogrammingislogicalthinkinganilityandcomprehensiveapplicationanilitytest.
Keywords:
C;game;crossawaysquare;development;WIN-TC
1引言
游戏的设计与开发可以利用多种方法,java、C/C++、Flash、VB等语言都可开发出不同类型的游戏软件。
这些方法都有其优点,通常根据具体情况进行选择。
在众多语言和方法中,C语言兼具一般高级语言和低级语言优点,编写游戏程序具有非常鲜明特点。
使用C语言编写游戏程序,可以接触到更为底层的编程知识,对于学习计算机语言有很大好处。
C语言是CombinedLanguage(组合语言)的中英混合简称。
是一种计算机程序设计语言。
它既具有高级语言的特点,又具有汇编语言的特点。
它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
它的应用范围广泛,具备很强的数据处理能力。
本着研究学习的心态,以C语言编写一个小游戏程序,深入到图形编程和文件应用的实际操作中,达到务实基础,挑战自我的目的。
下面,我将一步步的带领大家看到“十字消方块”游戏开发的全过程。
2.前期准备及需求分析
2.1游戏介绍
“十字消方块”的灵感来自我闲暇时在3366小游戏网站内见到的一款竞技类小游戏。
顾名思义,这款小游戏是以方向键控制游戏标准放到合适位置,在十字线区域能连接到两个或者两个以上纹理相同的方块就能消除得分。
玩家在时间的限制下需要迅速找到可以消除的方块并准确消除,若错误将扣除时间。
看似简单,却有一定的难度。
常玩这一类小游戏可以锻炼人的观察力、反应力和手眼协调能力,开发大脑潜能。
十字消方块趣味性强,老少皆宜,且同类游戏在各小游戏网站都很有人气,相信它同样能得到大家的喜爱。
2.2编程语言—C语言
C语言兼有高级语言与低级语言的优点,具有强大的编程运算能力。
首先,C是一种结构化语言,程序层次清晰,便于使用、维护以及调试;第二,C语言运算符和数据结构丰富,能用来实现各种复杂数据结构的运算;第三,程序书写形式自由、灵活方便,允许程序编写者有较大的发挥空间;第四,引入了指针概念,使程序效率更高;第五,C语言程序执行效率高,一般只比汇编程序生成的目标代码效率低10へ20%;另外,C语言还具有强大的图形功能,支持多种显示器和驱动器。
且计算功能、逻辑判断功能强大。
总而言之,用C语言来编写一个小游戏绰绰有余,绝对可以让编程者想要的任何游戏功能实现。
2.点击文件,找到后缀为.c的游戏程序文件,点击选取后打开。
3.在软件运行画面的右上角,找到如下图所示的两个按钮,依次点击,确定,可运行游戏程序。
观察结果。
图2:
软件中的编译与执行按钮
4.注意:
当程序使用了
2.4游戏需求分析
1.项目描述
要求用C语言开发一个游戏“十字消方块”。
游戏规则为:
按方向键移动光标至一个无方块位置,以该光标位置看,在一个十字形区域中,若离光标位置最近的四个方块至少有其二相等,则可按SPACE键进行连线消除得分,一次性消除的方块越多得分越多。
若按键后不能消除为错误操作,将扣除游戏时间。
时间结束,游戏结束。
2.界面
(1)start界面
该界面用画图的方式对游戏方法及其规则进行了说明,按任意键后开始游戏。
(2)游戏界面
程序用一个初始化函数来初始化游戏界面,棋盘为15行,15列,共有112块方块。
上方为进度条,下方为游戏提示信息。
(3)游戏结束界面
用户成功完成游戏或时间结束后,在界面正中显示“yoursroce:
xxxx”。
(xxxx为游戏得分)
另外,用户在游戏过程中按ESC显示“gameover!
”退出游戏。
3.功能
(1)游戏操作
按方向键
移动光标至合适位置,按SPACE键进行连线消除得分。
(2)游戏结束
共有3种结束方式:
时间结束:
当时间进度条走完时,游戏结束,并显示得分。
方块结束:
在所有方块均不能消除时,游戏结束,并显示得分。
强行结束:
按ESC结束程序,并显示“gameover!
”后退出。
(3)进度条显示当前剩余时间
自动获取系统时间,更新进度条时,设置为某个百分比,用背景色进行填充,以达到减少时间的目的。
4.环境
(1)硬件环境:
处理器,内存,磁盘,显示器
(2)软件环境:
必须使用wintc或turboc软件编译游戏
3编程实现
3.1重要的文件、函数和变量说明
3.1.1
graphics.h文件是tc中的图形库,游戏界面中的图形绘制都是利用这个头文件中所包含的函数来完成的。
3.1.2函数介绍
1.bioskey函数
该函数是bios.h头文件中接口函数,函数的功能是在游戏过程中提取键值。
2.initgraph函数和closegraph函数
initgraph函数的功能是初始化图形系统。
声明这个函数是使用graphics.h文件中画图函数的必要条件。
而closegraph函数的功能是关闭图形系统
3.outtextxy函数
该函数的功能是在屏幕上指定的位置输出一串字符。
游戏中可见的提示信息均由这个函数来实现。
4.setcolor函数
该函数的功能是设置当前画笔的颜色,游戏界面绘制的图形输出的文字字符的颜色都是用这个函数来控制。
它的参数color为不同值时表示不同的颜色,如下表所示:
表1:
color参数说明
参数
说明
参数
说明
0
BLACK黑
1
BLUE兰
2
GREEN绿
3
CYAN青
4
RED红
5
MAGENTA洋红
6
BROWN棕
7
LIGHTGRAY淡灰
8
DARKGRAY深灰
9
LIGHTBLUE淡兰
10
LIGHTGREEN淡绿
11
LIGHTCYAN淡青
12
LIGHTRED淡红
13
LIGHTMAGENTA淡洋红
14
YELLOW黄
15
WHITE白
5.srand函数与random函数
random函数是随机数发生器,功能是产生一个规定数以内的随机数。
它能帮助我在游戏中绘制出随机的游戏方块,实现游戏关卡的多样化。
而srand函数是随机数发生器的初始化函数
6.gettime
该函数的功能是取得系统时间,由此设置出了游戏的时间系统。
7.getch函数
该函数的功能是从控制台无回显示地取一个字符。
游戏程序需要在结尾加上这个函数,才能观看到运行结果。
3.1.3重要变量说明
1.枚举类型变量KEYCODES
它枚举了游戏所用到按键的物理地址,是游戏者与游戏之间联系的关键。
enumKEYCODES
{
K_ESC=0x011b,
K_UP=0x4800,
K_LEFT=0x4b00,
K_DOWN=0x5000,
K_RIGHT=0x4d00,
K_SPACE=0x3920,
};
2.三维数组Board[][][]
在绘制游戏界面的过程中,需要对界面上每一个坐标是否有游戏方块的情况做标记,于是就需要定义一个三维数组Board并在初始化游戏时赋值来达到这个目的。
在Board[x][y][0]中存放的值为0,则表示坐标(x,y)上没有方块。
为1,则表示有方块。
在Board[x][y][1]中则存放了方块的键,表示了该方块的类型。
该值在游戏用来判断游戏操作是否得分。
3.结构体变量CELL
变量CELL存储的是方块的逻辑坐标,游戏初始化和进行中都常调用他。
3.2主要功能实现
3.2.1主函数
程序运行时,首先从main函数处开始游戏流程,流程中调用了几个自定义函数。
按照先后顺序分别为:
游戏提示画面函数start,游戏界面初始化函数InitGame,表示剩余时间的进度条初始化函数InitProgressBar,游戏进行函数PlayGame和结束游戏QuitGame函数。
建立起一个完整清晰的流程模式。
主流程图下图所示:
图3:
main函数流程图
3.2.2游戏开始界面初始化
在执行主函数main时,首先调用的是start函数。
该函数在游戏开始前执行,对游戏规则进行了画图说明(相当于游戏帮助)。
在start中,首先进行了图形系统的初始化,然后使用了setfillstyle函数为图形输出设置当前文本的属性,再使用outtextxy函数和rectangle等函数分别在指定位置画出特定的字符和图案。
3.2.3游戏界面初始化
start函数执行完毕后,将对游戏界面进行初始化,包括时间、游戏方块的初始化,而进度条初始化较为复杂,另定义一个InitProgressBar函数为其初始化。
在InitGame函数中,先用memset函数对三位数组Board所代表的空间全部清零,防止原内存空间内的数据对其造成影响。
而后又使用srand函数和random函数取得随机数,使用该数作为种子为游戏绘制特定的方块。
最后使用gettime函数提取了系统时间,并对游戏时间完成初始化。
3.2.4游戏进行
1.PlayGame函数
PlayGame函数(代码见附录)是整个游戏的最重要的部分,用户对游戏的操作和游戏时间的更新控制等都是在该函数中实现。
整体可分为两个部分,时间控制部分和游戏执行部分。
在函数执行过程中,当检测到一个按键且不为ESC时即开始计时,于此同时获取该键键值,进行相应游戏操作。
进度条走完后,则显示游戏得分并结束游戏。
下图为该函数的结构示意图:
图4:
PlayGame函数的具体结构
2.核心算法
Decide函数的判断功能是游戏进行中的核心,可以说是游戏规则的执行者。
当游戏者把光标移动到正确位置并且按下SPACE空格键时,函数判断是否符合规则中指明的条件,符合则连线消除方块加分,不符合则扣除一定游戏时间。
该部分算法对编程者的逻辑思考能力有很大的考验,需要考虑到游戏过程中可能出现的每一种情况并做出相应的动作。
该算法示意图如下图所示:
图5:
Decide函数的主要结构
(1)十字方向上四个方块的坐标的计算:
观察该函数的流程图可以得知,要判断游戏者按下SPACE键后,是否符合得分规则,即光标上下左右四个方位上离光标最近的四个方块是否至少有两个相同,就必须先找到这个四个方块的逻辑坐标。
由附录中PlayGame函数的程序得知,光标即游戏程序中的focus的逻辑坐标是已知的,要找到这个四个方块的逻辑坐标,可以从已知的这个坐标着手。
在程序中,focus的逻辑坐标储存在名为c1的结构体中,结构体的两个成员x和 y就是它的逻辑坐标。
而四个方向上的方块的坐标分别是(wmin,c1->y)、(wmax,c1->y)、(c1->x,hmin)(c1->x,hmax)。
故此,只要计算出wmin、wmax、hmin、hmax四个变量的值就可以达到目的。
而下面的程序段就解决了这个问题。
程序代码如下:
/*---------------查找水平方向遇到两个方块的坐标-----------*/
wmin=wmax=c1->x;/*将focus点的横坐标赋值给wmin和wmax*/
while(wmin>=0)/*当向左移动并未到边界时*/
{
wmin--;/*wmin--,既继续向左搜索*/
if(Board[wmin][c1->y][0]!
=0)/*如果该坐标上有方块,则跳出循环*/
break;
}
while(wmax { wmax++;/*wmax--,既继续向右搜索*/ if(Board[wmax][c1->y][0]! =0)/*如果该坐标上有方块,则跳出循环*/ break; } 同理,亦可找到垂直方向上两个方块的坐标。 、 (2)实现14种消除算法: 得到这些方块的坐标后,就要将这些方块做比较,检测这些方块是否符合得分逻辑。 然而,在游戏程序的初始化函数InitGame中,就已经将这些坐标上的方块的属性标记在Board[x][y][1]中了,我们可以通过其中的值来做判断它们是否是同一类型的方块。 剩下的,就是分析清楚游戏可能出现的所有得分情况而后整理编程就可以了。 若从不同方向和同时消除不同数量的方块上分,共有14种情况。 而只按同时消除的方块数量分则分为以下几类: 1.四个方块中只有两个方块相同,其它两块不相同。 从方向上再分,包含6种不同情况。 2.四个方块中有两块相同,其它两块也相同。 从方向上再分,包含2种情况。 3.四个方块中有三个方块相同。 从方向上再分,包含4种情况。 4.四个方块都相同。 只有一种情况。 5.四个方块各不相同。 只有一种情况。 下面,就举当(c1->x,[hmin)、(c1->x,hmax)、(wmin,c1->y)坐标处三个方块相同的一种情况来说明算法思路。 程序代码如下: if(hmin! =-1&&Board[c1->x][hmin][1]==Board[c1->x][hmax][1]&& Board[c1->x][hmax][1]==Board[wmin][c1->y][1]&&Board[c1->x][hmin][1]! =Board[wmax][c1->y][1])/*三个方块相同且在边界以内*/ { /*在focus与方块之间画线,延时后消除,使其呈现射击效果*/ DrawPath3(c1->x,c1->y,c1->x,hmin,c1->x,hmax,wmin,c1->y,LineColor); delay(6000); DrawPath3(c1->x,c1->y,c1->x,hmin,c1->x,hmax,wmin,c1->y,BkGndColor); EraseCell(wmin,c1->y);/*将相同的这三个方块消去*/ EraseCell(c1->x,hmin); EraseCell(c1->x,hmax); Board[c1->x][hmin][1]=0;/*清空三个坐标处的标记,避免对后续的游戏操作造 Board[c1->x][hmax][1]=0;成影响*/ Board[c1->x][hmin][0]=0; Board[c1->x][hmax][0]=0; Board[wmin][c1->y][1]=0; Board[wmin][c1->y][0]=0; sroce+=40;/*游戏加分*/ returntrue; } 同样,其余正确的情况也需要经过类似的过程,进行判断、画线、消除方块、清坐标数据和游戏加分操作。 错误的情况需要将游戏加分操作换为减时操作。 当所有可能的情况都设置了处理方式后,该函数的工作就全部完成了。 3.2.5其它函数 除了以上几个核心的函数以外,整个游戏的正确执行还需要其它一些自定义函数来完善,才能构成一个无缺的整体,从而正常运行。 由于篇幅的原因,这些函数不再赘述。 下面是程序还需要用到的自定义函数及其功能说明: InitProgressBar();/*初始化进度条*/ UpdateProgressBar(intpercent);/*设置一个百分比,更新进度条*/ DrawCell(intkey,intx,inty,intcolor);/*在x,y处用指定颜色绘制键为key的方块*/ EraseCell(intx,inty);/*消除该坐标点上的方块*/ DrawBorderRect(CELL*c,intcolor);/*用制定颜色绘制focus即光标*/ DrawGameOver(char*info,intsroce);/*在界面中心显示游戏得分*/ GetKeyCode();/*取键值*/ 4结束语 在经过将近一个多月的时间之后,这一款小游戏终于初步完成了。 通过这一个不太轻松的过程里,我知道了要完成一个简单的小游戏也是不简单的,并没有想象中的那么容易完成。 我是在大一时候开始学习C语言的,初时接触,就深深的喜欢上了这门课,语言程序就像是有生命般,每一次运行,它都一丝不苟的完成你赋予的任务。 若是有错,你就得像一个医生一样对它进行检查、调试,然而我最喜欢这样的过程。 作为一名电子信息工程专业的学生来说,C语言相对于其它语言来说更值得深究学习。 因为在将来的工作和学习中就需要C语言来进行硬件编程。 另外,C语言是学习计算机语言的基础,很好的掌握C语言对于以后学习其它语言有着非常重要的作用。 在编程的过程中,我学习到很多原来不知道的知识,对C语言这种结构化程序设计语言的理解和把握比以前有了很大的提高。 过去学到的很多知识也到了相应的锻炼,真正成为了我自己的东西。 但我也遇到很多原来没有发现过的问题。 VC++何以不能编译带graphics文件的程序? 如何在编译图形程序时观看到结果? 怎么用C语言产生一个随机数? 如何调用系统时间? 这些问题到现在已经得到解决。 同样,我也还有一些依旧没有找到答案的问题。 比如怎样改变C语言编译器产生的可执行文件的图标? 那默认的白板图标真的很丑。 如何做到在图形模式下动态显示时间? 怎样让上一次的游戏数据保存起来,用来编程“英雄榜”? 这些问题,现在我没有找到答案,但是我相信在不久的将来,我一定能使用C语言完成这些功能,让我的游戏、我的程序项目更加强大,更加完美。 期间我查阅了很多资料和书籍,这些资料真的对我的帮助很大,其中很多功能的实现我都找到了相关的资料,让我省去了很多功夫,只需认真的理解资料中的编程结构便可以轻松的得到自己想要的结果。 但是,其中更多是靠着我自己去慢慢琢磨,通过一次一次的调试、修改、再调试、再修改,经过成百上千次调试过后,才最终成功的。 整个过程中,Decide函数的编写是消耗我时间最多的地方,因为这个地方的编写完全没有找到一点资料来借鉴。 虽然涉及的编程技巧不多,但却最考验我的逻辑思维能力,消除方块时一共有14种不同的情况,每一种情况都要考虑到。 游戏界面上每一个点的坐标,尤其是边界坐标的确定,都很可能会让人晕头转向。 现在十字消方块游戏已经可以正常的运行了。 但是也肯定还存在很多问题,许多功能需要得到完善。 直到现在,我在试玩游戏的过程中,都还会偶尔出现小bug,但我却无法确定是哪一行代码出了问题,还是算法有漏洞。 经过这段时间的学习,我深深的感觉到我所掌握的C语言知识都还只是冰山一角,博大精深C语言,今后的学习中还需要多加努力才行。 我相信,通过我的努力,要不了多少时间,现在遇到的这些问题都可以迎刃而解。 我也相信,在不久的将来,我可以在这一片领域中站稳脚跟,享受编程过程中的无上乐趣。 5.参考文献 [1]刘彬彬,李伟明.C语言开发实战宝典.清华大学出版社,2011.1 [2]谭浩强著.C程序设计(第三版).清华大学出版社,2005.7 [3]荣钦科技.VisualC++游戏编程基础.电子工业出版社社,2005.5 [4]李晓远贾滇昆郭庆民.VisualC++多媒体特效制作百例.中国电力出版社,2001.5 [5][美]AndreLamothe著.Windows游戏编程大师技巧.中国电力出版社,2004.7 [6]浦滨.C游戏编程从入门到精通.北京希望出版社,2002.5 [7][美]赫伯特•希尔特.C语言大全.王子恢等译.电子工业出版社2001.9. [8]郭大海.实用C语言编程.中国电力出版社,2000.5 [9]湘沪科技.C/C++函数库查询辞典(最新版).中国铁道出版社,2007.7 指导教师: 叶晶晶讲师 附录: PlayGame函数程序代码 voidPlayGame() { inti,j,x,y,key,Ckey,percent; longcurTime; structtimesysTime; focus.x=focus.y=0;/*当前所处位置! */ DrawBorderRect(&focus,Focus); /*用一个循环检测按键! */ while(key! =K_ESC) { /*waituntilakeypressed*/ while(! (key=G
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 编程 小游戏 毕业论文 李俊佶