声明:这是B站上面传智播客c#基础教程上面的一个小游戏,原视频地址:01_C#入门到精通】新手强烈推荐:C#开发课程,一整套课程
这是我第一次写这么长的文章,自我感觉有点不太好,如果有错误的内容,请在评论区中回复一下,谢谢
做游戏前的准备
需要你的耐心,好奇心
static int[] Map = new int[100];//这个是地图
static int[] PlayerPosi = new int[2];//存放玩家坐标的
static bool[] flags = new bool[2];//
static string[] PlayerNames = new string[2];//存放玩家姓名的数组
//PlayerNames[0]表示玩家A的姓名,PlayerNames[1]表示玩家B的姓名
函数图
游戏头
关键问题:如何换颜色?我在学这个之前,看到的都是那种dos界面
关键语句:
Console.ForegroundColor = ConsoleColor.Red;//这个是将文字的前景色设置为红色的
Console.BackgroundColor = ConsoleColor.Gray;//设置背景色为灰色
玩家输入姓名
要求:玩家A输入的姓名不能为空,玩家B输入的姓名不能为空并且不能与玩家A的姓名相同
private string[] PlayNames=new string[2];
//PlayNames[0]是玩家A的名字
//PlayNames[1]是玩家B的名字
public static void InputName()
{
Console.WriteLine("请输入玩家A的姓名:");
PlayerNames[0] = Console.ReadLine();
while (PlayerNames[0] == "")
{
Console.WriteLine("输入错误,请重新输入");
PlayerNames[0] = Console.ReadLine();
if (PlayerNames[0] != "") break;
}
Console.WriteLine("请输入玩家B的姓名");
PlayerNames[1] = Console.ReadLine();
while (PlayerNames[1] == PlayerNames[0] || PlayerNames[1] == "")
{
if (PlayerNames[1] == PlayerNames[0])
{
Console.WriteLine("玩家A的姓名不能与玩家B的姓名相同,请重新输入");
PlayerNames[1] = Console.ReadLine();
if (PlayerNames[1] != PlayerNames[0]) break;
}
else
{
Console.WriteLine("姓名不能为空,请重新输入");
PlayerNames[1] = Console.ReadLine();
if (PlayerNames[1] != "") break;
}
}
return;
}
初始化地图
整个地图是存放在Maps数组里面的,人为规则一下
public static void Initialize()
{
int[] luckyturn = { 6, 23, 40, 55, 69, 83 };//幸运转盘
int i = 0;
for (i = 0; i < luckyturn.Length; i++) Map[luckyturn[i]] = 1;
int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷
for (i = 0; i < landMine.Length; i++) Map[landMine[i]] = 2;
int[] pause = { 9, 27, 60, 93 };//暂停
for (i = 0; i < pause.Length; i++) Map[pause[i]] = 3;
int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道
for (i = 0; i < timeTunnel.Length; i++) Map[timeTunnel[i]] = 4;
return;
}
防止玩家被干出地图
当玩家A或玩家B的经过运算的坐标或者当前坐标是大于99或者小于0的,就把坐标校正一下
public static void ChangePosi()
{
if (PlayerPosi[0] < 0) PlayerPosi[0] = 0;
if (PlayerPosi[0] > 99) PlayerPosi[0] = 99;
if (PlayerPosi[1] < 0) PlayerPosi[1] = 0;
if (PlayerPosi[1] > 99) PlayerPosi[1] = 99;
return;
}
画地图
整个地图是一个int类型的数组,那么问题来了,如何将数字转换成字符呢?很简单,人为规定一下0代表什么字符,1代表什么字符,以此类推。
也就是在画地图之前首先要初始化地图,初始化地图就是将int类型数组进行赋值。
特殊关卡的坐标我们有,关卡也在地图上面,我们可以把关卡在地图上面的坐标作为特殊关卡的标记。例如
int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道
for (i = 0; i < timeTunnel.Length; i++) Map[timeTunnel[i]] = 4;`
进入画地图阶段
首先要判断玩家是否还在地图上面,如果还在地图上面就继续画,不在就执行其他的方法。如果两个玩家位置重合该画什么?如果玩家在关卡上面但是两个玩家位置没有重新该画什么
就是这个意思
/// <summary>
/// 判断玩家位置,并画地图
/// </summary>
/// <param name="i"></param>
public static void DrawMapString(int i)
{
if (PlayerPosi[0] == PlayerPosi[1] && PlayerPosi[0] == i)
{
Console.Write("<>");
}
else if (PlayerPosi[0] == i) Console.Write("A");
else if (PlayerPosi[1] == i) Console.Write("B");
switch (Map[i])
{
case 0:
Console.Write("□");
Console.ForegroundColor = ConsoleColor.Red;
break;
case 1:
Console.Write("○");
Console.ForegroundColor = ConsoleColor.Yellow;
break;
case 2:
Console.Write("☆");
Console.ForegroundColor = ConsoleColor.Gray;
break;
case 3:
Console.Write("△");
Console.ForegroundColor = ConsoleColor.Green;
break;
case 4:
Console.Write("卐");
Console.ForegroundColor = ConsoleColor.Magenta;
break;
}
return;
}
public static void DrawMap()
{
Console.Write("{0}用A来表示\n{1}用B来表示\t", PlayerNames[0], PlayerNames[1]);
Console.WriteLine("图例:幸运轮盘:○\t地雷:☆\t暂停:△\t时空隧道:卐");
int i;
//第一横行
for (i = 0; i < 30; i++)
{
DrawMapString(i);
}
Console.WriteLine();
//第一竖行
for (i = 30; i < 36; i++)
{
for (int j = 0; j < 29; j++)
{
Console.Write(" ");
}
DrawMapString(i);
Console.WriteLine();
}
//第二横行
for (i = 64; i >= 35; i--)
{
DrawMapString(i);
}
Console.WriteLine();
// 第二竖行
for (i = 65; i < 70; i++)
{
DrawMapString(i);
Console.WriteLine();
}
//第三横行
for (i = 70; i < 100; i++) DrawMapString(i);
Console.WriteLine();
return;
}
}
让玩家的坐标动起来
就是把当前屏幕的内容清空,重新打印一遍新的地图
清空屏幕,Console.Clear();
玩游戏
生成随机数
C#中生成随机数的语句
Random r=new Random();
int number=r.Next(0,9);//生成0到8的之间的整数;
掷骰子的时候,将玩家坐标加上随机数就行
当两个玩家踩到了对方,如何判断谁被踩?
也就是正在玩的人踩到了另外一个人,代码来表示就是这样的
if(PlayerPosi[RoleCode]==PlayerPosi[1-RoleCode])
{
Console.WriteLine("玩家{0}踩到了玩家{1},玩家{2}后退6格",PlayerNames[RoleCode],PlayerNames[1-RoleCode],PlayerNames[1-RoleCode]);
PlayerPosi[1 - RoleCode] -= 5;
ChangePosi();//防止玩家在玩游戏的时候被干出地图了,就是每个玩家的坐标不能小于0,也不能大于99
Console.ReadKey(true);//等待用户按下一个键,并在屏幕上删除用户按下的键
}
暂停怎么做?
可以声明一个有两个元素的bool类型的数组,当玩家踩到了暂停的时候就将对应的元素的值改为true,每次执行玩游戏方法的时候判断玩家对应的元素的值是否为false,如果是false就表明正常,如果是true,那就说明踩到了暂停,就将对应元素的值改为false,让踩到了暂停的玩家能进行下一次游戏
其他的都是类似的
交互玩起来
也就是这个顺序
玩家A玩 用1来代表玩家A,也就是在调用玩游戏的方法的时候把1传给玩游戏的方法
玩家B玩 用0来代表玩家B
玩家A玩 1
玩家B玩 0
也就是1-RoleCode
游戏胜利
就是输入文字,转换成点阵式就行了,附上网址
文字转点阵式
也可以复制下面的东西
public static void Victory()
{
Console.ForegroundColor = ConsoleColor.Green;
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.WriteLine("■■ ■■ ■■ ■■");
Console.ReadKey();
return;
}
最终代码
using System;
namespace 飞行棋第二次查
{
class Program
{
static int[] Map = new int[100];
static int[] PlayerPosi = new int[2];
static bool[] flags = new bool[2];
static string[] PlayerNames = new string[2];
//PlayerNames[0]表示玩家A的姓名,PlayerNames[1]表示玩家B的姓名
static void Main(string[] args)
{
GameShow();
InputName();
Console.Clear();
GameShow();
Initialize();
DrawMap();
while (PlayerPosi[0] < 99 || PlayerPosi[1] < 99)
{
if (flags[0] == false)
{
PlayGame(0);
}
else flags[0] = false;
if (flags[1] == false) PlayGame(1);
else flags[1] = false;
}
Victory();
Console.ReadKey(true);
Console.ReadKey(true);
}
/// <summary>
/// 玩家输入姓名
/// </summary>
public static void InputName()
{
Console.WriteLine("请输入玩家A的姓名:");
PlayerNames[0] = Console.ReadLine();
while (PlayerNames[0] == "")
{
Console.WriteLine("输入错误,请重新输入");
PlayerNames[0] = Console.ReadLine();
if (PlayerNames[0] != "") break;
}
Console.WriteLine("请输入玩家B的姓名");
PlayerNames[1] = Console.ReadLine();
while (PlayerNames[1] == PlayerNames[0] || PlayerNames[1] == "")
{
if (PlayerNames[1] == PlayerNames[0])
{
Console.WriteLine("玩家A的姓名不能与玩家B的姓名相同,请重新输入");
PlayerNames[1] = Console.ReadLine();
if (PlayerNames[1] != PlayerNames[0]) break;
}
else
{
Console.WriteLine("姓名不能为空,请重新输入");
PlayerNames[1] = Console.ReadLine();
if (PlayerNames[1] != "") break;
}
}
return;
}
/// <summary>
/// 游戏头
/// </summary>
public static void GameShow()
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("***********************");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("***********************");
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.WriteLine("***********************");
Console.ForegroundColor = ConsoleColor.Blue;
Console.BackgroundColor = ConsoleColor.Gray;
Console.WriteLine("*******飞行棋**********");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("***********************");
Console.ForegroundColor = ConsoleColor.Magenta;
Console.WriteLine("***********************");
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine("***********************");
Console.ForegroundColor = ConsoleColor.DarkRed;
return;
}
/// <summary>
/// 初始化游戏地图
/// </summary>
public static void Initialize()
{
int[] luckyturn = { 6, 23, 40, 55, 69, 83 };//幸运转盘
int i = 0;
for (i = 0; i < luckyturn.Length; i++) Map[luckyturn[i]] = 1;
int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷
for (i = 0; i < landMine.Length; i++) Map[landMine[i]] = 2;
int[] pause = { 9, 27, 60, 93 };//暂停
for (i = 0; i < pause.Length; i++) Map[pause[i]] = 3;
int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道
for (i = 0; i < timeTunnel.Length; i++) Map[timeTunnel[i]] = 4;
return;
}
/// <summary>
/// 判断玩家位置,并画地图
/// </summary>
/// <param name="i"></param>
public static void DrawMapString(int i)
{
if (PlayerPosi[0] == PlayerPosi[1] && PlayerPosi[0] == i)
{
Console.Write("<>");
}
else if (PlayerPosi[0] == i) Console.Write("A");
else if (PlayerPosi[1] == i) Console.Write("B");
switch (Map[i])
{
case 0:
Console.Write("□");
Console.ForegroundColor = ConsoleColor.Red;
break;
case 1:
Console.Write("○");
Console.ForegroundColor = ConsoleColor.Yellow;
break;
case 2:
Console.Write("☆");
Console.ForegroundColor = ConsoleColor.Gray;
break;
case 3:
Console.Write("△");
Console.ForegroundColor = ConsoleColor.Green;
break;
case 4:
Console.Write("卐");
Console.ForegroundColor = ConsoleColor.Magenta;
break;
}
return;
}
/// <summary>
/// 用来检测玩家是否还在地图中
/// </summary>
public static void ChangePosi()
{
if (PlayerPosi[0] < 0) PlayerPosi[0] = 0;
if (PlayerPosi[0] > 99) PlayerPosi[0] = 99;
if (PlayerPosi[1] < 0) PlayerPosi[1] = 0;
if (PlayerPosi[1] > 99) PlayerPosi[1] = 99;
return;
}
/// <summary>
/// 画地图
/// </summary>
public static void DrawMap()
{
Console.Write("{0}用A来表示\n{1}用B来表示\t", PlayerNames[0], PlayerNames[1]);
Console.WriteLine("图例:幸运轮盘:○\t地雷:☆\t暂停:△\t时空隧道:卐");
int i;
#region 第一横行
for (i = 0; i < 30; i++)
{
DrawMapString(i);
}
#endregion
Console.WriteLine();
#region 第一竖行
for (i = 30; i < 36; i++)
{
for (int j = 0; j < 29; j++)
{
Console.Write(" ");
}
DrawMapString(i);
Console.WriteLine();
}
#endregion
#region 第二横行
for (i = 64; i >= 35; i--)
{
DrawMapString(i);
}
#endregion
Console.WriteLine();
#region 第二竖行
for (i = 65; i < 70; i++)
{
DrawMapString(i);
Console.WriteLine();
}
#endregion
#region 第三横行
for (i = 70; i < 100; i++) DrawMapString(i);
Console.WriteLine();
#endregion
return;
}
public static void PlayGame(int RoleCode)
{
Console.WriteLine("玩家{0}按任意键开始掷骰子", PlayerNames[RoleCode]);
Console.ReadKey(true);
Random r = new Random();
int number = r.Next(1, 7);
Console.WriteLine("玩家{0}掷出了{1}", PlayerNames[RoleCode], number);
PlayerPosi[RoleCode] += number;
Console.ReadKey(true);
Console.WriteLine("玩家{0}按任意键1开始行动", PlayerNames[RoleCode]);
Console.ReadKey(true);
Console.WriteLine("玩家{0}行动完了", PlayerNames[RoleCode]);
Console.ReadKey(true);
if (PlayerPosi[RoleCode] == PlayerPosi[1 - RoleCode])
{
Console.WriteLine("玩家{0}踩到了玩家{1},玩家{2}后退6格", PlayerNames[RoleCode], PlayerNames[1 - RoleCode], PlayerNames[1 - RoleCode]);
PlayerPosi[1 - RoleCode] -= 5;
ChangePosi();
Console.ReadKey(true);
}
else
{
ChangePosi();
switch (Map[PlayerPosi[RoleCode]])
{
case 0:
Console.WriteLine("玩家{0}踩到了方块,暂时安全", PlayerNames[RoleCode]);
Console.ReadKey(true);
break;
case 1:
Console.WriteLine("玩家{0}踩到了幸运轮盘,1交换位置,2轰炸对方,使对方回退6格,请输入:", PlayerNames[RoleCode]);
int n;
bool x = int.TryParse(Console.ReadLine(), out n);
while (x == false || (n != 1 && n != 2))
{
Console.WriteLine("输入错误,请重新输入");
x = int.TryParse(Console.ReadLine(), out n);
if (n == 1 || n == 2) break;
}
switch (n)
{
case 1:
Console.WriteLine("玩家{0}输入了1,正在与玩家{1}互换位置中", PlayerNames[RoleCode], PlayerNames[1 - RoleCode]);
Console.ReadKey(true);
int t = PlayerPosi[RoleCode];
PlayerPosi[RoleCode] = PlayerPosi[1 - RoleCode];
PlayerPosi[1 - RoleCode] = t;
Console.WriteLine("互换完毕");
Console.ReadKey(true);
break;
case 2:
Console.WriteLine("玩家{0}输入了2,玩家{1}后退6格", PlayerNames[RoleCode], PlayerNames[1 - RoleCode]);
Console.ReadKey();
PlayerPosi[RoleCode] -= 6;
break;
}
break;
case 2:
Console.WriteLine("玩家{0}踩到了地雷,后退6格", PlayerNames[RoleCode]);
Console.ReadKey(true);
PlayerPosi[RoleCode] -= 6;
break;
case 3:
Console.WriteLine("玩家{0}猜了暂停,暂停一回合");
flags[RoleCode] = true;
Console.ReadKey(true);
break;
case 4:
Console.WriteLine("玩家{0}进入时空隧道,前进10格", PlayerNames[RoleCode]);
PlayerPosi[RoleCode] += 10;
Console.ReadKey();
break;
}
}
ChangePosi();
Console.Clear();
Initialize();
DrawMap();
return;
}
public static void Victory()
{
Console.ForegroundColor = ConsoleColor.Green;
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.WriteLine("■■ ■■ ■■ ■■");
Console.ReadKey();
return;
}
}
}
最后
小白一个,若有错误,请大佬指出,看到就会更改哈,希望我们可以在这条路上走得更远