图片透明效果 c语言_2019级C语言大作业 - 十步万度

0dd664fa58e4992171973a1af1d0ab21.png

分享19级同学大一上学期用C语言实现的十步万度,可从码云下载:

期末作业/十步万度​gitee.com
12c1d0495a336a1b8dced97de688d281.png
C语言大作业 - 十步万度https://www.zhihu.com/video/1215683813801660416

摘要

本组设计并编写的游戏《十步万度》,是我们仿照原有的《十步万度》游戏,用自身现所掌握的C语言知识来编写的一款休闲益智类的小游戏。你只能点击十次,但却要引发蝴蝶效应最后达到10000度,一个微小的差别可能就会造成很大的不同。这款游戏的设计思路和编写过程如下。

一、设计思路

在一开始选取游戏题材的时候,我们曾考虑过自己设计并编写出一款自己的游戏,但是后来因为意见不统一以及我们现掌握的知识水平有限便放弃了。最后我们决定仿照一款游戏进行编写,于是就有了现在的这款《十步万度》游戏。

想想万事万物,每个人的每一步选择都有可能会产生意想不到的影响,这就是蝴蝶效应,也是这款游戏的设计理念。我们所设计的游戏通关难点就在于每一次的点击都需要考虑到后续所带来的效应,为了取得更高数量的度数,自然是效应越大越好。这便使得游戏不会局限于单纯通关刷分的套路,它具有一定的挑战性和趣味性,也为玩家留有思考空间,让玩家可以充分发挥自己的思维能力。为了增加游戏的可玩性,我们决定设计四个通关模式,从第一关到第四关难度依次增加,相对应的目标度数也随之增大;在每一种模式下玩家都可以不断尝试和挑战新的玩法,以达到更高的度数。简而言之,这是一款既可以比智力,又可以比运气的一款游戏。

在游戏整体设计思路大概确定下来之后,我们便开始考虑到游戏的具体框架设计过程。经过在一番简单的讨论,我们决定先初步编写并实现游戏的核心功能部分,然后在实现核心功能的基础上陆续编写游戏的其他辅助功能。

二、功能描述

《十步万度》的玩法十分简单,不过想要通关并不容易。玩家需要在规定的十步之内进行游戏,游戏中相应的圆圈每次旋转只转90度,但却要引发蝴蝶效应并达到目标度数,才能算是游戏成功,如在十步之内没能达到目标度数,则算游戏失败。以下是游戏部分的功能。

2.1 页面显示

游戏页面可谓是游戏的一个重要组成部分。我们使用EasyX图形库来进行绘图,由于在网上找不到我们所需要的大部分素材,我们便自己制作了素材图来使用。变化的数字输出是一个难点,因为在新的数字输出之前旧的数字不会被清除掉,而是覆盖在了旧的数字之上;后来我们利用了EasyX中的clearrectangle函数对数字输出的位置进行局部清除,再对被清除的局部背景重新绘制,最后实现新的数字的输出,这样也就解决了上文提到的数字覆盖问题。

2.2 旋转过程

圆圈的旋转也是利用了EasyX中的MosesHit和MOUSEMSG函数来进行获取鼠标信息,然后再根据鼠标左键按下时鼠标的坐标对当下圆圈包含的信息进行判断;我们给每个圆圈都定义了记录它指针的指向(pointer.dir)和指针的坐标(pointer.ptr_x, pointer.ptr_y)的参数,当圆圈旋转结束之后记录下它的指针指向和指针坐标的改变,这样可以通过指针的指向来判断指针的旋转方向,以及通过指针的坐标来判断被指向的圆圈,使其进行下一步的旋转。

2.3 关卡选择

关卡选择首先是选择页面的绘制,其次是通过参数choice的数值来判断用户所选择的关卡,选择到不同的关卡时则将进入到不同的游戏场景进行游戏。

2.4 判断输赢

这个部分首先定义了Step来限制点击次数,然后再判断次数用尽之后玩家是否达到目标度数,若是则游戏胜利,否则游戏失败。

三、 分步骤实现

游戏实现步骤主要分为以下几块:

(1)页面显示

(2)鼠标点击后圆圈旋转

(3)实现圆圈连续旋转

(4)记录旋转度数并限制步骤

(5)判断输赢

(6)分成四个关卡

(7)不同页面的处理

我主要负责游戏素材的制作和(2)、(4)、(5)、(7)四个部分的内容编写。

3.1 素材制作

因为之前从未接触过PS和别的图片处理软件,再加上那会儿对EasyX的使用还不是很熟练,所以走了不少弯路;自己照葫芦画瓢做出来的图片要么是背景部分实现不了透明化,要么是图片在绘制时会有重影……后来我在我的搭档和其他同学的帮助下,对素材图的制作方法和putimage函数的使用有了更深入的理解,便成功地制作出需要的素材了。

3.2 实现(2)鼠标点击后圆圈旋转部分

我通过在课堂上所学过鼠标交互功能来获取鼠标的坐标信息,通过鼠标和圆圈的坐标来判断所点击到的圆圈,然后对这个圆圈的信息进行更新,使其旋转。

3.3 实现(4)实现旋转度数的输出并限制点击次数

数字变量的输出也是我所遇到的难点之一,因为要在不破坏背景的前提下输出时时更新数字这个是我不会的,后来在老师的指点下我使用了局部清除函数clearrectangle();但却又不知道重新绘制背景,最后是在搭档的帮助下用了getimage()函数获取原来的背景,再重新绘制,才实现了最终完美的效果。

3.4 实现(5)判断输赢和步数的限制

判断输赢和限制步数这部分并不难处理,就是定义了一个Step=10来记录游戏步数,鼠标每点击一次step减一;在游戏的次数用完之后加了一个判断,达到目标度数便成功,否则就算失败。

3.5 实现(7)不同页面处理

菜单以及输赢页面的绘制也都是使用putimage把准备好的素材放上去,然后再在MouseHit()中进行判断和变量更新。

四、 体会和感受

我在整个游戏的编写过程中收获了很多,也看到了自身能力的不足之处;与队友的合作更是让我感受到,准确的语言表达、沟通交流以及团队协作的重要性,有时候自己反反复复查看代码却找不出bug在哪里,或是面对不知该如何处理的问题的时候,与搭档或者其他同学进行交流总能得到许多帮助。虽然游戏最终的实现效果并不如一开始设想的那样理想,在写的过程中我也感觉非常的痛苦煎熬,但是在游戏完成的那一刹那心里还是充满了喜悦。

这次的游戏都是用C语言知识和EaxyX库来实现的,通过这次的编写,我对C语言和EasyX的理解运用更加深入了,同时还学会PS的一些简单操作,这对我来说无疑是一个很大的进步。这也让我认识到自己的知识储备的稀缺,因此,在以后的学习中我会更加注重知识的积累,并培养自己通过不同渠道收集和学习新知识的能力。

最后希望自己以后能够做出更好的作品来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值