前段时间用C#写了一个骑士飞行棋的练习,现在想起了把他贴出来,用来练习基础知识非常好,如果需要完整的项目源码可以到这来去下载:完整项目代码下载
先来看看游戏规则:
图例说明:
幸运轮盘:◎ 地雷:☆ 暂停:▲ 时空隧道:卐 普通:□
玩家“张三”和“李四”的士兵分别用“ Α 和 Β ”来标识
如果Α与Β在同一个位置上时,那我们用“<>”来标识!
///1踩到幸运轮盘◎:可请选择下面两项进行操作【1】:交换位置 【2】:进行轰炸(对方回退6步)
///2踩到地雷☆ 将会被打回起点!按任意键撤回
///3踩到暂停▲ 对方可以进行连续走两次
///4踩到时空隧道卐 前进10步
谁先到达终点谁去的最后的胜利。
具体的实现代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace chess
{
class Chess
{
///
/// 存储玩家姓名
///
private static String[] name = new String[2];
///
/// 在数组map中
///1标识幸运轮盘◎
///2标识地雷☆
///3标识暂停▲
///4标识时空隧道卐
///0标识普通□
///
private static int[] map = new int[100];
///
/// 存储玩家士兵在地铁上的位置
///
private static int[] ab_pos = { 0, 0 };
///
/// 初始化一个全局的随机产生器
///
private static Random random = new Random();
public Chess()
{
showUI();
Console.WriteLine("请输入玩家Α的姓名");
setName(out name[0],0);
Console.WriteLine("请输入玩家Β的姓名");
setName(out name[1],1);
Console.Clear();
showUI();
drawMap();
Console.WriteLine("开始游戏......");
while (true)
{
Boolean isWin;
action(0, out isWin);
if (isWin)
{
Console.WriteLine("\n恭喜玩家 {0} 取得胜利!", name[0]);
break;
}
action(1, out isWin);
if (isWin)
{
Console.WriteLine("\n恭喜玩家 {0} 取得胜利!", name[1]);
break;
}
}
}
///
/// 显示初始UI
///
private void showUI()
{
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.WriteLine("************************************************************");
Console.WriteLine("* *");
Console.WriteLine("* 骑 士 飞 行 棋 *");
Console.WriteLine("* *");
Console.WriteLine("************************************************************");
Console.ResetColor();
}
///
/// 用于设置玩家姓名
///
///
///
private void setName(out String iName,int i)
{
while (true)
{
iName = Console.ReadLine(); //输入玩家A的姓名
if (i == 1)
{
if (iName.Equals(name[0]))
{
Console.WriteLine("玩家Α和Β的姓名不能相同,请在重新输入!");
continue; //继续输入
}
}
if (iName == null || iName.Equals(""))
{
Console.WriteLine("玩家姓名不能为空,请在重新输入!");
continue; //继续输入
}
else
{
break; //输入合理,退出循环
}
}
}
///
/// 游戏说明
///
private void introduce()
{
Console.WriteLine("\n图例说明:");
Console.Write("\t幸运轮盘:");
Console.ForegroundColor = ConsoleColor.Red; Console.Write("◎");
Console.ResetColor();
Console.Write(" 地雷:");
Console.ForegroundColor = ConsoleColor.Blue; Console.Write("☆");
Console.ResetColor();
Console.Write(" 暂停:");
Console.ForegroundColor = ConsoleColor.Green; Console.Write("▲");
Console.ResetColor();
Console.Write(" 时空隧道:");
Console.ForegroundColor = ConsoleColor.Yellow; Console.Write("卐");
Console.ResetColor();
Console.Write(" 普通:");
Console.ForegroundColor = ConsoleColor.Gray; Console.WriteLine("□ ");
Console.ResetColor();
Console.Write("\t玩家“{0}”和“{1}”的士兵分别用“", name[0], name[1]);
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.Write(" Α ");
Console.ResetColor();
Console.Write("和");
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.Write(" Β ");
Console.ResetColor();
Console.WriteLine("”来标识!");
Console.Write("\t如果Α与Β在同一个位置上时,那我们用“");
Console.ForegroundColor = ConsoleColor.Magenta;
Console.Write("<>");
Console.ResetColor();
Console.WriteLine("”来标识!");
Console.WriteLine();
}
///
/// 初始化参数设置
///
private void intializeMapParams()
{
//用于存储在地图中的下标
int[] luckTurn = { 6, 23, 40, 55, 69, 83 };//幸运轮盘
int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷
int[] pause = { 9, 27, 60, 93 };//暂停
int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道
//幸运轮盘
for (int i = 0; i < luckTurn.Length; i++)
{
int pos = luckTurn[i];
map[pos] = 1;
}
//地雷
for (int i = 0; i < landMine.Length; i++)
{
int pos = landMine[i];
map[pos] = 2;
}
//暂停
for (int i = 0; i < pause.Length; i++)
{
int pos = pause[i];
map[pos] = 3;
}
//时空隧道
for (int i = 0; i < timeTunnel.Length; i++)
{
int pos = timeTunnel[i];
map[pos] = 4;
}
}
private void action(int i,out Boolean flag)
{
int step = 0;
Boolean isChange = false;
Console.WriteLine("{0}请按任意键投掷骰子......", name[i]);
Console.ReadKey();
step = random.Next(1, 6);
Console.Write("{0}投掷出了 {1} 点,", name[i], step);
Console.WriteLine("按任意键开始行动!");
Console.ReadKey();
ab_pos[i] += step; //修改玩家的位置
if (ab_pos[i] >= 0 && ab_pos[i] < 99)
{
if (map[ab_pos[i]] != 0)
{
Console.Clear();
showUI();
drawMap();
}
switch (map[ab_pos[i]])
{
case 1:
{
Console.WriteLine("恭喜“{0}”捡到一个幸运轮盘!请选择下面两项进行操作!",name[i]);
Console.WriteLine("\t【1】:交换位置\t【2】:进行轰炸");
int intSelect = 0;
while (true)
{
try
{
Console.Write("请选择:");
intSelect = Convert.ToInt32(Console.ReadLine()); //进行选择
if (intSelect > 2 || intSelect < 0)
{
Console.WriteLine("选择有误,请重新输入!");
continue;
}
else
{
break;
}
}
catch
{
Console.WriteLine("选择有误,请重新输入!");
continue;
}
}
if (intSelect == 1)
{
isChange = true;
{//进行交换
int temp = 0;
temp = ab_pos[0];
ab_pos[0] = ab_pos[1];
ab_pos[1] = temp;
}
Console.WriteLine("您选择的是交换位置,按任意键进行交换!");
Console.ReadKey();
}
else
{
{//先得到对方的下标
if (i == 0)
{
i = 1;
}
else
{
i = 0;
}
}
if (ab_pos[i] >= 6)//对方的位置够六步就后退六步
{
step = -6;
}
else//不够六步,则则回到起点
{
step = -ab_pos[i];
}
ab_pos[i] += step;
Console.WriteLine("您选择对对方进行轰炸,对方将会被打退{0}步,按任意键开炮!", -step);
Console.ReadKey();
}
break;
}
case 2:
{
step = -ab_pos[i];
ab_pos[i] += step;
Console.WriteLine("很不幸,{0}踩到了地雷将会被打回起点!按任意键撤回!",name[i]);
Console.ReadKey();
break;
}
case 3:
{
Console.WriteLine("不好意思,您可能违规被暂停了一次!");
{//先得到对方的下标
if (i == 0)
{
i = 1;
}
else
{
i = 0;
}
}
Console.WriteLine("现在“{0}”可以连续掷两次!按任意键开始!",name[i]);
Console.ReadKey();
action(i, out flag);
break;
}
case 4:
{
step = 10;
ab_pos[i] += step;
Console.WriteLine("[0]进入了时空隧道,按任意键可以前进10步哦!",name[i]);
Console.ReadKey();
break;
}
case 0:
break;
}
flag = false;
}
else
{
if (ab_pos[i] >= 99)
{
ab_pos[i] = 99;
flag = true;
}
else
{
ab_pos[i] = 0;
flag = false;
}
}
Console.Clear();
showUI();
drawMap();
if (step >= 0&&!isChange)
{
Console.WriteLine("玩家“{0}”前进了‘{1}’步,行动已完成!", name[i], step);
}
else if (step < 0 && !isChange)
{
Console.WriteLine("玩家“{0}”后退了‘{1}’步,行动已完成!", name[i], -step);
}
else if(isChange)
{
Console.WriteLine("玩家“{0}”和“{1}”的士兵在位置上进行了交换,行动已完成!", name[0], name[1]);
}
}
private String getStringMap(int pos)
{
String result = null;
if (ab_pos[0] == pos && ab_pos[1] == pos)
{ //A与B的位置重复了
Console.ForegroundColor = ConsoleColor.DarkYellow;
result = "<>";
}
else
{
Console.ForegroundColor = ConsoleColor.DarkRed;
if (ab_pos[0] == pos)
{ //如果是玩家A
result = "Α";
}
else if (ab_pos[1] == pos)
{ //如果是玩家B
result = "Β";
}
else
{
switch (map[pos])
{
case 1:
Console.ForegroundColor = ConsoleColor.Red;
result = "◎";
break;
case 2:
Console.ForegroundColor = ConsoleColor.Blue;
result = "☆";
break;
case 3:
Console.ForegroundColor = ConsoleColor.Green;
result = "▲";
break;
case 4:
Console.ForegroundColor = ConsoleColor.Yellow;
result = "卐";
break;
case 0:
Console.ForegroundColor = ConsoleColor.Gray;
result = "□";
break;
}
}
}
return result;
}
///
/// 绘制地图
///
private void drawMap()
{
introduce();
intializeMapParams();
//显示第一行0-29
for (int i = 0; i <= 29; i++)
{
Console.Write(getStringMap(i));
if (i == 29)
{
Console.WriteLine();
}
}
//显示第一列
for (int i = 30; i <= 34; i++)
{
for (int j = 0; j < 29; j++)
{
Console.Write(" ");
}
Console.WriteLine(getStringMap(i));
}
//显示第二行
for (int i = 64; i >= 35; i--)
{
Console.Write(getStringMap(i));
if (i == 35)
{
Console.WriteLine();
}
}
//显示第二列
for (int i = 65; i <= 69; i++)
{
Console.WriteLine(getStringMap(i));
}
//显示第三行
for (int i = 70; i <= 99; i++)
{
Console.Write(getStringMap(i));
if (i == 99)
{
Console.WriteLine();
}
}
Console.ResetColor();
Console.WriteLine();//换行
Console.WriteLine("******************玩家的当前位置分别如下********************");
Console.WriteLine("玩家{0}的位置为:{1}", name[0], ab_pos[0]);
Console.WriteLine("玩家{0}的位置为:{1}", name[1], ab_pos[1]);
}
}
}
实现之后的效果如下:
设置好两个玩家之后,按任意键继续:
继续进行中: