简单小游戏制作
控制台基础设置
//隐藏光标
Console.CursorVisible = false;
//通过两个变量来存储舞台的大小
int w = 50;
int h = 30;
//设置舞台(控制台)的大小
Console.SetWindowSize(w, h);
Console.SetBufferSize(w, h);
多个场景
int nowSceneID = 1;
while (true)
{//不同的场景ID,进行不同的逻辑处理switch (nowSceneID){//开始场景case 1:Console.Clear();Console.WriteLine("开始场景");break;//游戏场景case 2:Console.Clear();Console.WriteLine("游戏场景");break;//结束场景case 3:Console.Clear();Console.WriteLine("结束场景");break;}
}
开始场景逻辑实现
Console.SetCursorPosition(w / 2 - 7, 4);
Console.Write("勇者斗恶龙");//当前选项的编号
int nowSelIndex = 0;
//因为要输入,完没可以构造一个开始界面自己的死循环
//专门用来处理开始场景相关逻辑
while (true)
{//用一个标识来处理想要在while循环内部的switch逻辑执行时希望退出外层循环时改变标识即可。bool isQuitWhite = false;//显示内容//先设置光标位置,再显示内容//根据当前选择的编号来决定是否变色。Console.SetCursorPosition(w / 2 - 6, 7);Console.ForegroundColor = nowSelIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;Console.Write("开始游戏");Console.SetCursorPosition(w / 2 - 6, 9);Console.ForegroundColor = nowSelIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;Console.Write("退出游戏");//检测输入//检测玩家输入的一个键内容,并且不会在控制台上显示输入的内容char input=Console.ReadKey(true).KeyChar;switch (input){case 'w':case 'W':--nowSelIndex;if (nowSelIndex < 0)nowSelIndex = 0;break;case 's':case 'S':++nowSelIndex;if (nowSelIndex > 1)nowSelIndex = 1;break;case 'j':case 'J':if (nowSelIndex == 0){//1.改变当前选择的场景IDnowSceneID = 2;//2.退出内层while循环isQuitWhite = true;}else{//关闭控制台Environment.Exit(0);}break;}if (isQuitWhite){break;}
}
游戏场景
不变的红墙
//设置颜色为红色
Console.ForegroundColor = ConsoleColor.Red;
//画墙
for (int i = 0; i <= w - 2; i++)
{//上方墙Console.SetCursorPosition(i, 0);Console.Write("■");//下方墙Console.SetCursorPosition(i, h - 1);Console.Write("■");//中间墙Console.SetCursorPosition(i, h - 6);Console.Write("■");
}for (int i = 0; i < h; i++)
{//左边的墙Console.SetCursorPosition(0, i);Console.Write("■");//右边的墙Console.SetCursorPosition(w - 2, i);Console.Write("■");
}
boss相关
int bossX = 24;
int bossY = 15;
int bossAtkMin = 7;
int bossAtkMax = 13;
int bossHp = 100;
string bossIcon = "□";
//声明一个颜色变量
ConsoleColor bossColor = ConsoleColor.Green;//boss活着时才绘制
if (bossHp > 0)
{Console.SetCursorPosition(bossX, bossY);Console.ForegroundColor = bossColor;Console.Write(bossIcon);
}
主角移动相关
int playerX = 4;
int playerY = 5;
int playerAtkMin = 8;
int playerAtkMax = 12;
int playerHp = 100;
string playerIcon = "●";
ConsoleColor playerColor = ConsoleColor.Yellow;
//玩家输入的内容,外面声明,节约性能
char playerInput;
//画出玩家
Console.SetCursorPosition(playerX, playerY);
Console.ForegroundColor = playerColor;
Console.Write(playerIcon);
//得到玩家的输入
playerInput = Console.ReadKey(true).KeyChar;
//擦除
Console.SetCursorPosition(playerX, playerY);
Console.Write(' ');
//改位置
switch (playerInput)
{case 'W':case 'w':--playerY;if (playerY < 1){playerY = 1;}//位置如果和boss重合了,并且boss没有死else if (playerX == bossX && playerY == bossY && bossHp > 0){//拉回去++playerY;}break;case 'A':case 'a':playerX -= 2;if (playerX < 2){playerX = 2;}//位置如果和boss重合了,并且boss没有死else if (playerX == bossX && playerY == bossY && bossHp > 0){//拉回去playerX += 2;}break;case 'S':case 's':++playerY;if (playerY > h - 7){playerY = h - 7;}//位置如果和boss重合了,并且boss没有死else if (playerX == bossX && playerY == bossY && bossHp > 0){//拉回去--playerY;}break;case 'D':case 'd':playerX += 2;if (playerX > w - 4){playerX = w - 4;}else if (playerX == bossX && playerY == bossY && bossHp > 0){//拉回去playerX -= 2;}break;case 'J':case 'j'://开始战斗if ((playerX == bossX && playerY == bossY - 1 || playerX == bossX && playerY == bossY + 1 || playerX == bossX - 2 && playerY == bossY || playerX == bossX + 2 && playerY == bossY) && bossHp > 0){isFight = true;//可以开始战斗Console.SetCursorPosition(2, h - 5);Console.ForegroundColor = ConsoleColor.White;Console.Write("开始和boss战斗了,按J键继续....");Console.SetCursorPosition(2, h - 4);Console.Write("玩家当前的血量为{0}", playerHp);Console.SetCursorPosition(2, h - 3);Console.Write("boss当前的血量为{0}", bossHp);}break;}
主角和boss战斗
bool isFight = false;
//只会处理J键
if (playerInput == 'j' || playerInput == 'J')
{//在这里判断玩家或者boss是否死亡,如果死亡了,继续之后的流程if (playerHp < 0){//游戏结束//输掉了,应该直接显示游戏结束界面nowSceneID = 3;break;}else if (bossHp < 0){//去营救公主//boss擦除Console.SetCursorPosition(bossX,bossY);Console.Write(' ');isFight = false;}else{//去处理按j键打架//玩家打bossRandom random = new Random();//得到随机攻击力int atk = random.Next(playerAtkMin, playerAtkMax);//血量减对应的攻击力bossHp -= atk;//打印信息Console.ForegroundColor = ConsoleColor.Magenta;//先擦除这一行,上次显示的信息Console.SetCursorPosition(2, h - 4);Console.Write(" ");//再来写新的信息Console.SetCursorPosition(2, h - 4);Console.Write("你对boss造成了{0}点伤害,boss剩余血量为{1}", atk, bossHp);//boss打玩家if (bossHp > 0){//得到随机攻击力atk = random.Next(bossAtkMin, bossAtkMax);//血量减对应的攻击力playerHp -= atk;//打印信息Console.ForegroundColor = ConsoleColor.Yellow;//先擦除这一行,上次显示的信息Console.SetCursorPosition(2, h - 3);Console.Write(" ");//再来写新的信息Console.SetCursorPosition(2, h - 3);Console.Write("boss对你造成了{0}点伤害,你剩余血量为{1}", atk, playerHp);}else{//擦除之前的战斗信息Console.SetCursorPosition(2, h - 5);Console.Write(" ");Console.SetCursorPosition(2, h - 4);Console.Write(" ");Console.SetCursorPosition(2, h - 3);Console.Write(" ");//显示恭喜胜利的信息Console.SetCursorPosition(2, h - 5);Console.Write("你战胜了boss,快去营救公主吧");Console.SetCursorPosition(2, h - 4);Console.Write("前往公主身边按J键继续...");}}}
公主相关
int princessX = 24;
int princessY = 5;
string princessIcon = "★";
ConsoleColor princessColor = ConsoleColor.Blue;
//作用是从while循环内部的switch改变标识,用来跳出外层的while循环
bool isOver = false;
Console.SetCursorPosition(princessX, princessY);
Console.ForegroundColor = princessColor;
Console.Write(princessIcon);
//判断是否在公主身边按J键else if ((playerX == princessX && playerY == princessY - 1 || playerX == princessX && playerY == princessY + 1 || playerX == princessX - 2 && playerY == princessY || playerX == princessX + 2 && playerY == princessY) && bossHp <= 0){nowSceneID = 3;isOver=true;break;}
结束场景逻辑实现
Console.Clear();
//标题的显示
Console.SetCursorPosition(w / 2 - 4, 5);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("GameOver");
//可变内容的显示,根据失败活着成功显示的内容不一样
Console.SetCursorPosition(w / 2 - 4, 7);
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(gameOver);
int nowSelEndIndex = 0;
while (true)
{bool isQuitEndWhile = false;Console.SetCursorPosition(w / 2 - 6, 9);Console.ForegroundColor = nowSelEndIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;Console.Write("回到开始界面");Console.SetCursorPosition(w / 2 - 4, 11);Console.ForegroundColor = nowSelEndIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;Console.Write("退出游戏");char input = Console.ReadKey(true).KeyChar;switch (input){case 'w':case 'W':--nowSelEndIndex;if (nowSelEndIndex < 0){nowSelEndIndex = 0;}break;case 's':case 'S':++nowSelEndIndex;if (nowSelEndIndex > 1){nowSelEndIndex = 1;}break;case 'j':case 'J':if (nowSelEndIndex == 0){nowSceneID = 1;isQuitEndWhile=true;}else{Environment.Exit(0);}break;}//为了从switch中跳出上一成的while循环加的标识if (isQuitEndWhile){break;}
}
游戏截图:
相关文章:

简单小游戏制作
控制台基础设置 //隐藏光标 Console.CursorVisible false; //通过两个变量来存储舞台的大小 int w 50; int h 30; //设置舞台(控制台)的大小 Console.SetWindowSize(w, h); Console.SetBufferSize(w, h);多个场景 int nowSceneID 1; while (true) …...
Delphi
Delphi,是美国 Borland(宝兰)公司於 1995 年开发在 Windows 平台下的快速应用程式开发工具 (Rapid Application Development,简称 RAD),它的前身是在 DOS 下的产品 Borland Turbo Pascal。(非开源软件&…...
Linux的shell脚本中的比大小
如果要将 -le 换成相反的(即“大于”),你应该使用 -gt(greater than)。 所以,-le 的相反比较是 -gt。 但如果你想要一个包含“大于”和“不等于”的比较(即“大于”),那…...
每日复盘-20240603
20240603 六日涨幅最大: ------1--------300637--------- 扬帆新材 五日涨幅最大: ------1--------300637--------- 扬帆新材 四日涨幅最大: ------1--------301306--------- 西测测试 三日涨幅最大: ------1--------301306--------- 西测测试 二日涨幅最大: ------1--------30…...
adb server version (22000) doesn‘t match this client (41); killing...
参考链接: adb server version (31) doesn’t match this client (41); killing… 解决此问题 电脑安装了360手机助手占用了adb的端口引起的。因为套接字的唯一性(一个套接字只能由 协议/网络地址/端口号 唯一确定 ),一个电脑只能有一个程序…...

如何使用 Connector API 将数据提取到 Elasticsearch Serverless 中
作者:来自 Elastic Jedr Blaszyk Elasticsearch 支持一系列摄取方法。 其中之一是 Elastic Connectors,它将 SQL 数据库或 SharePoint Online 等外部数据源与 Elasticsearch 索引同步。 连接器对于在现有数据之上构建强大的搜索体验特别有用。 例如&…...

体育赛事直播系统开发源码搭建
随着体育产业的蓬勃发展,体育赛事直播已成为广大观众获取赛事信息的重要途径。为了满足观众日益增长的需求,开发一套专业的体育赛事直播系统成为当务之急。本文将围绕体育赛事直播系统开发源码搭建进行深入探讨,从技术选型、系统架构、安全防…...

使用Jmeter进行性能测试
学习视频 B站UP主:白月黑羽编程 目录 Jmeter的下载 Jmeter界面 Jmeter操作 线程组与HTTP请求 测试一个请求 解决响应数据中 中文乱码的问题 HTTP请求默认值 录制网站流量 添加录制控制器 添加HTTP代理服务器 在浏览器配置代理 进行录制 模拟间隔时间 …...

AI技术的发展,会让你工作轻松吗
这两年,人工智能技术迅猛发展,AI产品层出不穷,尤其大语言模型(LLM)的爆火,许多人担心自己的工作会被AI取代。然而,如果AI技术发展到极致,再加上其他科学技术的高度发展,我…...

Spring-DI入门案例
黑马程序员SSM框架教程 文章目录 一、DI入门案例思路分析二、实现步骤2.1 删除service中使用new形式创建的Dao对象2.2 提供以来对象对应的setter方法2.3 配置service与到之间的关系 一、DI入门案例思路分析 基于IoC管理bean(上个案例已经实现)service中…...
ubuntu18.04 报错:fatal error: execution
一、问题描述 在ubuntu18.04上编译Faster-lio 报错: fatal error: execution: 没有那个文件或目录#include <execution> 二、解决方法 需要将g编译器更新到9.0 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update sudo apt install g…...

开源大模型与大模型api的使用优缺点
开源大模型和大模型 API 都是人工智能领域中的重要概念,它们各自有一些优缺点。 开源大模型: 优点: 免费使用: 大多数开源大模型是免费提供的,任何人都可以访问和使用这些模型,降低了使用门槛。可定制性…...

小红书前端2轮面试期望22K,全程问低代码设计
一面(通过) 1、好,那我们开始把,先简单介绍一下自己的一个经历,以及自己有亮点的项目?balabala 2、你可以这样介绍:在这里边主要负责哪几个项目,哪些项目是比较有亮点的࿰…...

HIK录像机GB28181对接相机不在线问题随笔
一、问题现象 【设备信息】型号:DS-8664N-I16-V3 V4.63.000 build 230412 【问题现象】HIK录像机使用GB28181对接异常相机无法正常上线,对接HIK相机可以正常上线。 【现场拓扑】现场拓扑如下 NVR侧使用固定公网IP地址。IPC侧使用家用宽带的方式&…...

stm32-DMA转运数据
在配置前要记得先定义一下DMA转运的源端数组和目标数组两个数组哦。 接下来我们就开始准备配置吧 配置 初始化 1.RCC开启时钟(开启DMA的时钟) void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) 作用:开启时…...

Java编程常见问题汇总一
系列文章目录 文章目录 系列文章目录前言一、字符串连接误用二、错误的使用StringBuffer三、测试字符串相等性四、数字转换成字符串五、利用不可变对象(Immutable) 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…...

用Unityhub安装unity2018.3.0和vuforia
打开下载网址 https://unity.cn/releases/full/2018 选择2018.3.x 找到2018.3.0后,点击从UnityHub下载 然后unityhub会弹出安装界面 只勾选这两个,其余的全部取消勾选,默认勾选上的也取消掉,然后点击安装...

智汇云舟与芯瞳完成兼容适配,共建国产化生态体系
近日,智汇云舟的视频孪生系列产品和时空大数据系列产品已完成与芯瞳半导体技术(山东)有限公司GPU产品GB2062/GB2064/CQ2040/CQ2040 MXM/CQ2040 MD的相互兼容性测试认证。双方产品经过严格测试,已完成兼容适配,具备良好…...
「动态规划」最大子数组和
力扣原题链接,点击跳转。 请在一个数组nums中找出一个子数组,使得这个子数组中所有元素的和最大。 你当然可以采取暴力枚举的方法,但是效率太低。这里我们用动态规划的思想来解决这个问题。首先确定状态表示:我们用dp[i]表示以i…...
【LeetCode 130. 被围绕的区域】
1. 题目 2. 分析 这题其实非常不错。如果正向解,非常麻烦;因为很难界定哪些O是被包围的?但是如果反向解呢?因为边界的O不会被包围,那么就可以想到跟边界O相连的O都不会被包围。那么除此之外的O都会被包围,…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...