最近干到C#部分了,跟着唐老狮的课做一个小小的实验性游戏,通过控制台来完成一个类魔塔游戏.并且进步一填充一些内容
需求分析

主要包括这些部分,接下来开整:
开始界面

然后浅浅打个地基

接下来搞一搞几个场景

思路很简单,就像舞台剧一样,不同的行为发生在不同的布景中,然后我们给一个场景编号,根据场景编号来控制玩家所见;clear在这里相当于清场,把前面的场景打扫干净,后面的场景才会舒服的显示。浅浅测试一下:

很不错,虽然是死循环一直再闪烁,但基本的切换思路已经出来了,继续搞搞;
这里要搞清楚很重要的一点,运行中的游戏,在不崩溃或者不点击”退出游戏“的情况下,实际上它就可以理解成一个一直在运行的死循环,只不过这里面有很多阻塞性接口在等待指令,我随便拉一个游戏开始界面出来,比如kenshi

图中按钮的部分就是各种阻塞性的接口,它们一直在等待玩家的键鼠指令,不点退出,那么这个程序就一直在跑;
所以,我们这边的主界面制作也是一个道理

我们用了两个死循环来实现程序一直在运行的状态,然后通过Console.ReadKey(true).KeyChar;这个方法来实现阻断接口,括号里的true表示玩家输入的按键不会在控制台上显示。如果改为 false 或省略,按下的键会回显到控制台窗口。
Console.ReadKey()其返回值是一个 ConsoleKeyInfo 对象,.KeyChar是 ConsoleKeyInfo 类型的一个属性,用于获取按下键的字符表示,比如如果用户按下字母 A,返回 ‘A’。
那么到了Console.ReadKey(true)这个位置程序就会停下来等待玩家输入,我们预期玩家能通过W、S两个键来切换开始和退出,并进行选择,这里WS这样写包括大小写避免玩家键盘输入法问题而不能操作,有一个贯穿的知识点,如果不知道就谷歌一下“switch贯穿”。
然后还有问题要注意,为什么sceneWidth / 2 - 5后面这个是-5,因为中文是全角字符,一个字占两个空格,当光标居中时,打出来的标题是靠右的,我们标题“勇者救公主”是五个汉字10个半角字符,-5就刚好减到‘救’的中间,就是居中了

浅浅测试一下:

看起来很不错,继续搞搞,接下来我们需要能够让玩家操作ws按键时,按钮能够有反应,至少变个颜色什么的,对吧,回想一下大部分游戏的按钮,是不是把鼠标移上去或者按个按钮什么的,UI是会有反应的.

那么思路也很简单,首先我们有两个步骤了——调整光标位置和打印按钮,那么我们是不是只用在两个步骤之间插入一个改变打印字颜色的行为,就达成目的了呢?
理论上是这样,所以我们先创建一个按钮编号的变量nowSelIndex,默认为0,0代表开始游戏按钮,1为退出游戏按钮,这样刚进开始界面时,我的光标会在“开始游戏”处,此时来个判断,按钮编号此时是默认的0,那么我就把要打印“开始游戏”的字体切换成红色,然后打印红色字体,让它实际显示在玩家眼中,接下来再打印“退出游戏”,此时nowSelIndex还是0,所以条件nowSelIndex == 1不成立,“退出游戏”打印出来的就是白色。浅浅测试一下;

有意思嗷,实现了捏,那么接下来,是不是感觉这个代码又臭又长,不简洁漂亮,稍稍优化一下

整两个三目,是不是舒服了
那么接下来开始调整,我需要通过WS来控制UI按钮的选择


也是一个三目就搞定,因为只有两个按钮,状态不是0就是1嘛,当然如果这里有多个按钮呢,那也可以通过编号+-的方式来实现,我们这里进阶一点点,假设游戏做好了,我们这里搞一个制作者名单。

想象一下操作ws就像操作一个滑动密码锁一样,当按w时,光标不在编号0的位置,就相当于转了一圈到2(制作者名单)去了,s也是同理,这个地方新手看不懂的话就多品一下,其实很简单,我把if版本放上来就懂了;

ok,那么来浅浅测试一下

是不是一下子古早游戏那味儿就出来了,很好,接下来我们继续来丰富细节,之前我们一直都是在case1也就是开始游戏场景的while中在创建这些进入不同场景的接口按钮,那么现在我需要选中按钮并按下回车让游戏进入其他的界面,这个行为会被拆分成
----按\r回车按钮--改变场景编号数据--退出当前case1的循环回到大循环之中--由于场景数据被改变,所以退出该循环回到大循环之中时,便会切换为其他所选的界面了;

那我们给一个标识isQuitWhile,默认为false,当选中按钮并按下回车后,我们会改变这个弹出标识的状态,标识已经选择过了,可以弹出当前循环

然后我们来设置一下几个判断条件,在对应的条件内部调整界面开关\增加退出条件就搞定了,这里我偷个懒直接case '\r'了,但要注意,比如在linux下面这种是不行的,因为Linux 系统只产生 \n,正式写项目推荐使用ConsoleKey.Enter捕捉.

浅浅测试一下,很棒,按钮有反应了,但是之前那个if else if的判断太挫了,所以这里为了可能的更新,我们用委托和Lambda来写条件判断,当然我还没学到这一块儿,只不过先问gpt优化一下后拿过来用,看起来会更舒服一些

好,测试完也没什么问题,至此我们的开始主界面以及它的选择部分就已经完成啦,接下来要开始搞具体的战斗场景了;
游戏界面
到了游戏界面首先肯定需要一个循环,来控制游戏里主角的行为,其次还有一些布景,我们先来完成布景

布景的话我们用墙壁把场景围起来,这里墙壁我选择用白色,因为是控制台,所以美术资源啥的就不用有太多要求了,但是还是可以选择一些类似墙壁纹理的字符来稍稍丰富一下细节

那么浅浅测试一下

角色/NPC属性
不错哈,接下来搞搞游戏主体,首先来搞定boss的一些属性,我们把这些基本属性放在控制游戏的while循环之外,包括boss的坐标,攻击力,血量,icon等
<

最低0.47元/天 解锁文章
4140

被折叠的 条评论
为什么被折叠?



