【C#项目实战】控制台游戏——勇士斗恶龙(1)

在这里插入图片描述

君兮_的个人主页

即使走的再远,也勿忘启程时的初心

C/C++ 游戏开发

Hello,米娜桑们,这里是君兮_,最近开始正式的步入学习游戏开发的正轨,想要通过写博客的方式来分享自己学到的知识和经验,这就是开设本专栏的目的。希望这些独立的C#小项目能对做游戏的你有所帮助,毕竟学会游戏开发的最好的上手方式就是自己做一款游戏!!

勇士救公主

  • 前言
  • 一.勇士救公主流程图
  • 二.项目实现
    • 1.游戏流程
    • 2.项目解析
    • 3.初始的设置
    • 4.开始界面
    • 5.该模块源码
  • 总结

前言

  • 本专栏主要是分享一些纯C#的项目开发流程,后面如有结合Unity开发的游戏会有专门的专栏,同时由于任何一个独立的项目都是非常复杂的,哪怕是简单的小项目做完整都至少需要4~500行代码,因此本专栏的独立项目多半会分不同的板块来分批次讲解,这样一是能拆分板块减小项目开发难度,二也能够便于大家理解方便大家跟着博客自己上手设计。
  • 在更新中的项目,会在更新之后的内容后把相关链接放在该博客的结尾,我也会在开设一个新项目时尽快更完方便大家查阅的!!
  • 同时在每个项目的开头,都会把本项目的流程图放在开头,方便大家检索,当然,我更加希望,大家在学习一段时间后,能不看我的讲解只看流程图就能把这个项目给实现了,能做到这样那么恭喜你真正入门了。

一.勇士救公主流程图

在这里插入图片描述

二.项目实现

1.游戏流程

  • 该游戏的大体流程是玩家通过打败恶龙来到公主身边拯救公主。如果挑战成功,救出公主,则游戏胜利,如果不幸被恶龙击败,则游戏结束。
  • 开始界面
    在这里插入图片描述
  • 游戏界面
    在这里插入图片描述
  • 营救公主
    在这里插入图片描述
  • 游戏结束界面
    在这里插入图片描述
  • 麻雀虽小,五脏俱全,游戏的制作正是要从这种简单的项目一步一步来的,废话不多说,开始我们的学习吧!!

2.项目解析

  • 该项目主要分为几块,场景设置,开始界面的设置和切换,游戏界面的地图的设计及角色的初始化,玩家的移动逻辑以及游戏的战斗逻辑,救出公主的逻辑,胜利或者失败后进入的结束界面的设置。
  • 今天,我们主要来讲初始的一些设置以及开始界面的布置。

3.初始的设置

  • 首先,我们需要先来完成一些基础的设置。
  • 由于我们是一个控制台窗口的小游戏,因此我们需要先设置一下控制台窗口以及缓冲区的大小
  int w = 60;int h = 40;Console.SetWindowSize(w, h);//控制台窗口大小Console.SetBufferSize(w, h);//缓冲区大小
  • 其实这两个函数第一个传入的参数为设置的宽度,第二个传入的参数为设置的高度
    在这里插入图片描述
  • 此时,在你的电脑上还有光标闪烁,我们需要把光标给隐去
//隐藏光标Console.CursorVisible = false;//false为隐去,true为显示
  • 好了,做了以上的基本设置,我们来进行开始界面的设置

4.开始界面

  • 在开始之前,我们不妨想想,我们这个游戏有三个界面,我们要怎么实现不同界面的切换呢?
  • 在这里,我们可以考虑到用switch来进行分组,用不同的条件来区别不同的界面,然后在不同的case下实现不同界面的不同功能。这样在切换不同界面时,我们只需改变条件让程序进入不同case即可。
int nowSceneID = 1;
//不同的场景进行不同的逻辑处理
switch (nowSceneID)
{//开始界面case 1:break;//游戏界面case 2:break;//结束界面case 3:break;default:break;
}
  • 这样,我们就能通过在代码中改变nowScene的值来切换不同的场景了
  • 同时,我们要注意,不能让游戏主动退出,而是通过玩家的输入才能退出,因此我们不妨将以上的逻辑放入一个死循环中,这样我们就能通过控制循环来控制游戏的退出了。

在这里插入图片描述

  • 下面我们就这case 1里实现我们开始界面的功能
  • 我们的开始界面,首先得有我们的游戏名称吧
case 1:Console.Clear();//清屏Console.SetCursorPosition(w/2-5,10);//设置输入坐标Console.WriteLine("勇士斗恶龙");
  • 先介绍一下SetCursorPosition函数。我们的控制台坐标的坐标轴(0,0)在左上角,因此增加传入参数的大小输入位置是往右往下的,关于坐标的设置,相信聪明的你自己动手试一下就能明白其中的原理
    在这里插入图片描述

  • 注意:如果你这里一直闪屏是由于你一直在循环清屏造成的,属于正常现象,不要慌,等下会解决的,我们继续

  • 好了,接下来是开始界面中最复杂的一段,我们怎么实现按W键和S键点亮”开始游戏“或“结束游戏”,来提醒玩家目前的选项呢?
    在这里插入图片描述

  • 这里我们来分析一下,其实逻辑是非常简单的,首先,当刚进入时,我们让程序进入让开始游戏亮,退出游戏不亮的场景,而玩家按下“S”,就切换到“退出游戏”亮上,再按下“W”就切回“开始游戏”亮的情况。

  • 哎,是不是和刚才的场景切换逻辑有亿点点相像呢?没错,这是也可以通过while结合switch的方法实现!!

 //当前选项的编号int nowSelIndex = 0;//因为要输入 我们可以构造一个开始界面的死循环//专门用来处理 开始场景相关的逻辑while (true){//显示内容检测输入//设置光标位置,再显示内容Console.SetCursorPosition(w / 2 - 4, 12);//根据当前选择的编号来决定是否变色Console.ForegroundColor = nowSelIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;//三目操作符结合设置字体颜色的函数Console.Write("开始游戏");Console.SetCursorPosition(w / 2 - 4, 14);Console.ForegroundColor = nowSelIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;Console.Write("退出游戏");//检查玩家输入的键并且不会在控制台上显示输入内容char input = Console.ReadKey(true).KeyChar;switch (input){case 'W':case 'w':nowSelIndex = 0;break;case 'S':case 's':nowSelIndex = 1;break;}}
  • 很简单的逻辑,通过 nowSelIndex的值进行标记,初始为0,如果按下“S”键就让nowSelIndex = 1,此时开始游戏为白,退出游戏为红,想再切换为开始游戏为红退出游戏为白就按下”W“键即可。
  • 这里是你需要注意的地方:
  //检查玩家输入的键并且不会在控制台上显示输入内容char input = Console.ReadKey(true).KeyChar;
  • 当ReadKey括号中的值为true时,输入的值就不会显示在控制台上了,同时我们由于每次进入下一次循环中都会清屏也不会影响游戏的运行。这样就达到了我们的目的,我们来进行下一步。
  • 同时,我们实现“开始游戏”和“退出游戏”的标记提醒后,该进行选择了,这里我们就通过来按“J”来进行下一步,在“开始游戏”高亮时,按J切换到游戏场景,在退出游戏时高亮,按J就退出程序。
 case 'j':case 'J':if(nowSelIndex == 0){//1.改变场景ID,进入游戏场景nowSceneID = 2;//2.要退出内层循环whileisQuitWhile = true;}else{//关闭控制台Environment.Exit(0);}break;if (isQuitWhile == true)break;
  • 这里我们定义了一个bool类型的isQuitWhile来实现切换场景的目的,由于我们这里的break都是switch都是里的,只能退出switch,因此需要通过这个bool类型的变量达到退出内层循环进入外层的switch里重新选择的目的,而由于此时我们改变了 nowSceneID的值,自然就可以切换进入游戏场景了。

5.该模块源码

  • 由于上面的讲述是分步拆分的,下面为大家提供该部分的源码来帮助大家理解该部分的内容
namespace 勇士斗恶龙
{class Program{static void Main(string[] args){int w = 60;int h = 40;Console.SetWindowSize(w, h);Console.SetBufferSize(w, h);//隐藏光标Console.CursorVisible = false;int nowSceneID = 1;while (true){//不同的场景进行不同的逻辑处理switch (nowSceneID){case 1:Console.Clear();Console.SetCursorPosition(w / 2 - 5, 10);Console.WriteLine("勇士斗恶龙");//当前选项的编号int nowSelIndex = 0;//因为要输入 我们可以构造一个开始界面的死循环//专门用来处理 开始场景相关的逻辑while (true){//用一个标识用来退出此循环bool isQuitWhile = false;//显示内容检测输入//设置光标位置,再显示内容Console.SetCursorPosition(w / 2 - 4, 12);//根据当前选择的编号来决定是否变色Console.ForegroundColor = nowSelIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;Console.Write("开始游戏");Console.SetCursorPosition(w / 2 - 4, 14);Console.ForegroundColor = nowSelIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;Console.Write("退出游戏");//检查玩家输入的键并且不会在控制台上显示输入内容char input = Console.ReadKey(true).KeyChar;switch (input){case 'W':case 'w':nowSelIndex = 0;break;case 'S':case 's':nowSelIndex = 1;break;case 'j':case 'J':if (nowSelIndex == 0){//1.改变场景IDnowSceneID = 2;//2.要退出内层循环whileisQuitWhile = true;}else{//关闭控制台Environment.Exit(0);}break;}if (isQuitWhile == true)break;}break;case 2:break;case 3:break;default:break;}}}}
}

总结

  • 今天的内容到这里就结束了,总的来说这部分的内容还是比较简单的,不妨跟着博主自己动手尝试一下,毕竟很多问题只有自己动手试过了才能发现,如果你在实现过程中遇到任何问题,欢迎在评论区指出或者私信我!!
  • 后面的内容很快更新,感兴趣不妨关注一下错过后面的内容哦!!(小小预告一下,接下来就开始我们游戏界面的内容啦,这一块才是真正的重头戏)

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下再走呗。你们的支持就是我更新的动力!!!

**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/97364.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:wildcard - 通配符搜索

Elasticsearch 是一个分布式、免费和开放的搜索和分析引擎,适用于所有类型的数据,例如文本、数字、地理空间、结构化和非结构化数据。 它基于 Apache Lucene 构建,Apache Lucene 是一个全文搜索引擎,可用于各种编程语言。 由于其速…

HBase集群环境搭建与测试

🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 个人主页:beixi 本文章收录于专栏(点击传送):【大数据学习】 💓💓持续更新中,感谢各位前辈朋友们支持…

Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)

多线程案例 一、设计模式(单例模式工厂模式)1、单例模式2、工厂模式 二、阻塞式队列1、生产者消费者模型2、阻塞对列在生产者消费者之间的作用3、用标准库阻塞队列实现生产者消费者模型4、模拟实现阻塞队列 三、定时器1、标准库中的定时器2、模拟实现定时…

go语言基本操作---三

变量的内存和变量的地址 指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。Go语言对指针的支持介于java语言和C/C语言之间,它即没有想Java语言那样取消了代码对指针的直接操作的能力,也避免了C/C语言中由…

视频监控/视频汇聚/视频云存储EasyCVR平台接入华为ivs3800平台提示400报错,该如何解决?

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,视频云存储/安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频…

【mybatis-plus】多数据源切换[dynamic-datasource] 手动切换数据源

Springbootmybatis-plusdynamic-datasourceDruid 手动切换数据源 文章目录 Springbootmybatis-plusdynamic-datasourceDruid 手动切换数据源0.前言1. 多数据源核心类浅析1. 1. DynamicDataSourceContextHolder切换数据源核心类1.2. DynamicRoutingDataSource 2.基于核心类的理解…

锁( ReentrantLock,Synchronized)

1.lock和synchronized 语法层面 synchronized 是关键字,源码在 jvm 中,用 c 语言实现; Lock 是接口,源码由 jdk 提供,用 java 语言实现; 使用 synchronized 时,退出同步代码块锁会自动释放&…

Java 复习笔记 - 学生管理系统篇

文章目录 学生管理系统一,需求部分需求分析初始菜单学生类添加功能删除功能修改功能查询功能 二,实现部分(一)初始化主界面(二)编写学生类(三)编写添加学生方法(四&#…

Nginx 配置中root和alias的区别分析

root和alias都可以定义在location模块中,都是用来指定请求资源的真实路径,比如: location /i/ { root /data/w3; } 请求 http://foofish.net/i/top.gif 这个地址时,那么在服务器里面对应的真正的资源 是 /data/w3/i/top.gif文…

2023年03月 C/C++(七级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程(1~8级)全部真题・点这里 第1题:走出迷宫 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。 假设你已经得到了一个n*m的迷宫的图纸&a…

移动零00

题目链接 移动零 题目描述 注意点 将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序必须在不复制数组的情况下原地对数组进行操作 解答思路 采用双指针的思路,左指针指向已移动零的数组的尾部,右指针指向为移动零的数组的头部&…

Android-关于页面卡顿的排查工具与监测方案

作者:一碗清汤面 前言 关于卡顿这件事已经是老生常谈了,卡顿对于用户来说是敏感的,容易被用户直接感受到的。那么究其原因,卡顿该如何定义,对于卡顿的发生该如何排查问题,当线上用户卡顿时,在线…