咳咳!24K月亮又回来了!今天我想着给大家带一个有趣的小游戏,这个游戏我相信90后、00后的人们都会接触它!没错啦!我直接点明主题《飞行棋》。
制作这个游戏首先我们必须得把我们的思维整理一下。
1、控制台打印游戏界面
在控制台当中打印出来我们的游戏界面,当然啦,肯定不止出现一次的。每一次操作完成以后都需要将界面中的内容清空,然后重新打印一次。每当控制台闪烁一遍其实就是清空控制台,然后重新打印游戏界面的过程。界面中的内容需要不停的打印,所以我们要将对应的操作放到方法中,以便于我们重复使用。
2、初始化地图(也就是地图中所需要的资源)
初始化地图的操作十分的常见,每次在读档的时候,会进行资源加载提示表示正在初始化地图 ; 比如CF、英雄联盟等这些都是为了加载游戏中所需要的资源(其他玩家的信息、你的游戏进度等等)。
因为我们最终要精确到每一个关卡上面,所以不能使用字符串进行储存,使用数组比较方便。
为什么??
因为通过下标我们可以精确的访问到地图中的每一个关卡,在这个游戏中初始化地图的过程就是将int类型或者是string类型的数组,int类型会简单很多。
在这个游戏中初始化地图的过程中就是将int类型的数组中的数字变成控制台中显示特殊的字符串的过程。
3、打印地图
在玩地图之前要先将整张地图画出来,但在玩地图的时候,有一个非常关键的额操作,就是要先初始化地图。
4、玩游戏
投骰子(随机数1~6) 打印玩家在地图上中的显示,遇到特殊的位置特殊处理,判定玩家的输赢。
namespce 飞行棋
{
internal class program
{
//因为游戏地图的格数共100格
//所以定义int类型的变量
public static int[] Map=new int[100];
//声明一个静态数组用来储存两个玩家的名字
public static string[] playerName = new string[2];
//声明一个静态数组用来储存两个玩家的名字
public static int[] playerPos = new int[2];
//声明一个用于标记两个玩家状态的静态数组 fasle表示正常 true表示休息(被暂停)
public static bool[] flags = new bool[2];
//主方法
static void Main(string[] args)
{
GameShow();
Console.WriteLine("请输入玩家A的名字:");
playerNames[0] = Console.ReadLine();
while (playerNames[0] == "")
{
Console.WriteLine("玩家A的名字不能为空,请重新输入!!!");
playerNames[0] = Console.ReadLine();
}
Console.WriteLine("请输入玩家B的名字:");
playerNames[1] = Console.ReadLine();
while (playerNames[1] == "" || playerNames[1] == playerNames[0])
{
if (playerNames[1] == "")
{
Console.WriteLine("玩家B的名字不能为空,请重新输入!!!");
playerNames[1] = Console.ReadLine();
}
else
{
Console.WriteLine("玩家B的名字不能与玩家A的名字相同,请重新输入!!!");
playerNames[1] = Console.ReadLine();
}
}
#endregion
// 玩家输入名字完成以后,要先清空控制台中的内容
Console.Clear(); // 清屏
GameShow(); // 重新绘制游戏头
// 打印出玩家信息
Console.WriteLine("{0}的飞机使用A进行表示\n{1}的飞机使用B进行表示", playerNames[0], playerNames[1]);
// 初始化地图 这一步操作一定要在绘制地图之前进行
InitailMap();
// 绘制地图
DrawMap();
// 进行游戏规则判定 只要当其中有一个玩家到达终点,游戏就结束 都没到,持续玩游戏
while (playerPos[0]<99&& playerPos[1]<99)
{
// 判断玩家的状态 false状态正常 正常玩游戏
if (flags[0]==false)
{
PlayGame(0);
}
else
{
// 不正常不操作 但是需要将其状态修改为正常
flags[0] = false;
}
// 当到达终点,提示玩家胜利
if (playerPos[0]>=99)
{
Console.WriteLine("玩家{0}无耻的战胜了玩家{1}", playerNames[0], playerNames[1]);
break;
}
// 判断玩家的状态 false状态正常 正常玩游戏
if (flags[1] == false)
{
PlayGame(1);
}
else
{
// 不正常不操作 但是需要将其状态修改为正常
flags[1] = false;
}
// 当到达终点,提示玩家胜利
if (playerPos[1] >= 99)
{
Console.WriteLine("玩家{0}无耻的战胜了玩家{1}", playerNames[1], playerNames[0]);
break;
}
}
// 打印胜利图案
Win();
Console.ReadKey(true);
}
//在主方法外面另外定义方法
//1、打印初始化游戏的界面
public static void GameShow()
{
//在控制台中给输出的文本添加颜色
//利用Console类的属性来进行设置文本的颜色 ForegroundColor 前景颜色 会改变控制台中的文本颜色
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("***************************")
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("***************************")
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine("***********************************");
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("*** --202304班基础飞行棋 V1.0-- ***");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("***********************************");
Console.ForegroundColor = ConsoleColor.DarkBlue;
Console.WriteLine("***********************************");
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine("***********************************");
}
//开始初始化地图
public static void InitailMap()
{
//我使用0表示普通,显示给用户的就是□
//....1...幸运轮盘,显示组用户就◎
//....2...地雷,显示给用户就是 ☆
//....3...暂停,显示给用户就是 ▲
//....4...时空隧道,显示组用户就 卐
//幸运轮盘
int[] luckyturn ={6,23,40,55,78,96};
//使用for循环循环打印
for(int i = 0 ;i<luckyturn.Length;i++)
{
//把对应的位置替换成表示幸运轮盘的值
Maps[luckytrun[i]]=1;
}
//地雷
int[] landMine = {5,56,74,75,45,36,93};
for(int i =0;i<lnadMine.Length;i++)
{
Maps[landMine[i]]=2;
}
//暂停
int[] pause = {9,29,60,98};
for(int i = 0 :i<pause.Length;i++)
{
Maps[pause[i]]=3;
}
//时空隧道
int[] timeTunnel = {20,26,49,88,66};
for(int i = 0;i<timeTunnel.Length;i++)
{
Maps[timeTunnel[i]]=4;
}
}
//绘制地图(打印游戏地图)
public static void DrawMap()
{
Console.WriteLine("图例:幸运轮盘:◎ 地雷:☆ 暂停:▲ 时空隧道:卐")
}
//横着第一排 打印前三十个位置所在的特殊符号
for(int i = 0;i<30;i++)
{
//调用将数组中的 值转换为特殊符号的方法
Console.WriteLine(DrawStringMap(i));
}
//换行打印
Console.WriteLine();
//竖着第一列 打印31-35位置所在的特殊符号
for(int i =30;i<35;i++)
{
//给特殊符号前面加空格 注意:如果位置对不齐的话多敲个空格
for(int j=0;j<29;j++)
{
Console.Write(" ");
}
Console.Write(DrawStringMap(i));
//换行
Console.WriteLine();
}
//横着第二排 打印36-65位置所在的特殊符号 倒着打印
for(int i = 64;i>= 35;i--)
{
Console.Write(DrawStringMap(i));
}
//竖着第二列
for(int i = 65;i<70;i++)
{
//注意每一行直接换行
Console.WriteLine(DrawStringMap(i));
}
//横着第三行
for(int i = 0; i<100;i++)
{
Console.Write(DrawStringMap(i))
}
//换行
Console.WriteLine();
public static string DrawStringMap(int i)
{
string str = "";
#region 将数字转换为对应的特殊符号
// 如果玩家A与玩家B坐标相同且都在地图中,绘制出尖括号
if (playerPos[0] == playerPos[1] && playerPos[0] == i)
{
Console.ForegroundColor = ConsoleColor.Blue;
str = "<>";
}
else if (playerPos[0] == i)
{
// 把对应位置的字符替换为A 表示玩家A所在的位置
str = "A";
}
else if (playerPos[1] == i)
{
// 把对应位置的字符替换为B 表示玩家A所在的位置
str = "B";
}
else
{
// 把除了玩家A和玩家B所在的位置以外的所有位置使用对应的字符绘制出来
switch (Maps[i])
{
// 将int类型数组Maps中存储的数据0对应的位置绘制为□,表示普通区域
case 0:
Console.ForegroundColor = ConsoleColor.DarkYellow;
str = "□";
break;
// 将int类型数组Maps中存储的数据1对应的位置绘制为◎,表示幸运轮盘
case 1:
Console.ForegroundColor = ConsoleColor.Red;
str = "◎";
break;
// 将int类型数组Maps中存储的数据2对应的位置绘制为☆,表示地雷
case 2:
Console.ForegroundColor = ConsoleColor.Yellow;
str = "☆";
break;
// 将int类型数组Maps中存储的数据3对应的位置绘制为▲,表示暂停
case 3:
Console.ForegroundColor = ConsoleColor.DarkBlue;
str = "▲";
break;
// 将int类型数组Maps中存储的数据4对应的位置绘制为卐,表示时空隧道
case 4:
Console.ForegroundColor = ConsoleColor.Green;
str = "卐";
break;
}
}
// 返回对应位置应该绘制出的符号
return str;
}
public static void PlayGame(int playerNumber)
{
// 创建一个随机数,用于随机骰子
Random rd = new Random();
int num = rd.Next(1, 7); // 取到>=1 <7
// 提示谁开始投骰子
Console.WriteLine("{0}按下任意键开始抛骰子", playerNames[playerNumber]);
Console.ReadKey(true); // 确认用户已经按下了任意键 然后才会继续往下执行代码
Console.WriteLine("{0}投的骰子数为{1}", playerNames[playerNumber], num);
// 改变玩家在地图中的位置 要注意使用累加保存玩家的进度
playerPos[playerNumber] += num;
//改变玩家的坐标
ChangePos();
Console.ReadKey(true);
Console.WriteLine("{0}按任意键开始行动", playerNames[playerNumber]);
Console.ReadKey(true);
Console.WriteLine("{0}行动完了", playerNames[playerNumber]);
Console.ReadKey(true);
// 判断玩家的行动
// 可能踩到另一个玩家 方块 地雷 幸运轮盘 暂停 时空隧道
if (playerPos[playerNumber] == playerPos[1 - playerNumber])
{
Console.WriteLine("玩家{0}踩到了玩家{1},玩家{2}后退6格", playerNames[playerNumber], playerNames[1 - playerNumber], playerNames[1 - playerNumber]);
// 被踩的玩家要改变坐标
playerPos[1 - playerNumber] -= 6;
// 只要改变坐标,就需要规则判定
ChangePos();
Console.ReadKey(true);
}
else
{
// 踩到关卡后的处理
// 使用玩家的坐标去匹配对应的情况
switch (Maps[playerPos[playerNumber]]) // 0 1 2 3 4
{
// 普通方块
case 0:
Console.WriteLine("玩家{0}踩到了方块,无事发生", playerNames[playerNumber]);
Console.ReadKey(true);
break;
// 幸运轮盘
case 1:
Console.WriteLine("玩家{0}踩到了幸运轮盘,请选择 1--与对方交换位置 2--轰炸对方", playerNames[playerNumber]);
// 输选择的内容 只能输入指定的内容,否则需要重新输入
string choose = Console.ReadLine();
while (true)
{
// 判断输入的内容
if (choose == "1")
{
Console.WriteLine("玩家{0}选择与玩家{1}进行位置交换", playerNames[playerNumber], playerNames[1 - playerNumber]);
Console.ReadKey(true);
// 改变双方的位置 使用交换算法
int temp = playerPos[playerNumber];
playerPos[playerNumber] = playerPos[1 - playerNumber];
playerPos[1 - playerNumber] = temp;
// 提示交换完成
Console.WriteLine("交换完成!按任意键继续游戏!!!");
Console.ReadKey(true);
// 跳出循环
break;
}
else if (choose == "2")
{
Console.WriteLine("玩家{0}选择轰炸玩家{1},玩家{2}后退6格", playerNames[playerNumber], playerNames[1 - playerNumber], playerNames[1 - playerNumber]);
Console.ReadKey(true);
// 改变被轰炸的玩家的坐标
playerPos[1 - playerNumber] -= 6;
// 只要改变坐标,就需要规则判定
ChangePos();
// 提示轰炸的结果
Console.WriteLine("轰炸完成!玩家{0}后退了6格", playerNames[1 - playerNumber]);
Console.ReadKey(true);
// 跳出循环
break;
}
else
{
// 输入的不合法 提示重新输入,直到输入正确
Console.WriteLine("只能输入1或者2 1--与对方交换位置 2--轰炸对方");
choose = Console.ReadLine();
}
}
break;
// 地雷
case 2:
Console.WriteLine("玩家{0}踩到地雷,后退6格", playerNames[playerNumber]);
Console.ReadKey(true);
// 改变玩家的坐标
playerPos[playerNumber] -= 6;
// 只要改变坐标,就需要规则判定
ChangePos();
Console.ReadKey(true);
break;
// 暂停
case 3:
Console.WriteLine("玩家{0}踩到了暂停,休息一回合", playerNames[playerNumber]);
// 改变玩家的状态
flags[playerNumber] = true;
Console.ReadKey(true);
break;
// 时空隧道
case 4:
Console.WriteLine("玩家{0}踩到了时空隧道,前进10格", playerNames[playerNumber]);
// 改变玩家坐标
playerPos[playerNumber] += 10;
// 只要改变坐标,就需要规则判定
ChangePos();
Console.ReadKey(true);
break;
}
}
// 每完成一步操作,需要判定改变坐标的规则 清空控制台中的所有内容 重新绘制资源
// 改变玩家的坐标 判断规则
ChangePos();
// 清空控制台
Console.Clear();
// 重新绘制资源
DrawMap();
}
public static void ChangePos()
{
// 判断是哪个玩家 玩家必须在地图中
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;
}
}
public static void Win()
{
Console.ForegroundColor = ConsoleColor.Yellow;
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();
}
}
}