本文主要是介绍飞行棋(C#),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 效果展示
- 主函数
- 场景类型枚举
- 控制台基础设置
- 开始及结束场景逻辑
- 游戏场景逻辑
- 固定打印的信息
- 格子类型枚举和格子结构体
- 地图结构体
- 玩家和电脑结构体
-
- 扔骰子逻辑
效果展示
主函数
static void Main(string[] args)
{
int w = 50;
int h = 30;
ConsoleInit(w, h);
E_SceneType nowSceneType = E_SceneType.Begin;
while (true)
{
switch (nowSceneType)
{
case E_SceneType.Begin:
Console.Clear();
GameEndOrBegin(w, h, ref nowSceneType);
break;
case E_SceneType.Game:
Console.Clear();
GameScene(w, h, ref nowSceneType);
break;
case E_SceneType.End:
Console.Clear();
GameEndOrBegin(w, h, ref nowSceneType);
break;
default:
break;
}
}
}
场景类型枚举
enum E_SceneType
{
Begin,
Game,
End,
}
控制台基础设置
static void ConsoleInit(int w, int h)
{
//控制台设置
Console.CursorVisible = false;
Console.SetWindowSize(w, h);
Console.SetBufferSize(w, h);
}
开始及结束场景逻辑
static void GameEndOrBegin(int w, int h, ref E_SceneType nowSceneType)
{
Console.ForegroundColor = ConsoleColor.White;
Console.SetCursorPosition(nowSceneType == E_SceneType.Begin ? w / 2 - 3 : w / 2 - 4, 8);
Console.Write(nowSceneType == E_SceneType.Begin ? "飞行棋" : "游戏结束");
//当前选项的编号
int count = 0;
bool IsOver = false;
while (true)
{
Console.SetCursorPosition(nowSceneType ==E_SceneType.Begin? w/2-4:w/2-5, 11);
Console.ForegroundColor = count == 0 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write(nowSceneType == E_SceneType.Begin? "游戏开始":"回到主菜单");
Console.SetCursorPosition(w/2-4, 13);
Console.ForegroundColor = count == 1 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write("退出游戏");
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.W:
--count;
if (count < 0)
{
count = 0;
}
break;
case ConsoleKey.S:
++count;
if (count > 1)
{
count = 1;
}
break;
case ConsoleKey.J:
if(count == 0)
{
nowSceneType = nowSceneType ==E_SceneType.Begin? E_SceneType.Game:E_SceneType.Begin;
IsOver = true;
}
else
{
Environment.Exit(0);
}
break;
}
if (IsOver)
break;
}
}
游戏场景逻辑
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_Player_Type.Player);
Player computer = new Player(0, E_Player_Type.Computer);
DrawPlayer(map, player, computer);
while (true)
{
if (PlayerRandomMove(w, h, ref player, ref computer, map, ref nowSceneType))
{
break;
}
if (PlayerRandomMove(w, h, ref computer, ref player, map, ref nowSceneType))
{
break;
}
}
}
static bool PlayerRandomMove(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(map, p, otherP);
//判断是否要结束游戏
if(isGameOver)
{
//卡住程序 让玩家按任意键
Console.ReadKey(true);
nowSceneType = E_SceneType.End;
}
return isGameOver;
}
固定打印的信息
static void DrawWall(int w, int h)
{
Console.ForegroundColor = ConsoleColor.Red;
//横着的墙
for (int i = 0; i < w; i+=2)
{
//最上面一行
Console.SetCursorPosition(i, 0);
Console.Write("■");
//中间一行
Console.SetCursorPosition(i, h-6);
Console.Write("■");
Console.SetCursorPosition(i, h - 11);
Console.Write("■");
//最下面一行
Console.SetCursorPosition(i, h-1);
Console.Write("■");
}
//竖着的墙
for(int i = 0; i < h; i++)
{
//左边的墙
Console.SetCursorPosition(0, i);
Console.Write("■");
//右边的墙
Console.SetCursorPosition(w-2, i);
Console.Write("■");
}
Console.SetCursorPosition(2, h - 5);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("按任意键开始扔色子");
Console.SetCursorPosition(2, h - 10);
Console.Write("□:普通格子");
Console.SetCursorPosition(2, h - 9);
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write("■:暂停,一回合不动");
Console.SetCursorPosition(22,h - 9);
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("●:炸弹,倒退5格");
Console.SetCursorPosition(2, h - 8);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("×:时空隧道,随机倒退,暂停,交换位置");
Console.SetCursorPosition(2, h - 7);
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("★:玩家 ");
Console.SetCursorPosition(11, h - 7);
Console.ForegroundColor = ConsoleColor.Magenta;
Console.Write("▲:电脑 ");
Console.SetCursorPosition(20, h - 7);
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write("◎:玩家电脑重合");
}
格子类型枚举和格子结构体
enum E_Grid_Type
{
Normal,
Boom,
Pause,
Tunnel,
}
/// <summary>
/// 位置信息结构体
/// </summary>
struct Vector2
{
public int x;
public int y;
public Vector2(int x, int y)
{
this.x = x;
this.y = y;
}
}
struct Grid
{
//格子的类型
public E_Grid_Type _type;
//格子的位置
public Vector2 pos;
//构造函数
public Grid(int x, int y, E_Grid_Type type)
{
pos.x = x;
pos.y = y;
_type = type;
}
//画一个格子
public void Draw()
{
Console.SetCursorPosition(pos.x, pos.y);
switch(_type)
{
case E_Grid_Type.Normal:
Console.ForegroundColor = ConsoleColor.White;
Console.Write("□");
break;
case E_Grid_Type.Boom:
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("●");
break;
case E_Grid_Type.Pause:
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write("■");
break;
case E_Grid_Type.Tunnel:
Console.ForegroundColor = ConsoleColor.White;
Console.Write("×");
break;
}
}
}
地图结构体
struct Map
{
public Grid[] grids;
public Map(int x, int y, int num)
{
grids = new Grid[num];
int indexX = 0;
int indexY = 0;
int stepNum = 2;
Random r = new Random();
int randomNum;
for(int i = 0; i < num; i++)
{
randomNum = r.Next(0, 101);
if(randomNum < 85 || i == 0 || i == num - 1)
{
//普通格子
grids[i]._type = E_Grid_Type.Normal;
}
else if(randomNum < 90 && randomNum >=85)
{
//炸弹
grids[i]._type = E_Grid_Type.Boom;
}
else if(randomNum < 95 && randomNum >=90)
{
//暂停
grids[i]._type = E_Grid_Type.Pause;
}
else
{
//时空隧道
grids[i]._type = E_Grid_Type.Tunnel;
}
grids[i].pos = new Vector2(x, y);
if(indexX == 10)
{
y += 1;
indexY++;
if(indexY == 2)
{
indexX = 0;
indexY = 0;
stepNum = -stepNum;
}
}
else
{
x += stepNum;
indexX++;
}
}
}
public void Draw()
{
for (int i = 0; i < grids.Length; i++)
{
grids[i].Draw();
}
}
}
玩家和电脑结构体
enum E_Player_Type
{
Player,
Computer,
}
struct Player
{
public E_Player_Type type;
public int nowIndex;
//是否暂停的标识
public bool isPause;
public Player(int index, E_Player_Type type)
{
nowIndex = index;
this.type = type;
isPause = false;
}
public void Draw(Map mapInfo)
{
//从传入的地图中得到格子信息
Grid grid = mapInfo.grids[nowIndex];
Console.SetCursorPosition(grid.pos.x, grid.pos.y);
switch(type)
{
case E_Player_Type.Player:
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("★");
break;
case E_Player_Type.Computer:
Console.ForegroundColor = ConsoleColor.Magenta;
Console.Write("▲");
break;
}
}
}
绘制玩家
static void DrawPlayer(Map map, Player player, Player computer)
{
//重合时
if(player.nowIndex == computer.nowIndex)
{
//得到重合的位置
Grid grid = map.grids[player.nowIndex];
Console.SetCursorPosition(grid.pos.x, grid.pos.y);
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.Write("◎");
}
//不重合时
else
{
player.Draw(map);
computer.Draw(map);
}
}
扔骰子逻辑
//擦除提示的函数
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="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_Player_Type.Player ? ConsoleColor.Cyan : ConsoleColor.Magenta;
//扔色子之前判断玩家是否处于暂停状态
if(p.isPause)
{
Console.SetCursorPosition(2, h - 5);
Console.Write("处于暂停状态,{0}需要暂停一回合", p.type == E_Player_Type.Player ? "你" : "电脑");
Console.SetCursorPosition(2, h - 4);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_Player_Type.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_Player_Type.Player ? "你" : "电脑", randomNum);
//首先判断是否到终点了
if(p.nowIndex >= map.grids.Length - 1)
{
p.nowIndex = map.grids.Length - 1;
Console.SetCursorPosition(2, h - 4);
if(p.type == E_Player_Type.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_Player_Type.Player ? "你" : "电脑");
Console.SetCursorPosition(2, h - 3);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_Player_Type.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_Player_Type.Player ? "电脑" : "你");
break;
case E_Grid_Type.Pause:
p.isPause = true;
Console.SetCursorPosition(2, h - 4);
Console.Write("{0}到达了暂停点,你需要暂停一回合", p.type == E_Player_Type.Player ? "你" : "电脑");
Console.SetCursorPosition(2, h - 3);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_Player_Type.Player ? "电脑" : "你");
break;
case E_Grid_Type.Tunnel:
Console.SetCursorPosition(2, h - 4);
Console.Write("{0}踩到了时空隧道", p.type == E_Player_Type.Player ? "你" : "电脑");
//随机
randomNum = r.Next(1, 91);
if(randomNum <= 30)
{
//倒退
p.nowIndex -= 5;
if(p.nowIndex < 0)
{
p.nowIndex = 0;
}
Console.SetCursorPosition(2, h - 5);
Console.Write("触发倒退5格");
}
else if(randomNum <= 60)
{
p.isPause = true;
Console.SetCursorPosition(2, h - 3);
Console.Write("触发暂停一回合");
}
else
{
int tmp = p.nowIndex;
p.nowIndex = otherP.nowIndex;
otherP.nowIndex = tmp;
Console.SetCursorPosition(2, h - 3);
Console.Write("惊喜,双方交换位置");
}
Console.SetCursorPosition(2, h - 2);
Console.Write("请按任意键,让{0}开始扔色子", p.type == E_Player_Type.Player ? "电脑" : "你");
break;
}
}
//默认没有结束
return false;
}
这篇关于飞行棋(C#)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!