14.代码汇总
14.1 代码汇总
using System;
namespace 入门实践
{
class Program
{
static void Main(string[] args)
{
#region 1 控制台基础设置
//隐藏光标
Console.CursorVisible = false;
//设置两个变量来存储 舞台的大小
int w = 50;
int h = 30;
//设置舞台(控制台)的大小
Console.SetWindowSize(w, h);
Console.SetBufferSize(w, h);
#endregion
#region 2 多个场景
//定义场景编号变量
//设置当前所在场景的编号
//1是开始界面 2是游戏界面 3是结束界面
int nowSceneID = 1;
#region 9 结束场景相关
//游戏游戏主逻辑死循环外 声明结束场景信息字符串变量
//用于在结束场景显示相应的文字提示内容
string gameOverInfo = "";
#endregion
//设置游戏主逻辑死循环
while (true)
{
//游戏主逻辑死循环内 根据场景ID设置条件分支
//不同的场景ID 进行不同的逻辑处理
switch (nowSceneID)
{
//开始场景
case 1:
Console.Clear();
#region 3 开始场景逻辑
//设置开始场景标题
Console.SetCursorPosition(w / 2 - 7, 8);
Console.Write("韬老狮营救公主");
//设置当前选项的编号变量 并进行初始化
//0是开始游戏 1是退出游戏
int nowSelIndex = 0;
//设置开始场景死循环
//因为在开始场景要不停的进行输入 输入ws进行选项的更换
//所以我们可以构造一个 开始界面自己的 死循环
//专门用来处理 开始场景相关的逻辑
while (true)
{
//开始场景死循环内 声明一个是否退出开始场景死循环的标识
//处理在开始场景死循环内的检测输入内容进行条件分支的switch逻辑执行时
//假如希望退出开始场景死循环 改变标识 末尾处补上对应判断语句即可
bool isQuitBeginWhile = false;
//开始场景死循环内 设置显示两个选项的内容
//先设置光标位置 再输入显示对应选项的文本内容
Console.SetCursorPosition(w / 2 - 4, 13);
//根据当前选择的编号来决定当前的选项是否应该变色是否变色
Console.ForegroundColor = nowSelIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write("开始游戏");
//先设置光标位置 再输入显示对应选项的文本内容
Console.SetCursorPosition(w / 2 - 4, 15);
//根据当前选择的编号来决定当前的选项是否应该变色是否变色
Console.ForegroundColor = nowSelIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write("退出游戏");
//开始场景死循环内 检测玩家输入
//检测玩家输入的一个键内容 并且设置不会再控制台上显示输入的内容
char input = Console.ReadKey(true).KeyChar;
//开始场景死循环内 获得玩家输入的值 根据输入的值进行条件分支 执行对应的逻辑
//W让选项往上 S让选项往下 J确认进入当前选项
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)
{
//改变当前选择的场景ID 改为2游戏场景
//退出开始场景死循环后 重新进入游戏主逻辑死循环时会进入到游戏场景的分支选项
nowSceneID = 2;
//进入游戏场景要退出开始场景 更改开始场景死循环的标识
isQuitBeginWhile = true;
}
else
{
//关闭控制台 退出游戏
Environment.Exit(0);
}
break;
}
//开始场景死循环内 根据是否要退出开始场景死循环标识 判断是否要退出开始场景死循环
if (isQuitBeginWhile)
{
break;
}
}
#endregion
break;
//游戏场景
case 2:
Console.Clear();
#region 4-8 游戏场景逻辑
#region 4 不变的红墙
//设置颜色为红色 为画出红墙做准备
Console.ForegroundColor = ConsoleColor.Red;
//开始画墙
//横着的墙
for (int i = 0; i < w; i += 2)
{
//上方墙
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("■");
}
#endregion
#region 5 Boss相关
//声明boss的相关属性
//包括位置坐标 最大最小攻击力 血量 boss图标 boss颜色
int bossX = 24;
int bossY = 15;
int bossAtkMin = 7;
int bossAtkMax = 13;
int bossHp = 100;
string bossIcon = "■";
//声明一个颜色变量 用于绘制boss时使用
ConsoleColor bossColor = ConsoleColor.Green;
#endregion
#region 6 玩家属性相关
//声明玩家的相关属性
//包括位置坐标 最大最小攻击力 血量 玩家图标 玩家颜色 输入的内容
int playerX = 4;
int playerY = 5;
int playerAtkMin = 8;
int playerAtkMax = 12;
int playerHp = 100;
string playerIcon = "●";
//声明一个颜色变量 用于绘制玩家时使用
ConsoleColor playerColor = ConsoleColor.Yellow;
//声明一个字符型变量来存储玩家输入的内容 在外面声明可以节约性能
char playerInput;
#endregion
#region 8 公主相关
//声明公主的相关属性
int princessX = 24;
int princessY = 5;
string princessIcon = "★";
ConsoleColor princessColor = ConsoleColor.Blue;
//声明成功拯救公主后跳出游戏主逻辑死循环的标识
//作用是 从while循环内部的switch 改变标识 用来跳出外层的while循环
bool isOver = false;
#endregion
#region 7 玩家战斗相关
//声明战斗状态标识
bool isFight = false;
#endregion
//设置游戏场景死循环
//专门用来 检测 玩家输入相关循环
while (true)
{
#region 5 Boss相关
//游戏场景死循环内 把boss绘制出来
//boss活着时才绘制
if (bossHp > 0)
{
//设置光标位置和颜色 绘制boss图标
Console.SetCursorPosition(bossX, bossY);
Console.ForegroundColor = bossColor;
Console.Write(bossIcon);
}
#endregion
#region 8 公主相关
//游戏场景死循环内 boss死亡时 添加逻辑分支 把公主绘制出来
else
{
Console.SetCursorPosition(princessX, princessY);
Console.ForegroundColor = princessColor;
Console.Write(princessIcon);
}
#endregion
#region 6 玩家移动相关
//游戏场景死循环内 把玩家绘制出来
//设置光标位置和颜色 绘制玩家图标
Console.SetCursorPosition(playerX, playerY);
Console.ForegroundColor = playerColor;
Console.Write(playerIcon);
//游戏场景死循环内 得到玩家输入
playerInput = Console.ReadKey(true).KeyChar;
#endregion
//游戏场景死循环内 根据是否是战斗状态处理不同逻辑 把绘制玩家图形和玩家输入枚举放在非战斗状态的分支中
//战斗状态处理什么逻辑
if (isFight)
{
//玩家战斗相关逻辑
#region 7 玩家战斗相关
//游戏场景死循环内 处理进入战斗状态后按j键的逻辑
//如果是战斗状态 应该做什么
//只会处理J键的逻辑
if (playerInput == 'J' || playerInput == 'j')
{
//在这判断 玩家或者boss 是否死亡 如果死亡了 继续之后的流程
//如果玩家死亡
if (playerHp <= 0)
{
//游戏结束
//输掉了 应该直接显示 我们的 游戏结束界面
//切换场景id
nowSceneID = 3;
gameOverInfo = "游戏失败";
break;
}
//如果boss死亡
else if (bossHp <= 0)
{
//去营救公主
//boss擦除
Console.SetCursorPosition(bossX, bossY);
Console.Write(" ");
isFight = false;
}
//玩家和boss都没死 处理按J键对战逻辑
else
{
//得到随机对象
Random r = new Random();
//玩家打boss
//随机出玩家的攻击力
int atk = r.Next(playerAtkMin, playerAtkMax);
//boss血量减对应的攻击力
bossHp -= atk;
//打印玩家的攻击信息
//设置输出的字体颜色
Console.ForegroundColor = ConsoleColor.Green;
//先擦除这一行 上次显示的内容
Console.SetCursorPosition(2, h - 4);
Console.Write(" ");
//再来写新的信息
//输出玩家对boss的伤害信息
Console.SetCursorPosition(2, h - 4);
Console.Write("你对boss造成了{0}点伤害,boss剩余血量为{1}", atk, bossHp);
//boss打玩家
//boss大于0才可以对玩家进行攻击
if (bossHp > 0)
{
//随机出boss的攻击力
atk = r.Next(bossAtkMin, bossAtkMax);
//玩家血量减对应的攻击力
playerHp -= atk;
//打印boss的攻击信息
//设置输出的字体颜色
Console.ForegroundColor = ConsoleColor.Yellow;
//先擦除这一行 上次显示的内容
Console.SetCursorPosition(2, h - 3);
Console.Write(" ");
//再来写新的信息
//如果boss把玩家打死了
if (playerHp <= 0)
{
//输出失败信息
Console.SetCursorPosition(2, h - 3);
Console.Write("很遗憾,你未能通过boss的试炼,战败了");
}
//boss没有把玩家打死
else
{
//输出boss对玩家的伤害信息
Console.SetCursorPosition(2, h - 3);
Console.Write("boss对你造成了{0}点伤害,你的剩余血量为{1}", atk, playerHp);
}
}
//boss血量小于等于boss死亡了
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键继续");
}
}
}
#endregion
}
//非战斗状态处理什么逻辑
else
{
//玩家移动相关逻辑
//包括擦除上一次玩家所在位置绘制的玩家图形和根据玩家输入的字符枚举获得新的位置信息的switch
#region 6 玩家移动相关
//游戏场景死循环内 擦除上一次玩家所在位置绘制的玩家图形
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;
}
//游戏场景死循环内的玩家输入枚举分支中 wasd上下左右移动过程中
//如果boss死亡且位置和公主重合了要回退 不能将公主覆盖
else if ( playerX == princessX && playerY == princessY && bossHp <= 0 )
{
//拉回去
++playerY;
}
break;
case 'A':
case 'a':
playerX -= 2;
if (playerX < 2)
{
playerX = 2;
}
else if (playerX == bossX && playerY == bossY && bossHp > 0)
{
//拉回去
playerX += 2;
}
else if (playerX == princessX && playerY == princessY && bossHp <= 0)
{
//拉回去
playerX += 2;
}
break;
case 'S':
case 's':
++playerY;
if (playerY > h - 7)
{
playerY = h - 7;
}
else if (playerX == bossX && playerY == bossY && bossHp > 0)
{
//拉回去
--playerY;
}
else if (playerX == princessX && playerY == princessY && 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;
}
else if (playerX == princessX && playerY == princessY && bossHp <= 0)
{
//拉回去
playerX -= 2;
}
break;
//游戏场景死循环内的玩家输入枚举分支中 添加按j键的分支逻辑
case 'J':
case 'j':
#region 7 玩家战斗相关
//游戏场景死循环内的玩家输入枚举分支中的j键的分支中 添加玩家战斗相关逻辑
//要让玩家不能再移动
//更改战斗状态标识 可以跳出当前游戏场景死循环 就进入战斗状态逻辑 不会进入非战斗状态的移动逻辑
//下方能够显示信息
// 当玩家在boss身边一格且boss血量大于0的时候可以开始战斗
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);
}
#endregion
#region 8 公主相关
//判断是否在公主身边按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)
{
//改变 场景ID
nowSceneID = 3;
gameOverInfo = "游戏通关";
//改变跳出成功拯救公主后跳出游戏主逻辑死循环的标识
//跳出 游戏界面的while循环 回到主循环
isOver = true;
}
#endregion
break;
}
#endregion
}
#region 8 公主相关
//游戏场景逻辑末尾添加跳出是否跳出循环判断逻辑
//外层while循环逻辑
if (isOver)
{
//就是和while配对
break;
}
#endregion
}
#endregion
break;
//结束场景
case 3:
Console.Clear();
#region 9 结束场景逻辑
//设置结束场景标题
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(gameOverInfo);
//设置当前选项的编号变量 并进行初始化
//0是回到开始界面 1是退出游戏
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;
}
}
#endregion
break;
}
}
#endregion
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com