骑士飞行棋代码实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 骑士飞行棋
{
class Program
{
//在下面的数组储存我们游戏地图各个关卡
//数组的下标为0的元素对于地图上的第1格,下表为1的元素对应第2格......下标为n的元素对于第n+1格
//在数组中 1:表示幸运轮盘◎
// 2:表示地雷☆
// 3:表示暂停▲
// 4:表示时空隧道卐
// 0:表示普通
static int[] Map = new int[100];
static int[] playerPos = { 0, 0 };//playerPos[0]存放玩家A的下标 playerPos[1]存放玩家B的下标
static bool[] isStop = { false, false };//isStop[0]表示A上次是否走到了暂停 isStop[1]B表示上次是否走到了暂停 ,如果走到暂停,则设置其值为true
static string[] name = new string[2];//name[0]存游戏玩家A的名字 name[1]存游戏玩家B的名字
static void Main(string[] args)
{
ShowUI();//显示游戏名称
Console.WriteLine("请输入玩家A的名字:");
name[0] = Console.ReadLine();
//判断用户输入的名字是否为空,若为空,则让用户重新输入
while (name[0] == "" || name[0] == " ")
{
Console.WriteLine("玩家A的名字不能为空,请重新输入");
name[0] = Console.ReadLine();
}
Console.WriteLine("请输入玩家B的名字:");
name[1] = Console.ReadLine();
while (name[1] == "" || name[1] == name[0])
{
if (name[1] == "")//为空
{
Console.WriteLine("玩家B的名字不能为空,请重新输入:");
}
if (name[1] == name[0])//A与B重名
{
Console.WriteLine("该名字已被其他用户使用,请重新输入");
}
name[1] = Console.ReadLine();
}
Console.Clear();//清屏
ShowUI();
Console.WriteLine("对战开始......");
Console.WriteLine("玩家{0}用A来表示", name[0]);
Console.WriteLine("玩家{0}用B来表示", name[1]);
Console.WriteLine("如果A、B在同一位置上,则用<>表示");
Console.WriteLine();
InitalMap();//初始化地图
DrawMap();//绘制地图
Console.WriteLine("开始游戏........");
//这个循环中让玩家A和玩家B轮流掷骰子 当玩家A或者玩家B坐标大于99时 循环结束
//产生一个m-n的随机数
//Random r=new Random ();
//int i=r.Next (m,n+1)
while (playerPos[0] < 99 && playerPos[1] < 99)
{
if (isStop[0] == false)
{
Action(0);
}
else
{
isStop[0] = false;
}
if (playerPos[0] >= 99)
{
break;
}
if (isStop[1] == false)
{
Action(1);
}
else
{
isStop[1] =false;
}
}
//判断谁胜利 谁失败
Console.Clear();
ShowUI();
if (playerPos[0] >= 0)
{
Console.WriteLine("{0}胜利了!!!\07\07\07", name[0]);
}
else
{
Console.WriteLine("{0}胜利了!!!\07\07\07", name[1]);
}
Console.ReadKey();
}
/// <summary>
/// A或B掷骰子的方法
/// </summary>
/// <param name="playerNumber">A掷骰子传0过来 B掷骰子传1过来</param>
static void Action(int playerNumber)
{
//playerNumber中存的就是当前玩家 姓名 坐标 是否暂停 这三个数组的下标
//1-playerNumber 就是对方的 姓名 坐标 是否暂停 这三个数组的下标
//当前0 对方1 、当前1 对方0
string msg = "";//用于储存用户踩到某关卡,输出的话
Random r = new Random();//r是产生随机数用的
int step = 0;//用于存放产生的随机数
Console.WriteLine("{0}按任意键开始掷骰......", name[playerNumber ]);
ConsoleKeyInfo rec = Console.ReadKey(true);
if (rec.Key == ConsoleKey.Tab)//自留后门 所谓外挂 呵呵~~~
{
step = 6;
}
else
{
step = r.Next(1, 7);//产生一个1-6之间的随机数
}
Console.WriteLine("{0}掷出了{1}", name[playerNumber ], step);
Console.WriteLine("按任意键开始行动......");
Console.ReadKey(true);
playerPos[playerNumber ] += step;//注意:一旦坐标发生改变 就要进行坐标越界判断
CheckPos();//检测坐标是否越界
if (playerPos[playerNumber ] == playerPos[1-playerNumber ])//玩家A踩到玩家B
{
playerPos[1-playerNumber ] = 0;
msg = string.Format("玩家{0}踩到了玩家{1},玩家{1}退回0格", name[playerNumber ], name[1-playerNumber ]);
}
else
{
switch (Map[playerPos[playerNumber ]])
{//没踩到玩家B 要检测玩家A现在所在的位置是否存在其他关卡
case 0:
//普通 没效果
msg = "";
break;
case 1:
//幸运轮盘
Console.WriteLine("{0}走到了幸运轮盘,请选择运气?", name[playerNumber ]);
Console.WriteLine("1--交换位置 2--轰炸对方");
int userSelect = ReadInt(1, 2);
if (userSelect == 1)
{//要与对方交换位置
int temp = playerPos[playerNumber ];
playerPos[playerNumber ] = playerPos[1-playerNumber ];
playerPos[1-playerNumber ] = temp;
msg = string.Format("玩家{0}选择了与对方交换位置", name[playerNumber ]);
}
else
{//轰炸对方
playerPos[1-playerNumber ] = playerPos[1-playerNumber ] - 6;
CheckPos();
msg = string.Format("玩家{0}轰炸了玩家{1},玩家{1}退了6格", name[playerNumber ], name[1-playerNumber ]);
}
break;
case 2:
//踩到了地雷
playerPos[playerNumber ] -= 6;
CheckPos();
msg = string.Format("玩家{0}踩到了地雷,倒退了6格", name[playerNumber ]);
break;
case 3:
//暂停一次
isStop[playerNumber] = true;
msg = string.Format("{0}走到了红灯,暂停一次", name[playerNumber ]);
break;
case 4:
//时空隧道
playerPos[playerNumber] += 10;
msg = string.Format("玩家{0}进入时空隧道,爽爆咯!前进了10格", name[playerNumber ]);
break;
}
}
Console.Clear();
DrawMap();
if (msg != "")
{
Console.WriteLine(msg);
}
Console.WriteLine("玩家{0}掷了一个{1},行动完成", name[playerNumber ], step);
Console.WriteLine("********玩家A和玩家B目前的位置********");
//Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("{0}的目前位置为{1}", name[playerNumber ], playerPos[playerNumber ] + 1);
Console.WriteLine("{0}的目前位置为{1}", name[1-playerNumber ], playerPos[1-playerNumber ] + 1);
// Console.ResetColor();
Console.WriteLine();
}
/// <summary>
/// 绘制游戏界面 显示游戏名称
/// </summary>
static void ShowUI()
{
Console.WriteLine("********************");
Console.WriteLine("* * * *");
Console.WriteLine("* 骑 士 飞 行 棋 *");
Console.WriteLine("* * * * *");
Console.WriteLine("********************");
}
/// <summary>
/// 获得第pos坐标上应该绘制的图案
/// </summary>
/// <param name="pos">要绘制的坐标</param>
/// <returns></returns>
static string GetMapstring(int pos)
{
string result = " ";
//判断A、B是否在当前要画的第i格
if (playerPos[0] == pos && playerPos[1] == pos)
{
Console.ForegroundColor = ConsoleColor.Yellow;
result = "<>";
}
else if (playerPos[0] == pos)//A在当前画的格上
{
Console.ForegroundColor = ConsoleColor.White;
result = "A";
}
else if (playerPos[1] == pos)//B在当前画的格上
{
Console.ForegroundColor = ConsoleColor.White;
result = "B";
}
else
{
switch (Map[pos])
{
case 0:
Console.ForegroundColor = ConsoleColor.White;
result = "□";
break;
case 1:
Console.ForegroundColor = ConsoleColor.Cyan;
result = "◎";
break;
case 2:
Console.ForegroundColor = ConsoleColor.Blue;
result = "☆";
break;
case 3:
Console.ForegroundColor = ConsoleColor.Green;
result = "▲";
break;
case 4:
Console.ForegroundColor = ConsoleColor.Red;
result = "卐";
break;
}
}
return result;
}
/// <summary>
/// 对地图中的关卡进行初始化
/// </summary>
static void InitalMap()
{
//用于存储在地图中为地雷的下标
int[] luckyTurn = { 7, 23, 35, 41, 55, 69, 83, 98 };//幸运轮盘
int[] landMine = { 9, 13, 17, 26, 38, 64, 89, 95 };//地雷
int[] Pause = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };//暂停
int[] timeTunnel = { 8, 16, 24, 32, 40, 48, 56, 72, 94 };//时空隧道
for (int i = 0; i < luckyTurn.Length; i++)
{
int pos = luckyTurn[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;
}
}
/// <summary>
/// 绘地图
/// </summary>
static void DrawMap()
{
Console.WriteLine("图例:幸运轮盘:◎ 地雷:☆ 暂停:▲ 时空隧道:卐");
//绘制第一行
for (int i = 0; i <= 29; i++)
{
Console.Write(GetMapstring(i));
}
//第一行绘制完毕
Console.WriteLine();
//绘制第一列
for (int i = 30; i <= 34; i++)
{
for (int j = 0; j < 29; j++)//绘制29个双空格
{
Console.Write(" ");
}
Console.WriteLine(GetMapstring(i));
}
//绘制第二行
for (int i = 64; i >= 35; i--)
{
Console.Write(GetMapstring(i));
}
Console.WriteLine();
//绘制第二列
for (int i = 65; i <= 69; i++)
{
Console.WriteLine(GetMapstring(i));
}
//绘制第三行
for (int i = 70; i <= 99; i++)
{
Console.Write(GetMapstring(i));
}
Console.WriteLine();
Console.ResetColor();
}
static int ReadInt()
{
int i = ReadInt(int.MinValue, int.MaxValue);
return i;
}
static int ReadInt(int min, int max)
{
while (true)
{
try
{
int number = Convert.ToInt32(Console.ReadLine());
if (number < min || number > max)
{
Console.WriteLine("只能输入{0}-{1}之间的数,请重新输入:", min, max);
continue;
}
return number;
}
catch
{
Console.WriteLine("只能输入数字,请重新输入:");
}
}
}
/// <summary>
/// 进行玩家A与玩家B坐标越界的判断
/// </summary>
static void CheckPos()
{
for (int i = 0; i < 2; i++)
{
if (playerPos[i] > 99)
{
playerPos[i] = 99;
}
if (playerPos[i] < 0)
{
playerPos[i] = 0;
}
}
}
}
}
运行效果:
骑士飞行棋知识点总结
1、循环控制语句:while语句 for语句
2、条件选择控制语句:if语句 if...... else语句 if......else if 语句
3、跳转控制语句:return语句 break语句 continue语句
4、异常处理语句try{}...... catch{} 语句
5、数组的构造及使用
6、方法的定义域调用
7、调用public class Random类产生随机数
// 返回一个指定范围内的随机数。
// 返回结果:
// 一个大于等于 minValue 且小于 maxValue 的 32 位带符号整数,即:返回的值范围包括 minValue 但不包括 maxValue。
// minValue 等于 maxValue,则返回 minValue。
public virtual int Next(int minValue, int maxValue); // 产生一个m-n的随机数
Random r=new Random ();
int i=r.Next (m,n+1)
8、调用方法public static ConsoleColor ForegroundColor { get; set; }
//获取或设置控制台的前景色。
// 返回结果:
// 一个 System.ConsoleColor,指定控制台的前景色;也就是显示的每个字符的颜色。默认为灰色。
语法:Console.ForegroundColor = ConsoleColor.(X);// X为ConsoleColor枚举中的某一个元素
9、多分支选择语句 switch......case语句
10、Console.ReadKey(true );
public static ConsoleKeyInfo ReadKey(bool intercept);
// 获取用户按下的下一个字符或功能键。按下的键可以选择显示在控制台窗口中。
// 确定是否在控制台窗口中显示按下的键。如果为 true,则不显示按下的键;否则为 false。