2020级C语言大作业

您所在的位置:网站首页 火柴人打羽毛球人物特点 2020级C语言大作业

2020级C语言大作业

2023-12-25 17:14| 来源: 网络整理| 查看: 265

分享20级同学大一上学期用C语言(及少量C++)实现的火柴人打羽毛球。由于同学们刚学了三个月的编程,实现还不够完善,工程代码、图片音乐素材可以从百度网盘下载:

链接:https://pan.baidu.com/s/1sZp0KBV_TblvnxkUoiqg7w

提取码:f1id

1 设计思路

本游戏参考网络上的同名游戏,通过c语言编写实现。游戏中玩家通过键盘操作实现互动。游戏主体框架采用老师讲过的思路,游戏的初始化,游戏界面的显示,和输入有关的更新,和输入无关的更新,并添加了面向对象的编写。为了完成这个游戏,我们做了一次全面的分析,把游戏制作分为以下几个步骤。首先是实现背景和火柴人的载入,其次是实现火柴人的运动,然后插入羽毛球,实现羽毛球与玩家的互动,最后添加初始页面,音效以及比分等细节来完善游戏,使游戏更加美观。

2 功能描述

该游戏可操纵功能即通过键盘输入,实现两个火柴人的移动,击球和发球动作。无需操纵功能为羽毛球位移的更新和羽毛球与火柴人的碰撞互动。主要函数功能介绍如下:

2.1 主函数

主函数利用while()循环实现游戏画面的不断更新。其中ishit,isbeat为判断玩家发球,击球的变量,之所以这样做的原因是因为我们发现主函数的while与player对象中的定时器函数造成矛盾,形成两重循环,会造成动作显示卡顿的问题。

2.2 初始化

初始化函数为startup()函数:

导入并循环播放音乐 (mciSendString())

2.初始化背景,玩家以及羽毛球(initialize()),设置各个图像的初始坐标。

3.新开一个画面(initgraph())

4. 显示初始游戏界面(startMenu())

5. 开始批量绘制(BeginBatchDraw())

2.3 显示

显示函数为show()函数:

1. 添加游戏暂停函数(pauseMenu())

2. 显示场景,玩家,羽毛球的相关信息(draw())

3. 定义cnt变量来判断玩家1,2的初始发球

4. 批量绘制图像(FlushBatchDraw())

2.4 和输入无关的更新

和输入无关的控制为函数updateWithoutInput():

1. 玩家跳跃下落y坐标的自动更新(updateYcoordinate())

2. 羽毛球与相关背景的碰撞(collideWallorGroundorNet())

3. 以羽毛球落地x坐标来判定下一局谁先发球

2.5 和输入有关的更新

和输入有关的更新为函数updateWithInput():

1. 设置角色默认状态为站立(standStill())

2. 获得键盘输入以实现火柴人的各种动作以及游戏的暂停(异步输入GetAsyncKeyState())

2.6 进入游戏和暂停游戏

进入游戏为函数startMenu(),暂停游戏为函数pauseMenu()

2.7 判定玩家的胜利

左边玩家获胜界面为函数endpage(),右边玩家获胜界面为函数endpage1()

3 分步骤实现方法

3.1 背景和火柴人平移的制作

首先绘制一个窗口,然后利用EasyXPng.h 头文件以及loadimage、putimagepng等函数插入背景图片和火柴人图片。以面向对象的方法(class)制作火柴人。定义变量x,y,vx,vy,以坐标的加减来实现火柴人的平移。

3.2 火柴人动作的制作

加载火柴人跳跃,左右跑动的运动组图,定义变量gravity,编写火柴人左右运动(runleft,runright)与跳跃函数(beginjump,updateYcoordinate)以实现火柴人的动态运动。

3.3 双火柴人的制作

有了第一个火柴人的制作,第二个火柴人的制作就容易多了。之所以不用class的复制功能,是因为虽然两个火柴人的功能类似,但是他们是对立站立所有动作加载都要反过来而且图片不一样需要重新加载,函数功能一样,但细节方面却有诸多不同。

3.4 羽毛球的制作

插入一个羽毛球很简单,让它运动也很简单,但是怎么让羽毛球与人互动起来确实一个难点。此步骤插入了火柴人打球的动作(beatball,hitball)、羽毛球的自动运动以及羽毛球与球拍,球网,墙面(collideWallorGroundorNet)的碰撞反弹。

3.5 修改素材,数据等细节

这一步骤首先是添加了静止发球和落地初始化为发球画面两个细节,这一步骤重新定义了beatball这一对象,因为player1和player2都要引用ball的参数,所以ball只能放在其上,而发球动作却要引用player1和player2的参数,这就造成了一个谁放在上面谁放在下面的矛盾,所以干脆在player的下面重新定义一个beatball的对象,当发球动作结束后跳转到ball的对象类型。然后完善了素材,处理了一些不清楚模糊的图片。最后修改了羽毛球自动运动的细节以便增加其可玩性。

3.6 画面制作,音效的制作,游戏胜负判定

这一步骤相当于完善游戏的细节。添加了初始页面,暂停页面,初始页面函数和暂停页面函数中均添加了按键控制代码,实现了按键来进入和退出游戏。添加了游戏的音效。利用settextcolor和settextstyle等函数制作字体的样式。

当玩家先拿到六分就能获胜,为此添加了游戏得分情况的判定和游戏结束时的页面。当球落地,对面玩家即可获得一分,这就是游戏得分情况的判定。

4 体会与总结

在一开始我们选择这个游戏的时候,心里的感觉是这个游戏挺好玩,而且做起来应该不会太难。但出乎我们意料的是当自己真正开始做的时候却毫无头绪,毫无知识储备,大脑一片空白,渐渐感觉这完全是个没法完成的任务,完全是自己给自己挖了个坑。由此我们明白,原来即使是一个看似简单的事情,背后可能也需要付出巨大的努力。

但是既然已经选择了这个游戏,就只能积极应对挑战了。开始我们毫无头绪不知道如何下手,在犹豫了好长时间之后,我们决定先对这个游戏做了一次全面的分析,先做哪一步,再做哪一步,需要什么素材等等,然后我们积极向同学请教并参考老师的游戏范例,就这样一步一步的我们先是做出了背景,然后是火柴人,接着羽毛球,逐渐有序地把整个游戏做了出来。回想过去的一个月,我们经历了一开始连怎么插入png图片,怎么做游戏人物的npc都不会,甚至有时npc的一个动作一改就是一下午到现在的游戏的完成。在做游戏的过程中,我们知道了面对困难和挑战切忌退缩与心慌,即使是一件看似不可能完成的事,经过我们一步步的努力,最后也可能成功。同时我们也收获了面对困难的解决办法,那就是把它分解开来一步一步去解决它。

最后还有最重要的一点心得体会,就是人需要一直学习一直进步。每一个知识点就像一个领域,当我们在领域之外只是初见它时,那么想要运用它必然如荆棘刺手,遇到各种各样不可解的麻烦。而当我们深入其中时,先搞懂再运用,便可省去很多不必要的麻烦。做游戏写代码便是这样,一开始我们什么都不懂直接动手,只要是出了一个BUG就需要浪费大量的时间去修改还极有可能改不好。后来我们转变策略,当我们想要用一些我们不明白的东西,先去查阅资料都搞清楚明白后再动手,工作效率便快了许多。所以说啊,不管做什么都要讲究方法策略,都需要我们不断学习。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3