C语言EasyX打地鼠游戏设计

[复制链接]
92|0
手机看帖
扫描二维码
随时随地手机跟帖
cooldog123pp|  楼主 | 2022-6-25 17:57 | 显示全部楼层 |阅读模式
1游戏描述
1.1游戏背景
1.2游戏规则
1.3游戏操作
2系统设计
2.1流程图
2.2功能模块设计
2.2.1图形界面化板块
2.2.2锤子点击板块
2.2.3游戏界面初始化板块
2.2.4结束判定板块
2.3数据结构设计
2.4函数功能描述
3详细设计(程序实现)
3.1开始界面
3.2选择界面
3.3地图和游戏元素初始化
3.4锤子的设置
3.5游戏界面
3.6游戏结束界面
3.7背景音乐界面
4团队分工
5小结
5.1小组总结
5.2小组成员总结

打地鼠游戏是一款非常有趣的休闲敏捷类游戏,单人操作,适用于生活休闲,训练敏捷速度,操作简单、易于上手。玩家可以移动鼠标控制锤子点击,通过击中随机出洞的地鼠,积分。

1.2   游戏规则

共分为两种结束条件,只要有一个条件成立,游戏即结束。

  •      一共有五次剩余机会每错打一次减一次扣完,就算结束。
  •      倒计时60秒,时间结束,游戏也结束。
  •      如果无任何操作,地鼠在规定时间内自动下降,不加分,也不扣分。
  •      难度共分为三级,简单模式、困难模式、地狱模式,相应的速度也会增加,玩家可以在开始界面后选择难度,相应的,地鼠上升下降的速度也加快。
1.3    游戏操作

本游戏操作简单、易于上手。玩家通过移动鼠标单击左键击打地鼠即可。

若打中其他区域则剩余机会减一,减至0则游戏结束。

  • 系统设计
2.1   流程图
32.002.jpg

图1  流程图





    • 功能模块设计
2.2.1   图形界面化板块
  • 开始界面

开始界面利用loadimage、putimage完成背景贴图,同理将处理好的图片(新游戏、退出、音量键)加载贴图,并利用rectangle、setlinecolor设置白色矩形边框,鼠标移动至相应按键处变为矩形框变为红色。如图2所示:

32.003.jpg

图2  开始界面

  • 难度选择界面

同理,利用loadimage、putimage函数完成相应图片的粘贴并利用rectangle、setlinecolor设置矩形边框。如图3所示:

32.004.jpg

图3 难度选择界面

  • 游戏运行界面

将背景图裁为4部分逐一加载贴图,利用for循环依次完成小、中、大各三只地鼠的贴图,并通过图片遮盖及随机数的方式实现只有一只地鼠随机冒出。左上角设置非客户区显示得分、剩余机会、倒计时。如图4所示:

32.005.jpg

图4  游戏运行界面

  • 游戏结束界面

与开始界面相同,利用loadimage、putimage函数完成相应图片的粘贴。如图5所示:

32.006.jpg

图5  结束游戏

2.2.2   锤子点击板块

总体上是利用switch case结构,通过鼠标是否点击来判断锤子是否击打,若鼠标左键按下,则将原锤子图片替换为锤子锤下的图片。

同时,仍旧需要考虑鼠标的点击位置;在锤子移动的过程中,还需要将锤子的坐标返回,并将其与地鼠随机出现的坐标比较,若击中,则得分加1,未击中剩余机会减1。

因为锤子移动与地鼠随机冒出要同时进行,因此需要将其放入线程中。

2.2.3   游戏界面初始化板块

将背景图裁为top、mid_up、mid_down、bottom四部分,先贴三张小地鼠图片,再贴mid_up背景图,遮盖住刚才贴上的小地鼠。同理依次贴上中地鼠、mid_down、大地鼠、bottom。创建地鼠类MyDishu,并将地鼠放至数组ds[9]中,并定义方向数组bool fx[9],利用true或false使地鼠上下移动。利用for循环,使地鼠持续随机冒出并上升至一定高度后下降。通过sleep使地鼠上升至最高点处停顿。

2.2.4   结束判定板块

游戏界面左上角设置有倒计时及剩余机会。初始机会int e,初始赋值为5,地鼠冒出时锤子击打但未击中,则剩余机会减1,减至0,则游戏结束。时间int t,倒计时60s,减至0,赋e=0,游戏结束。当时间减至0,剩余机会也应当随之同时变化为0,这样才能使程序更合理,同时又统一了结束判定条件,即e是否为0。

2.3                                               数据结构设计

int e=5;

int t=60;//定义了游戏的两个结束条件,当t=0(倒计时结束)或者e=0(剩余机会为0)的时候,游戏结束

initgraph(x,y);//初始化绘图窗口,长为x,宽为y

closegraph();//关闭图形界面

IMAGE img;//定义图片img

loadimage (&img,”img.bmp”);//加载图片,从当前文件夹取出img.bmp的图片存入img

putimage(225, 90, &begin_y, SRCAND);

putimage(225, 90, &begin, SRCPAINT);

//通过掩码图和处理过的原图两者关系,在图形界面输出程序所需要的图片。先输出掩码图,在输出处理原图,顺序不可改变。

//SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。

//SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并

PlaySound("huaze.wav",NULL,SND_FILENAME | SND_ASYNC);

//播放一个名为huaze的wav文件。NULL,默认的方式播放。SND_ASYNC:用异步方式播放声音,PlaySound函数在开始播放后立即返回。但是事实上并不能用参数同时播放两个wav文件。SND_FILENAME :PlaySound参数指定了WAVE文件名。

MOUSEMSG m;m = GetMouseMsg();

//定义一个鼠标消息m,用m接受鼠标消息:m.x、m.y为鼠标当前坐标, WM_LBUTTONDOWN为鼠标左键按下操作

HCURSOR scur = (HCURSOR)LoadImage(NULL, "hammer.cur", IMAGE_CURSOR,0,0,LR_LOADFROMFILE);

HWND swnd = GetHWnd();

SetClassLong(swnd, GCL_HCURSOR, (long)scur);

//将鼠标样式初始化为锤子

#include"MyDishu.h"

//定义一个头文件,在头文件中定义地鼠坐标,并且通过设置Up、Down的函数控制地鼠的上升(出现)和下降(消失)。

//此外还添加了一个地鼠的函数,通过这个函数获取当前地鼠的x、y坐标。

2.4                                               函数功能描述

void initGame() 加载游戏的图片,包括背景,地鼠。

void drawGame() 重复画地鼠,将九只地鼠画出来,并在此函数中判断游戏是否结束,且加载了音量的开关键。

void Beging() 加载游戏背景图片,并且显示游戏的音量键开关、开始和退出的界面。

void Nandu() 加载游戏背景图片,并且显示游戏难易程度选择的界面。

void Jifen() 记录得分,并且显示剩余的机会和剩余的时间。

void Xiantiao() 加载线框(当鼠标出现在指定的位置上面时,会出现一个

指定大小的红色矩形线框)

void Kaiguan() 当鼠标出现在“开始游戏”或者“退出游戏”上面时,会出现一个红色的矩形框,当出现在其他的位置上面时,红色的矩形框不会出现,只会显示同样大小的白色矩形框。

//三个线程

DWORD broc(LPVOID lpThreadParamater) 这是一个时间的线程,显示倒计时。

DWORD proc(LPVOID lpThreadParamater) 这是一个控制地鼠出现和消失的线程。产生一个随机的0到8之间的数字,代表随机出现的一只地鼠,让其自动上升下降并且可以在上升到最高点后停留一段时间。

DWORD aroc(LPVOID lpThreadParamater) 这是一个控制锤子打下去的线程,并且在锤子打下去的时候可以判断锤子是否打中地鼠。

3         详细设计(程序实现)3.1                                               开始界面

(1)利用initgraph(630,380)初始化绘图窗口。

(2)使用loadimage函数加载四张背景图及其对应的掩码图,后使用putimage函数在坐标(0,0)处加载背景;

(3)另外还使用了EasyX的BeginBatchDraw等批量绘图的方法,是界面更加流畅。

3.2                                               选择界面

加载游戏背景的操作和开始界面的操作相同,唯一不同的是,此界面添加了游戏难度的选择,分别为一颗星,两颗星和三颗星,难度依次加大。

  • 利用initgraph(630,380)初始化绘图窗口。
  • 使用loadimage函数加载三张背景图及其对应的掩码图,后使用putimage函数在相应位置处加载难度选择背景图;
  • 当选择难度后会通过xiantiao()函数转到打地鼠的界面,开始打地鼠游戏。

3.3                                               地图和游戏元素初始化

(1)将图片分为四部分,分别做掩码和原图处理。利用initgraph(x,y);初始化图形窗口,其次在void initGame()中分别定义(IMAGE)和加载(loadimage(&图片名,“图片名.bmp”))地鼠的处理图、掩码图以及四张地图处理图、掩码图。

(2)首先利用两个putimage函数输出最上面的背景掩码图、处理图,起始坐标为原点。其次同理贴第一层地鼠(简称小地鼠)图片(地鼠的起始坐标在处理图片时已测好),利用for函数实现同一层地鼠的贴图(简化了程序,使程序更高效)。同理操作剩余的背景和地鼠。

(3)通过以上的方法,实现了背景初始化和地鼠初始化的同步进行。在贴背景的同时,利用for函数通过图片覆盖的方法实现9只地鼠的初始化。

3.4                                               锤子的设置

(1)在主函数中利用HCURSOR scur = (HCURSOR)LoadImage(NULL, "hammer.cur", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);加载即将设置的锤子鼠标样式,然后利用HWND swnd = GetHWnd();获取绘图窗口句柄,最后用SetClassLong(swnd, GCL_HCURSOR, (long)scur);将鼠标样式初始化为锤子即设置窗口类的绘图句柄。

(2)在线程中利用鼠标消息的传递判断鼠标行为,从而加载并且做出鼠标按下的动作。

3.5                                               游戏界面

(1)利用initgraph(630,380)初始化绘图窗口。

(2)使用loadimage函数加载四张背景图及其对应的掩码图,以及大中小地鼠及其掩码图。

(3)通过三个线程分别实现地鼠的随机上下移动、锤子击打后的图片变化以及倒计时的自动改变。

3.6                                               游戏结束界面

加载背景图片,在规定的坐标处开始贴图,程序示例:

IMAGE over,over_y;//定义背景图片及背景图的掩码图

loadimage(&over,"over.bmp");//加载背景图片

loadimage(&over_y,"over_y.bmp");//加载背景图的掩码图

putimage(270,270,&over_y,SRCAND);//在坐标270,270处加载背景

putimage(270,270,&over,SRCPAINT);// 在坐标270,270处加载掩码图

3.7                                               背景音乐界面

IMAGE skai,skai_y,sbi,sbi_y;  //定义音乐播放、停止的图标及其掩码图

loadimage(&skai, "skai.bmp");

loadimage(&skai_y, "skai_y.bmp");

loadimage(&sbi, "sbi.bmp");

loadimage(&sbi_y, "sbi_y.bmp"); //对定义的图片进行加载,存入

putimage(570, 10, &skai_y, SRCAND);

putimage(570, 10, &skai, SRCPAINT);

putimage(600, 10, &sbi_y, SRCAND);

putimage(600,10,&sbi,SRCPAINT); //在合适的位置输出音乐播放、停止的图标

PlaySound("huaze.wav",NULL,SND_FILENAME|SND_ASYNC); //播放bgm

PlaySound(NULL, NULL, SND_FILENAME); //停止播放音乐




5         小结5.1                                                 小组总结

打地鼠游戏是小组分工合作之后完成每一个分版块的结果。在整个设计的过程中,组长先前将整个问题进行了分析和描述,确定了所涉及到的有关内容,根据对象的难易程度合理分工,完成任务的分配。

本次设计工作量最大的一部分是EasyX图形化处理,所以分工在三个人身上完成。一个人负责处理游戏的开始界面(包含了开始游戏和退出游戏两个按钮),另一个人负责处理难度的选择界面(包含了一颗星、两颗星和三颗星的难度选择按钮),最后一个人负责游戏打击界面(包含了地鼠和锤子的贴图)。

在本次合作中,小组成员互相协作,共同克服艰难,完成了此次设计,同时我们也收获了很多的知识和能力。培养了我们自我学习、沟通协作的本领。

5.2                                                 小组成员总结
  • 组长总结

我是这次设计的组长,我承担了任务安排,图片处理,协助代码编写及设计报告撰写的工作。在这次设计里,我通过和组员讨论,将程序分割成几部分并且分配给每个组员。而每个组员也非常认真的完成了自己的任务。在编程的最初阶段,我们虽处于迷茫阶段,但是通过看视频,查资料,问老师,我们解决了一个又一个的问题。在代码完成的过程中,我们充分认识了合作的重要性,共同克服了所遇到的各种问题。在图片的处理过程中,除了要搜集大量素材,还要进行ps修改,虽然繁琐,但是也乐在其中。在这次课设中,我认识到了合作的重要性,也懂得了,只要付出努力,汗水,耐心,就能成功,不管多少困难,最终都能被攻克。

  • 总结

时光飞逝,岁月如歌,繁忙的两周设计转眼间就结束了。在这两周的时光里,我们每天在寝室—教室—食堂这三点一线的生活里,让我们回忆起了那高中时代的点点滴滴,那久违的充实的而又温馨的气息涌入心头,而这两周时光也成为我在大学两年里最为充实的学习时光。虽然一节课都没有,但感觉比上课还累一点。

第一天傍晚我们在博北小花园见了面,简单的了解一下,第二天开始,我们就早上九点,图书馆见,由于基础薄弱,我们在网上看教程视频,大致了解需要哪些图形库。其实一开始,我们也是一脸茫然,但是慢慢的,我们逐渐熟悉、并了解其中的奥妙。我们把主要的头文件弄好,然后找素材,制定一系列的规则,插入BGM,这其中我们遇到了不少困难,例如:地鼠位置不对,上升下降得速度太快或者太慢,锤子打中地鼠,不计分等,我们克服了这些困难。

通过这次小组自主讨论学习,我加深了对C语言的了解,强化了自己的应用能力。对我来说,这是一次愉快的经历。

  • 总结

这次我主要负责开始界面、背景音乐的代码编写,并参与了设计报告的撰写。在查阅了相关视频,书籍资料后,大胆的进行各种尝试,完成了开始界面这部分代码。但这时完成的界面并不够美观,在队友们的协助下,我们将其进一步美化,最终完成了令人满意的作品。

插入背景音乐时我们尝试了多个函数,在反复试验插入mp3格式不行时,我另辟蹊径,通过查阅资料了解到了playsound这个函数,又将音频文件转为wav格式,解决了这个难题。但同时因为wav格式所占内存较大,总程序所占内存也因此变大了很多,这是较为不妥的。在以后的代码编写中,我一定会更加积极主动的尝试,找到一个适合整体的最优解。


  • 总结

通过这次的设计,使我学会了很多东西,包括书本上的理论知识及书本上学不到的知识。具体的收获与体会如下:

通过设计,使我加深了对所学理论知识的理解与巩固,将课本知识运用到实际的程序。课设就像是对大脑的一次锻炼开发,这个过程中,我既吸收了新知识又对C语言有了更深入的理解,遇到问题时能够有一个较为清晰的方向。

通过这次设计,使我充分认识了团队合作的重要性。这次课设是专业自由组队完成一个小程序的设计开发。组员们共同查找资料,并且有各自的分工。分析的过程中每个成员都有自己独特的想法,这给程序的开发提供了不少的便利。此外在这次课设过程中,我们小组成员之间共同思考,相互查漏补缺,互相鼓励,遇到问题的时候共同讨论甚至是询问老师的帮助,在这一点上我认为我们组充分体现了团队精神,值得发扬。

  • 总结

时光荏苒,转眼间设计的两周就过去了。在这次设计实践中,我通过实践,懂得了如何运用EasyX完成一些简单的操作,认识到了团队合作的重要性。

这次实践,我了解到了如何在自己建立的窗口内贴图,并且实现图片的自动移动等功能。前期参考了很多的资料,简单了解了一下相关代码,熟练了之后便开始自己想如何去解决编码时出现的各种问题,比如说鼠标变成锤子以后如何判定是否打到地鼠,如何进行鼠标点击,游戏结束的判定方法与程序编写等等。这次的实践花费了很多脑筋,但是当各种问题一一解决之后,内心的自豪感便油然而生,让我觉得这是通过自己的努力和与队友间的分工合作实现了打地鼠小游戏。在整个过程中原本简单的思想通过小组的讨论逐渐复杂化,原本不成熟的语句代码也在不断修改调试的过程中不断趋向成熟,小组合作是极其重要的。


以上的Word格式文档:

游客,如果您要查看本帖隐藏内容请回复


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则