12.游戏场景-公主相关
12.1 知识点
声明公主的相关属性
int princessX = 24;
int princessY = 5;
string princessIcon = "★";
ConsoleColor princessColor = ConsoleColor.Blue;
声明成功拯救公主后跳出游戏主逻辑死循环的标识
// 作用是从while循环内部的switch改变标识,用来跳出外层的while循环
bool isOver = false;
游戏场景死循环内,boss死亡时添加逻辑分支,把公主绘制出来
else
{
Console.SetCursorPosition(princessX, princessY);
Console.ForegroundColor = princessColor;
Console.Write(princessIcon);
}
游戏场景死循环内的玩家输入枚举分支中,WASD上下左右移动过程中,如果boss死亡且位置和公主重合了要回退,不能将公主覆盖
else if (playerX == princessX && playerY == princessY && bossHp <= 0)
{
// 拉回去
++playerY;
}
游戏场景死循环内的玩家输入枚举分支中,添加按J键的分支逻辑
// 判断是否在公主身边按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;
}
游戏场景逻辑末尾添加跳出是否跳出循环判断逻辑
// 外层while循环逻辑
if (isOver)
{
// 就是和while配对
break;
}
12.2 知识点代码
#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
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com