【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.mzph.cn/news/67238.shtml

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

相关文章

因为axios请求后端,接收不到token的问引出的问题

vue axios请求后端接受不到token的问题。 相关概念 什么是跨域? 跨域指的是在浏览器环境下,当发起请求的域(或者网站)与请求的资源所在的域之间存在协议、主机或端口中的任何一个条件不同的情况。换句话说,只要协议、…

ubuntu下Anaconda安装与使用教程

前言 好久没用anaconda了,还记得之前用anaconda的欢乐时光。pytorch和paddlepaddle(飞浆),怀念,可生活(换了ubuntu系统之后)教会了我残忍(可能很难有机会再用windows的anaconda了)。找个时间&a…

爬虫源码---爬取小猫猫交易网站

前言: 本片文章主要对爬虫爬取网页数据来进行一个简单的解答,对与其中的数据来进行一个爬取。 一:环境配置 Python版本:3.7.3 IDE:PyCharm 所需库:requests ,parsel 二:网站页面 我们需要…

Java设计模式:四、行为型模式-07:状态模式

文章目录 一、定义:状态模式二、模拟场景:状态模式2.1 状态模式2.2 引入依赖2.3 工程结构2.4 模拟审核状态流转2.4.1 活动状态枚举2.4.2 活动信息类2.4.3 活动服务接口2.4.4 返回结果类 三、违背方案:状态模式3.0 引入依赖3.1 工程结构3.2 活…

欧科云链研究院探析Facebook稳定币发行经历会不会在PayPal重演

引言 作者最近的报告-探析PayPal发行稳定币是否会重蹈Facebook覆辙-近期被英国的金融时报(中文版)刊登。由于该报告在欧科云链研究院内部反响较好,下面就带大家简单的剖析这篇报告的主要内容。 *这篇文章主要由对比分析(已删减&a…

网络编程 day 7

1、将.txt表数据导入数据库中 #include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__:",__LINE__);\perror(msg);\ }while(0)int main(int argc, const char *argv[]) {//以只读的方式打开dict.txt文件FILE* fd;if((fdfopen("./dict.txt&q…

20230831-完成登录框的按钮操作,并在登录成功后进行界面跳转

登录框的按钮操作&#xff0c;并在登录成功后进行界面跳转 app.cpp #include "app.h" #include <cstdio> #include <QDebug> #include <QLineEdit> #include <QLabel> #include <QPainter> #include <QString> #include <Q…

Python操作Excel教程(图文教程,超详细)Python xlwings模块详解,

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 xlwings模块详解 1、快速入门1、打开Excel2、创建工作簿2.1、使用工作簿2.2、操作…

【css】z-index与层叠上下文

z-index属性用来设置元素的堆叠顺序&#xff0c;使用z-index有一个大的前提&#xff1a;z-index所作用元素的样式列表中必须有position属性并且属性值为absolute、relative或fixed中的一个&#xff0c;否则z-index无效。 层叠上下文 MDN讲解 我们给元素设置的z-index都是有一…

面试中的时间管理:如何在有限时间内展示最大价值

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

SVN 集中式版本管理平台

1. SVN 命令行工具下载地址 https://www.visualsvn.com/downloads/ 2. 下载SVN 命令行工具后&#xff0c;解压后就可以了&#xff0c;不需要安装的 3. 将bin 文件添加到系统环境变量中&#xff0c;不知道怎么打开系统环境变量的自己问度娘 4. 添加到系统环境变量中&#xff0c;…

21.CSS的动态圆形进度条

效果 源码 <!doctype html> <html><head><meta charset="utf-8"><title>Animated Circular Progress | CSS Only</title><link rel="stylesheet" href="style.css"></head><body><di…

K8S自动化运维容器Docker集群

K8S&#xff1a;K8S自动化运维容器化(Docker)集群 一.k8s概述 1.k8s是什么 &#xff08;1&#xff09;K8S全程为Kubernetes&#xff0c;由于K到S直接有8个字母简称为K8S。 &#xff08;2&#xff09;版本&#xff1a;目前一般是1.18~1.2.0&#xff0c;后续可能会到1.24-1.2…

「解析」YOLOv5 classify分类模板

学习深度学习有些时间了&#xff0c;相信很多小伙伴都已经接触 图像分类、目标检测甚至图像分割(语义分割)等算法了&#xff0c;相信大部分小伙伴都是从分类入门&#xff0c;接触各式各样的 Backbone算法开启自己的炼丹之路。 但是炼丹并非全是 Backbone&#xff0c;更多的是各…

为C# Console应用化个妆

说到Windows的cmd&#xff0c;刻板印象就是黑底白字的命令行界面。跟Linux花花绿绿的界面比&#xff0c;似乎单调了许多。但其实C#开发的Console应用也可以摆脱单调非黑即白的UI。 最近遇到个需求&#xff0c;要在一堆纯文本文件里找指定的关键字&#xff08;后续还要人肉判断…

LMD-恶意软件检测工具

LMD是Linux恶意软件扫描器&#xff0c;以GNU GLPv2许可发布。 官方地址&#xff1a;https://www.rfxn.com 下载软件包命令&#xff1a; wget https://www.rfxn.com/downloads/maldetect-current.tar.gz tar命令解包后进入其目录。 安装命令如下&#xff1a; ./install.sh …

〔021〕Stable Diffusion 之 提示词反推、自动补全、中文输入 篇

✨ 目录 &#x1f388; 反推提示词 / Tagger&#x1f388; 反推提示词 Tagger 使用&#x1f388; 英文提示词自动补全 / Booru tag&#x1f388; 英文提示词自动补全 Booru tag 使用&#x1f388; 中文提示词自动补全 / tagcomplete&#x1f388; 中文提示词自动补全 tagcomple…

说说IO多路复用

分析&回答 IO多路复用 I/O multiplexing 这里面的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态(对应空管塔里面的Fight progress strip槽)来同时管理多个I/O流。直白点说&#xff1a;多路指的是多个socket连接&#xff0c;复用指的是复用一个…

如何创建美观的邮件模板并通过qq邮箱的SMTP服务向用户发送

最近在写注册功能的自动发送邮箱告知验证码的功能&#xff0c;无奈根本没有学过前端&#xff0c;只有写Qt的qss基础&#xff0c;只好借助网页设计自己想要的邮箱格式&#xff0c;最终效果如下: 也推销一下自己的项目ShaderLab&#xff0c;可运行ShaderToy上的大部分着色器代码&…

npm install 包的时候,提示安装成功,但是项目中没有出现,node_modules也没有安装的包,package.json中也没有任何依赖包记录

——这种情况一般是包安装错了目录&#xff01; 解决步骤&#xff1a; 1. 查看npm的配置 npm config list2.查看全局下&#xff0c;是否有自己安装的包 npm root -g//获取到全局安装目录找到返回的地址中是否有自己安装的包 3.修改npm配置信息&#xff0c;查看 图例1&…