9.游戏场景-扔骰子
9.1 知识点
class 语句块内 主函数外
创建擦除提示的函数
static void ClearInfo(int h)
{
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 - 2);
Console.Write(" ");
}
创建扔色子函数
/// <summary>
/// 扔色子函数
/// </summary>
/// <param name="w">窗口的宽</param>
/// <param name="h">窗口的高</param>
/// <param name="p">扔色子的对象</param>
/// <param name="otherP">扔色子的对手对象</param>
/// <param name="map">地图信息</param>
/// <returns>默认返回false 代表没有结束</returns>
static bool RandomMove(int w, int h, ref Player p, ref Player otherP, Map map)
{
//擦除之前显示的提示信息
ClearInfo(h);
//根据扔色子的玩家类型 决定信息的颜色
Console.ForegroundColor = p.type == E_PlayerType.Player ? ConsoleColor.Cyan : ConsoleColor.Magenta;
//扔色子之前 判断 玩家是否处于暂停状态
if ( p.isPause )
{
//绘制信息
Console.SetCursorPosition(2, h - 5);
Console.Write("处于暂停状态,{0}需要暂停一回合", p.type == E_PlayerType.Player ? "你" : "电脑");
Console.SetCursorPosition(2, h - 4);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
//停止暂停
p.isPause = false;
return false;
}
//扔色子目的 是改变 玩家或者电脑的位置 计算位置的变化
//扔色子 随机一个1到6的数 加上去
Random r = new Random();
int randomNum = r.Next(1, 7);
p.nowIndex += randomNum;
//打印扔的点数
Console.SetCursorPosition(2, h - 5);
Console.Write("{0}扔出的点数为:{1}", p.type == E_PlayerType.Player ? "你" : "电脑", randomNum);
//判断是否到终点了
if ( p.nowIndex >= map.grids.Length - 1 )
{
//到终点了 打印到中掉了 防止打印溢出
p.nowIndex = map.grids.Length - 1;
//绘制信息
Console.SetCursorPosition(2, h - 4);
if ( p.type == E_PlayerType.Player )
{
Console.Write("恭喜你,你率先到达了终点");
}
else
{
Console.Write("很遗憾,电脑率到达了终点");
}
Console.SetCursorPosition(2, h - 3);
Console.Write("请按任意键结束游戏");
return true;
}
else
{
//没有到终点 就判断 当前对象 到了一个怎么样的格子
Grid grid = map.grids[p.nowIndex];
switch (grid.type)
{
case E_Grid_Type.Normal:
//普通格子不用处理
//绘制信息
Console.SetCursorPosition(2, h - 4);
Console.Write("{0}到了一个安全位置", p.type == E_PlayerType.Player ? "你" : "电脑");
Console.SetCursorPosition(2, h - 3);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
break;
case E_Grid_Type.Boom:
//炸弹退格
p.nowIndex -= 5;
//不能比起点还小
if( p.nowIndex < 0 )
{
p.nowIndex = 0;
}
//绘制信息
Console.SetCursorPosition(2, h - 4);
Console.Write("{0}踩到了炸弹,退后5格", p.type == E_PlayerType.Player ? "你" : "电脑");
Console.SetCursorPosition(2, h - 3);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
break;
case E_Grid_Type.Pause:
//暂停一回合
//暂停目前 只有加一个对象的暂停标识 才能知道 下一回合它是不是不能扔色子
//下回合要暂停
p.isPause = true;
//绘制信息
Console.SetCursorPosition(2, h - 4);
Console.Write("{0}到达了暂停点,你需要暂停一回合", p.type == E_PlayerType.Player ? "你" : "电脑");
Console.SetCursorPosition(2, h - 3);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
break;
case E_Grid_Type.Tunnel:
//绘制信息
Console.SetCursorPosition(2, h - 4);
Console.Write("{0}踩到了时空隧道", p.type == E_PlayerType.Player ? "你" : "电脑");
//随机
randomNum = r.Next(1, 91);
//触发 倒退
if( randomNum <= 30 )
{
p.nowIndex -= 5;
if( p.nowIndex < 0 )
{
p.nowIndex = 0;
}
Console.SetCursorPosition(2, h - 3);
Console.Write("触发倒退5格");
}
//触发 暂停
else if( randomNum <= 60 )
{
p.isPause = true;
Console.SetCursorPosition(2, h - 3);
Console.Write("触发暂停一回合");
}
//触发换位置
else
{
int temp = p.nowIndex;
p.nowIndex = otherP.nowIndex;
otherP.nowIndex = temp;
Console.SetCursorPosition(2, h - 3);
Console.Write("惊喜,惊喜,双方交换位置");
}
//绘制信息
Console.SetCursorPosition(2, h - 2);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
break;
}
}
//默认没有结束
return false;
}
创建 玩家或电脑 每一次扔色子 移动绘制判断游戏结束 函数
//返回游戏是否结束的判断值
static bool PlayerRandomMoveDrawJudge(int w, int h, ref Player p, ref Player otherP, Map map, ref E_SceneType nowSceneType)
{
//之后的游戏逻辑
//玩家扔色子逻辑
//检测输入
Console.ReadKey(true);
//扔色子的逻辑
bool isGameOver = RandomMove(w, h, ref p, ref otherP, map);
//绘制地图
map.Draw();
//绘制玩家
DrawPlayer(p, otherP, map);
//判断是否要结束游戏
if (isGameOver)
{
//卡住程序 让顽疾按任意键
Console.ReadKey(true);
//改变场景ID
nowSceneType = E_SceneType.End;
//直接跳出循环
}
return isGameOver;
}
class 语句块内 主函数外 游戏场景逻辑函数内
创建游戏结束标识
bool isGameOver = false;
创建游戏场景死循环
while (true)
{
// 游戏逻辑
}
游戏场景死循环内 扔色子 实现方式1
// 玩家扔色子逻辑
// 检测输入
Console.ReadKey(true);
// 扔色子的逻辑
isGameOver = RandomMove(w, h, ref player, ref computer, map);
// 绘制地图
map.Draw();
// 绘制玩家
DrawPlayer(player, computer, map);
// 判断是否要结束游戏
if (isGameOver)
{
// 卡住程序,让玩家按任意键
Console.ReadKey(true);
// 改变场景ID
nowSceneType = E_SceneType.End;
// 直接跳出循环
break;
}
// 电脑扔色子逻辑
// 检测输入
Console.ReadKey(true);
// 扔色子的逻辑
isGameOver = RandomMove(w, h, ref computer, ref player, map);
// 绘制地图
map.Draw();
// 绘制玩家
DrawPlayer(player, computer, map);
// 判断是否要结束游戏
if (isGameOver)
{
// 卡住程序,让玩家按任意键
Console.ReadKey(true);
// 改变场景ID
nowSceneType = E_SceneType.End;
// 直接跳出循环
break;
}
游戏场景死循环内 扔色子 实现方式2
// 玩家扔色子逻辑
// 检测输入
Console.ReadKey(true);
// 扔色子的逻辑(实现方式2)
isGameOver = RandomMove2(w, h, ref player, ref computer, map);
// 绘制地图
map.Draw();
// 绘制玩家
DrawPlayer(player, computer, map);
// 判断是否要结束游戏
if (isGameOver)
{
// 卡住程序,让玩家按任意键
Console.ReadKey(true);
// 改变场景ID
nowSceneType = E_SceneType.End;
// 直接跳出循环
break;
}
// 电脑扔色子逻辑
// 检测输入
Console.ReadKey(true);
// 扔色子的逻辑(实现方式2)
isGameOver = RandomMove2(w, h, ref computer, ref player, map);
// 绘制地图
map.Draw();
// 绘制玩家
DrawPlayer(player, computer, map);
// 判断是否要结束游戏
if (isGameOver)
{
// 卡住程序,让玩家按任意键
Console.ReadKey(true);
// 改变场景ID
nowSceneType = E_SceneType.End;
// 直接跳出循环
break;
}
9.2 知识点代码
class语句块外 namespace语句块内
//创建擦除提示的函数
static void ClearInfo(int h)
{
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 - 2);
Console.Write(" ");
}
//创建扔色子函数
/// <summary>
/// 扔色子函数
/// </summary>
/// <param name="w">窗口的宽</param>
/// <param name="h">窗口的高</param>
/// <param name="p">扔色子的对象</param>
/// <param name="otherP">扔色子的对手对象</param>
/// <param name="map">地图信息</param>
/// <returns>默认返回false 代表没有结束</returns>
static bool RandomMove(int w, int h, ref Player p, ref Player otherP, Map map)
{
//擦除之前显示的提示信息
ClearInfo(h);
//根据扔色子的玩家类型 决定信息的颜色
Console.ForegroundColor = p.type == E_PlayerType.Player ? ConsoleColor.Cyan : ConsoleColor.Magenta;
//扔色子之前 判断 玩家是否处于暂停状态
if (p.isPause)
{
//绘制信息
Console.SetCursorPosition(2, h - 5);
Console.Write("处于暂停状态,{0}需要暂停一回合", p.type == E_PlayerType.Player ? "你" : "电脑");
Console.SetCursorPosition(2, h - 4);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
//停止暂停
p.isPause = false;
return false;
}
//扔色子目的 是改变 玩家或者电脑的位置 计算位置的变化
//扔色子 随机一个1到6的数 加上去
Random r = new Random();
int randomNum = r.Next(1, 7);
p.nowIndex += randomNum;
//打印扔的点数
Console.SetCursorPosition(2, h - 5);
Console.Write("{0}扔出的点数为:{1}", p.type == E_PlayerType.Player ? "你" : "电脑", randomNum);
//判断是否到终点了
if (p.nowIndex >= map.grids.Length - 1)
{
//到终点了 打印到中掉了 防止打印溢出
p.nowIndex = map.grids.Length - 1;
//绘制信息
Console.SetCursorPosition(2, h - 4);
if (p.type == E_PlayerType.Player)
{
Console.Write("恭喜你,你率先到达了终点");
}
else
{
Console.Write("很遗憾,电脑率到达了终点");
}
Console.SetCursorPosition(2, h - 3);
Console.Write("请按任意键结束游戏");
return true;
}
else
{
//没有到终点 就判断 当前对象 到了一个怎么样的格子
Grid grid = map.grids[p.nowIndex];
switch (grid.type)
{
case E_Grid_Type.Normal:
//普通格子不用处理
//绘制信息
Console.SetCursorPosition(2, h - 4);
Console.Write("{0}到了一个安全位置", p.type == E_PlayerType.Player ? "你" : "电脑");
Console.SetCursorPosition(2, h - 3);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
break;
case E_Grid_Type.Boom:
//炸弹退格
p.nowIndex -= 5;
//不能比起点还小
if (p.nowIndex < 0)
{
p.nowIndex = 0;
}
//绘制信息
Console.SetCursorPosition(2, h - 4);
Console.Write("{0}踩到了炸弹,退后5格", p.type == E_Player
Type.Player ? "你" : "电脑");
Console.SetCursorPosition(2, h - 3);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
break;
case E_Grid_Type.Pause:
//暂停一回合
//暂停目前 只有加一个对象的暂停标识 才能知道 下一回合它是不是不能扔色子
//下回合要暂停
p.isPause = true;
//绘制信息
Console.SetCursorPosition(2, h - 4);
Console.Write("{0}到达了暂停点,你需要暂停一回合", p.type == E_PlayerType.Player ? "你" : "电脑");
Console.SetCursorPosition(2, h - 3);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
break;
case E_Grid_Type.Tunnel:
//绘制信息
Console.SetCursorPosition(2, h - 4);
Console.Write("{0}踩到了时空隧道", p.type == E_PlayerType.Player ? "你" : "电脑");
//随机
randomNum = r.Next(1, 91);
//触发 倒退
if (randomNum <= 30)
{
p.nowIndex -= 5;
if (p.nowIndex < 0)
{
p.nowIndex = 0;
}
Console.SetCursorPosition(2, h - 3);
Console.Write("触发倒退5格");
}
//触发 暂停
else if (randomNum <= 60)
{
p.isPause = true;
Console.SetCursorPosition(2, h - 3);
Console.Write("触发暂停一回合");
}
//触发换位置
else
{
int temp = p.nowIndex;
p.nowIndex = otherP.nowIndex;
otherP.nowIndex = temp;
Console.SetCursorPosition(2, h - 3);
Console.Write("惊喜,惊喜,双方交换位置");
}
//绘制信息
Console.SetCursorPosition(2, h - 2);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
break;
}
}
//默认没有结束
return false;
}
class语句块内 主函数外 游戏场景逻辑函数内
//主函数外 class语句块内
//创建游戏场景函数
//控制台宽 高 场景标识变量为开始场景和结束场景函数的参数
//场景标识变量添加ref修饰 使场景标识的值能在函数内部被修改时生效
static void GameScene(int w, int h, ref E_SceneType nowSceneType)
{
//调用画墙函数 绘制不变内容(红墙 提示等等)
DrawWall(w, h);
//绘制地图
//初始化一张地图
Map map = new Map(14, 3, 80);
//调用地图的画方法
map.Draw();
//创建玩家和电脑
Player player = new Player(0, E_PlayerType.Player);
Player computer = new Player(0, E_PlayerType.Computer);
//绘制玩家和电脑
DrawPlayer(player, computer, map);
//创建游戏结束标识
bool isGameOver = false;
//创建游戏场景死循环
while (true)
{
//游戏逻辑
#region 8 游戏场景死循环内 扔色子 实现方式1
////玩家扔色子逻辑
////检测输入
//Console.ReadKey(true);
////扔色子的逻辑
//isGameOver = RandomMove(w, h, ref player, ref computer, map);
////绘制地图
//map.Draw();
////绘制玩家
//DrawPlayer(player, computer, map);
////判断是否要结束游戏
//if (isGameOver)
//{
// //卡住程序 让玩家按任意键
// Console.ReadKey(true);
// //改变场景ID
// nowSceneType = E_SceneType.End;
// //直接跳出循环
// break;
//}
////电脑扔色子逻辑
////检测输入
//Console.ReadKey(true);
////扔色子的逻辑
//isGameOver = RandomMove(w, h, ref computer, ref player, map);
////绘制地图
//map.Draw();
////绘制玩家
//DrawPlayer(player, computer, map);
////判断是否要结束游戏
//if (isGameOver)
//{
// //卡住程序 让玩家按任意键
// Console.ReadKey(true);
// //改变场景ID
// nowSceneType = E_SceneType.End;
// //直接跳出循环
// break;
//}
#endregion
#region 8 游戏场景死循环内 扔色子 实现方式2
//玩家扔色子
if (PlayerRandomMoveDrawJudge(w, h, ref player, ref computer, map, ref nowSceneType))
{
break;
}
//电脑扔色子
if (PlayerRandomMoveDrawJudge(w, h, ref computer, ref player, map, ref nowSceneType))
{
break;
}
#endregion
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com