1.写游戏头,封装在一个方法里 GameHead 记得调用
2.初始化地图 有四种不同的图形
首先想到每一个坐标不同
先定义一个静态全局变量数组 public static int[] Maps = new int[100];//存储地图的数组
要把每一个相同的图形的坐标写下来封装在同样的数组里一共有四个不同图形的数组所有就有四个数组 把它放在一个方法里方便调用 InitialMap
开始画地图的第一横行
我们可以看出第一横行从第一个图形的坐标到最后一个图形的坐标是0到29所以我们用for循环
首先有a和b两个玩家
先定义一个数组
public static int[] PlayerPos = new int[2];//PlayerPos[0],玩家A的坐标
先确定玩家a和b的坐标 如果位置相同则画两个<>,如果不一样则就写a和b 因为要多次用到所以要把它封装到一个方法里,可以多次调用 DrawStringMap 玩家A的坐标和玩家B的坐标相同就画<>,不同A,不同B,否则就开始画地图
然后我们在第一横行这个for循环里调用DrawStringMap DrawStringMap 是有返回值的 里面有参数
然后我们画第一竖行
这里的坐标是30到34 我们用for循环的嵌套把前面的空格画出来,然后在最外面的for循环里调用方法
紧接着,第二横行,第二竖行,第三横行 如果想让光标的位置换行可以 Console.WriteLine();
3.输入玩家姓名 玩家姓名不能为空,为空则重新输入,玩家B的值和玩家A的值不能一样,否则重新输入
然后清屏 Console.Clear(); 清屏完后,在将游戏头画一遍
GameHead(); 然后显示A的士兵A表示,B的士兵B表示
4.然后我们看到A和B的坐标都没动,可以想到加上他们坐标就会改变A和B的值,这里我们用的是1到7随机数
Random r = new Random(); //让玩家坐标改变
int rNumer = r.Next(1, 7);
PlayerPos[playerNumber] += rNumer;//这里如果写0或者1就把他写死了 这里是让他们的坐标相加
// 游戏规则:
//如果玩家A踩到了玩家B 玩家B退6格
//踩到了地雷 退6格
//踩到了时空隧道 进10格
//踩到了幸运轮盘 1交换位置 2 轰炸对方 使对方退6格
//踩到了暂停 暂停一回合
//踩到了方块 神马都不干
//如果玩家A踩到玩家B
if (PlayerPos[playerNumber] == PlayerPos[1 - playerNumber]) //这里把所有下标是0的改为playerNumber,把所有下表为1,改为PlayerPos[1 - playerNumber]
//PlayerPos[1 - playerNumber] PlayerPos[playerNumber] 等于1,PlayerPos[1 - playerNumber]就等于0, PlayerPos[playerNumber] 等于0,PlayerPos[1 - playerNumber]就等于1,为了使他们相等
{
Console.WriteLine("玩家{0}踩到玩家{1},玩家{2}退6各", PlayerName[playerNumber], PlayerName[1 - playerNumber], PlayerName[1 - playerNumber]);
Console.ReadKey(true);
PlayerPos[1 - playerNumber] -= 6;//坐标
ChangPos();
Console.WriteLine("玩家{0}退了6各", PlayerName[1 - playerNumber]);
Console.ReadKey(true);
}
else//玩家A并没有踩到玩家B,而是踩到了特殊的关卡上
{
switch (Maps[PlayerPos[playerNumber]]) //
{
case 0: Console.WriteLine("玩家{0}踩到了方块,什么都不发生", PlayerName[playerNumber]);
Console.ReadKey(true);
break;
case 1: Console.WriteLine("玩家{0}踩到幸运轮盘,请选择 1--交换位置 2--轰炸对方", PlayerName[playerNumber]);
string input = Console.ReadLine();
while (true)
{
if (input == "1")
{
Console.WriteLine("玩家{0}选择了跟玩家{1}交换位置", PlayerName[playerNumber], PlayerName[1 - playerNumber]);
int temp = PlayerPos[playerNumber];
PlayerPos[playerNumber] = PlayerPos[1];
PlayerPos[1 - playerNumber] = temp;
ChangPos();
Console.ReadKey(true);
break;
}
else if (input == "2")
{
Console.WriteLine("玩家{0}选择轰炸玩家{1},玩家{2}退6各", PlayerName[playerNumber], PlayerName[1 - playerNumber], PlayerName[1 - playerNumber]);
PlayerPos[1 - playerNumber] -= 6;
ChangPos();
Console.ReadKey(true);
break;
}
else
{
Console.WriteLine("输入有误,请重新输入 1--交换位置 2--轰炸对方");
input = Console.ReadLine();
}
}
break;
case 2: Console.WriteLine("玩家{0}踩到了地雷,退6各", PlayerName[playerNumber]);
PlayerPos[playerNumber] -= 6;
ChangPos();
Console.ReadKey(true);
break;
case 3: Console.WriteLine("玩家{0}踩到了暂停,暂停一回合,", PlayerName[playerNumber]);
Console.ReadKey(true);
Flags[playerNumber] = true; //踩到暂停是ture没踩到是false
break;
case 4: Console.WriteLine("玩家{0}踩到了时空·隧道,前进十个", PlayerName[playerNumber]);
PlayerPos[playerNumber] += 10;
ChangPos();
Console.ReadKey(true);
break;
}
}
Console.Clear();//清屏 到另一方界面,下面有图 上面的图列是在画地图之前写的
DrawMap();//重新画地图
5. 当玩家坐标发生改变的时候,判断玩家的坐标,让玩家一直保持在这个地图上
public static void ChangPos()
{
if (PlayerPos[0] <= 0)
{
PlayerPos[0] = 0;
}
if (PlayerPos[0] >= 99)
{
PlayerPos[0] = 99;
}
if (PlayerPos[1] <= 0)
{
PlayerPos[1] = 0;
}
if (PlayerPos[1] >= 99)
{
PlayerPos[1] = 99;
}
}
z在有需要的游戏规则下调用改方法 ChangPos();
z在上面游戏规则中没有实现暂停这一项功能
//定义数组
public static bool[] Flags = new bool[2];
在玩游戏过程中暂停这一项加 Flags[playerNumber] = true; //踩到暂停是ture没踩到是false
while(PlayerPos[0]<99&&PlayerPos[1]<99)
{
//注释的是只玩A的
//当A踩到暂停,B执行完一次还要执行一次
if (Flags[0] == false) //踩到暂停是ture没踩到是false //这一次踩到的暂停下一回合执行
{
Playgame(0);//先玩A A玩完了B玩
}
else
{
Flags[0] = false;
}
if (PlayerPos[0] >= 99)
{
Console.WriteLine("玩家{0}无耻的赢了玩家{1}",PlayerName[0],PlayerName[1]);
break;//执行完跳出循环
}
if (Flags[1] == false)
{
Playgame(1);//b先完 B玩完了A玩
}
else
{
Flags[1] = false;
}
if (PlayerPos[1] >= 99)
{
Console.WriteLine("玩家{0}无耻的赢了玩家{1}", PlayerName[1], PlayerName[0]);
break;//执行完跳出循环
}
}//while
最后调用win()这个方法
具体代码演示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace program
{
class Program
{
public static int[] Maps = new int[100];//存储地图的数组
public static int[] PlayerPos = new int[2];//PlayerPos[0],玩家A的坐标
public static string[] PlayerName = new string[2];//存储玩家姓名
public static bool[] Flags = new bool[2];
static void Main(string[] args)
{
GameHead(); //画头
#region 输入玩家姓名
Console.WriteLine("请输出玩家A的姓名");
PlayerName[0] = Console.ReadLine();
while (PlayerName[0] == "")
{
Console.WriteLine("玩家A的姓名不能为空,请重新输入");
PlayerName[0] = Console.ReadLine();
}
Console.WriteLine("请输入玩家B的姓名");
PlayerName[1] = Console.ReadLine();
while (PlayerName[1] == "" || PlayerName[1] == PlayerName[0])
{
if (PlayerName[1] == "")
{
Console.WriteLine("玩家B的值为空,请重新输入");
PlayerName[1] = Console.ReadLine();
}
else
{
Console.WriteLine("玩家B的值不能和玩家A的值一样,请重新输入");
PlayerName[1] = Console.ReadLine();
}
}
#endregion
Console.Clear();//清屏
//清屏完后,在将游戏头画一遍
GameHead();
Console.WriteLine("{0}的士兵用A表示",PlayerName[0]);
Console.WriteLine("{0}的士兵用B表示", PlayerName[1]);
InitialMap();//初始化地图
DrawMap();//先初始化地图,在去画地图
while(PlayerPos[0]<99&&PlayerPos[1]<99)
{
//注释的是只玩A的
//当A踩到暂停,B执行完一次还要执行一次
if (Flags[0] == false) //踩到暂停是ture没踩到是false //这一次踩到的暂停下一回合执行
{
Playgame(0);//先玩A A玩完了B玩
}
else
{
Flags[0] = false;
}
if (PlayerPos[0] >= 99)
{
Console.WriteLine("玩家{0}无耻的赢了玩家{1}",PlayerName[0],PlayerName[1]);
break;//执行完跳出循环
}
if (Flags[1] == false)
{
Playgame(1);//b先完 B玩完了A玩
}
else
{
Flags[1] = false;
}
if (PlayerPos[1] >= 99)
{
Console.WriteLine("玩家{0}无耻的赢了玩家{1}", PlayerName[1], PlayerName[0]);
break;//执行完跳出循环
}
}//while
Win();
Console.ReadKey();
}
/// <summary>
/// 画游戏头
/// </summary>
public static void GameHead()
{
//设置前景色
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine("********************");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("********************");
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("********************");
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("**骑士飞行期游戏1.0*");
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.WriteLine("********************");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("********************");
}
/// <summary>
/// 初始化地图
/// </summary>
public static void InitialMap()
{
//我用0表示普通,显示给用户就是 □
//....1...幸运轮盘,显示组用户就◎
//....2...地雷,显示给用户就是 ☆
//....3...暂停,显示给用户就是 ▲
//....4...时空隧道,显示组用户就 卐
int[] luckyturn = { 6, 23, 40, 55, 69, 83 };//幸运轮盘◎
for (int i = 0; i < luckyturn.Length; i++)
{
Maps[luckyturn[i]] = 1; //下标是1
}
int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷☆
for (int i = 0; i < landMine.Length; i++)
{
Maps[landMine[i]] = 2;
}
int[] pause = { 9, 27, 60, 93 };//暂停▲
for (int i = 0; i <pause.Length; i++)
{
Maps[pause[i]] = 3;
}
int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道卐
for (int i = 0; i <timeTunnel.Length; i++)
{
Maps[timeTunnel[i]] = 4;
}
}
//a和b两个玩家 //先确定玩家a和b的坐标 如果位置相同则化两个<>,如果不一样则就写a和b
public static void DrawMap()
{
Console.WriteLine("图例:幸运轮盘:◎ 地雷:☆ 暂停:▲ 时空隧道:卐");
#region 第一横行
for (int i = 0; i <=29; i++)
{
Console.Write(DrawStringMap(i));//这里把它封装成一个方法调用
}//for
#endregion
//画完第一横行后应该换行
Console.WriteLine();
#region 第一竖行
for (int i = 30; i <=34; i++)
{
//画空格
for (int j = 0; j < 29; j++)
{
Console.Write(" ");
}
Console.WriteLine(DrawStringMap(i));
}
#endregion
#region 第二横行
for (int i = 64; i>=35; i--)
{
Console.Write(DrawStringMap(i));
}
#endregion
//画完第二横行后换行
Console.WriteLine();
#region 第二竖行
for (int i = 65; i <= 69; i++)
{
Console.WriteLine(DrawStringMap(i));
}
#endregion
#region 第三横行
for (int i = 70; i <=99; i++)
{
Console.Write(DrawStringMap(i));
}
#endregion
Console.WriteLine();//让光标的位置换行
}
/// <summary>
/// 抽象出来的画地图等的方法 返回一个要画的字符串
/// </summary>
/// <param name="i">当前地图坐标</param>
/// <returns></returns>
public static string DrawStringMap(int i) //这里写的有返回值
{
string str = "";
if (PlayerPos[0] == PlayerPos[1] && PlayerPos[1] == i) //和玩家b坐标相同 PlayerPos[1] == i 玩家B的左边 这段表示两个玩家坐标相同画<> ==i也就是代表第一行 0到29的值
{
str="<>";
}
else if (PlayerPos[0] == i)//和玩家b不相同
{
str="A";
}
else if (PlayerPos[1] == i)//和玩家a的坐标不相同
{
str="B";
}
else
{
switch (Maps[i])
{
case 0:
Console.ForegroundColor = ConsoleColor.DarkYellow;
str="□";
break;
case 1:
Console.ForegroundColor = ConsoleColor.Red;
str="◎";
break;
case 2:
Console.ForegroundColor = ConsoleColor.Green;
str="☆";
break;
case 3:
Console.ForegroundColor = ConsoleColor.Blue;
str="▲";
break;
case 4:
Console.ForegroundColor = ConsoleColor.DarkGray;
str="卐";
break;
}//switch
}//else
return str;
}
public static void Playgame(int playerNumber)
{
#region 玩游戏的过程
Random r = new Random(); //让玩家坐标改变
int rNumer = r.Next(1, 7);
Console.WriteLine("玩家{0}按任意键开始掷骰子", PlayerName[playerNumber]);
Console.ReadKey(true);//按下的任意键不在控制台显示
Console.WriteLine("玩家{0}掷出了{1}", PlayerName[playerNumber],rNumer);
PlayerPos[playerNumber] += rNumer;//这里如果写0或者1就把他写死了
ChangPos();
Console.ReadKey(true);
Console.WriteLine("玩家{0}按任意键开始执行", PlayerName[playerNumber]);
Console.ReadKey(true);
Console.WriteLine("玩家{0}行动完了", PlayerName[playerNumber]);
Console.ReadKey(true);
// 游戏规则:
//如果玩家A踩到了玩家B 玩家B退6格
//踩到了地雷 退6格
//踩到了时空隧道 进10格
//踩到了幸运轮盘 1交换位置 2 轰炸对方 使对方退6格
//踩到了暂停 暂停一回合
//踩到了方块 神马都不干
//如果玩家A踩到玩家B
if (PlayerPos[playerNumber] == PlayerPos[1 - playerNumber])
{
Console.WriteLine("玩家{0}踩到玩家{1},玩家{2}退6各", PlayerName[playerNumber], PlayerName[1 - playerNumber], PlayerName[1 - playerNumber]);
Console.ReadKey(true);
PlayerPos[1 - playerNumber] -= 6;
ChangPos();
Console.WriteLine("玩家{0}退了6各", PlayerName[1 - playerNumber]);
Console.ReadKey(true);
}
else//玩家A并没有踩到玩家B,而是踩到了特殊的关卡上
{
switch (Maps[PlayerPos[playerNumber]]) //
{
case 0: Console.WriteLine("玩家{0}踩到了方块,什么都不发生", PlayerName[playerNumber]);
Console.ReadKey(true);
break;
case 1: Console.WriteLine("玩家{0}踩到幸运轮盘,请选择 1--交换位置 2--轰炸对方", PlayerName[playerNumber]);
string input = Console.ReadLine();
while (true)
{
if (input == "1")
{
Console.WriteLine("玩家{0}选择了跟玩家{1}交换位置", PlayerName[playerNumber], PlayerName[1 - playerNumber]);
int temp = PlayerPos[playerNumber];
PlayerPos[playerNumber] = PlayerPos[1];
PlayerPos[1 - playerNumber] = temp;
ChangPos();
Console.ReadKey(true);
break;
}
else if (input == "2")
{
Console.WriteLine("玩家{0}选择轰炸玩家{1},玩家{2}退6各", PlayerName[playerNumber], PlayerName[1 - playerNumber], PlayerName[1 - playerNumber]);
PlayerPos[1 - playerNumber] -= 6;
ChangPos();
Console.ReadKey(true);
break;
}
else
{
Console.WriteLine("输入有误,请重新输入 1--交换位置 2--轰炸对方");
input = Console.ReadLine();
}
}
break;
case 2: Console.WriteLine("玩家{0}踩到了地雷,退6各", PlayerName[playerNumber]);
PlayerPos[playerNumber] -= 6;
ChangPos();
Console.ReadKey(true);
break;
case 3: Console.WriteLine("玩家{0}踩到了暂停,暂停一回合,", PlayerName[playerNumber]);
Console.ReadKey(true);
Flags[playerNumber] = true; //踩到暂停是ture没踩到是false
break;
case 4: Console.WriteLine("玩家{0}踩到了时空·隧道,前进十个", PlayerName[playerNumber]);
PlayerPos[playerNumber] += 10;
ChangPos();
Console.ReadKey(true);
break;
}
}
Console.Clear();//清屏
DrawMap();//重新画地图
#endregion
}
/// <summary>
/// 当玩家坐标发生改变的时候,判断玩家的坐标,让玩家一直保持在这个地图上
/// </summary>
public static void ChangPos()
{
if (PlayerPos[0] <= 0)
{
PlayerPos[0] = 0;
}
if (PlayerPos[0] >= 99)
{
PlayerPos[0] = 99;
}
if (PlayerPos[1] <= 0)
{
PlayerPos[1] = 0;
}
if (PlayerPos[1] >= 99)
{
PlayerPos[1] = 99;
}
}
/// <summary>
/// 胜利啦!!
/// </summary>
public static void Win()
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(" ◆ ");
Console.WriteLine(" ■ ◆ ■ ■");
Console.WriteLine(" ■■■■ ■ ■ ◆■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ◆ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■■■■■■ ■■■■■■■ ■ ■ ■");
Console.WriteLine(" ■■■■ ■ ■ ●■● ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ● ■ ● ■ ■ ■");
Console.WriteLine(" ■ ■ ■■■■■■ ● ■ ● ■ ■ ■");
Console.WriteLine(" ■■■■ ■ ● ■ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ■ ■ ");
Console.WriteLine(" ■ ■ ■ ■ ● ■ ");
Console.WriteLine(" ■ ■■ ■■■■■■ ■ ● ●");
Console.ResetColor();
}
}
}