一开始看骑士飞行棋演示,在心里想,这个游戏怎么做啊,应该很难吧, 还是在这之前把前面的基础视频学好吧,经过几天的学习,终于开始学这个小游戏项目了,
教程学到一半,回家了,上不了网,也没有笔记本带回家,中间就停了,昨天回来,接着学,到现在终于学完了,看完老师的视频,自己然后按老师说的,一点一点 做,输入 代码,中间有错误,再按老师的方法,一点一点的调式,居然出来的都是正确的,很高兴,
原来游戏就是这样做的啊,经过老师的分解,讲解,整个游戏的过程,在脑子中,很清楚的显示出来,特别是调式方法,变量在调试中还可以手动更改,以前遇到问题不知道从何处下手,经常这个小项目的学习,对.net 又有了进一步的认识, 也明白了前面,老师说的,这个项目的目的主要是,对以前学习的应用与复习,真的如此。
不过我觉得在那个 掷骰子的方法,传二个参数会不会更好一些,static void Action(int playerNumber1, int playerNumber2)
playerNumber1 代表当前玩家,
playerNumber2 代表对方玩家, 如果这个游戏很更多玩家,是不是,可以传递更多的玩家参数,
下面把我的按视频中写出来代码,还有自己的方法帖出来与新手分享,感觉我们新人学的第一个很重要的是:把现成例子给作出来正确的结果很重要,然后中意有不明白了,慢慢去理解消化, 有空了,再看能不能把代码优化,
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 string[] names = new string[2]; //names[0]存放玩家A的姓名,存入玩家B的姓名。
static bool[] isStop = { false, false }; //isStop[0]表示A是否上一次走到了暂停,isStop[1]表示B是,如果走到暂停,则设置其值为true
static void Main(string[] args)
{
ShowUI();//显示游戏名称
Console.WriteLine("请输入玩家A的姓名:");
names[0] = Console.ReadLine();
while (names[0] == "")
{
Console.WriteLine("玩家A的姓名不能为空,请重新输入:");
names[0] = Console.ReadLine();
}
Console.WriteLine("请输入玩家B的姓名:");
names[1] = Console.ReadLine();
while (names[1] == "" || names[1] == names[0])
{
if (names[1] == "")
{
Console.WriteLine("玩家B的姓名不能为空,请重新输入:");
}
if (names[1] == names[0])
{ //A和B重名
Console.WriteLine("此姓名已经被玩家A的使用,请重新输入:");
}
names[1] = Console.ReadLine();
}
Console.Clear();
ShowUI();
Console.WriteLine("对战开始......");
Console.WriteLine("{0} 用A表示", names[0]);
Console.WriteLine("{0} 用B表示", names[1]);
InitialMap(); //初始化地图
DrawMap(); //绘制地图
Console.WriteLine("开始游戏...");
//这个循环中让玩家A和玩家B轮流掷骰子 当玩家A或玩家B的坐标>=99时,则结束循环。
while (playerPos[0] < 99 && playerPos[1] < 99)
{
//玩家A开始掷骰子
if (isStop[0] == false)
{
Action(0,1);
}
else
{
isStop[0] = false;
}
if (playerPos[0] >= 99)
{
break;
}
//玩家B开始掷骰子
if (isStop[1] == false)
{
Action(1,0);
}
else
{
isStop[1] = false;
}
}
// 判断谁胜利,谁失败
Console.Clear();
ShowUI();
if (playerPos[0] >= 99)
{
Console.WriteLine("{0}赢了!!!!!", names[0]);
}
else if (playerPos[1] >= 99)
{
Console.WriteLine("{0}赢了!!!!!!", names[1]);
}
Console.ReadKey();
}
/// <summary>
/// A或B掷骰子的方法
/// </summary>
/// <param name="playerNumber1">当前掷骰的人</param>
/// <param name="playerNumber2">对方</param>
static void Action(int playerNumber1, int playerNumber2)
{
//playerNumber1 中存的就是当前玩家 (姓名 坐标 是否暂停) 这三个数组的下标
//playerNumber2 就是对方的 (姓名 坐标 是否暂停)这三个数组的下标
Console.WriteLine("{0}按任意键开始掷骰子......", names[playerNumber1]);
ConsoleKeyInfo rec = Console.ReadKey(true);
Random r = new Random(); // r是产生随机数时用的
string msg = ""; // 用于存储用户踩到某关卡,输出的话。
int step = 0; // 用于存放产生的随机数量
step = r.Next(1, 7);
if (rec.Key == ConsoleKey.Tab && rec.Modifiers == (ConsoleModifiers.Control | ConsoleModifiers.Shift))
{
if (Console.ReadKey(true).Key == ConsoleKey.F1)
{
step = ReadInt(1, 100);
}
}
Console.WriteLine("{0}掷出了{1}", names[playerNumber1], step);
playerPos[playerNumber1] += step; //注意,一旦坐标发生改变,就要判断 坐标值是是否>99 或者<0
checkPos(); // 检查坐标是否越界
Console.WriteLine("按任意键开始行动......");
Console.ReadKey(true);
if (playerPos[playerNumber1] == playerPos[playerNumber2]) //玩家A踩到玩家B
{
playerPos[playerNumber2] = 0;
msg = string.Format("{0}踩到了{1},{1}回到了原点。", names[playerNumber1], names[playerNumber2]);
}
else
{ //没踩到,要判断玩家A现在所在的位置是滞有其他关卡
switch (map[playerPos[playerNumber1]])
{
case 0: //普通,没有效果
msg = "";
break;
case 1: //走到了幸运轮盘关卡
Console.WriteLine("{0}你走到了幸运轮盘,请选择运气:", names[playerNumber1]);
Console.WriteLine("1---交换位置; 2---轰炸对方。");
int selectInput = ReadInt(1, 2);
if (selectInput == 1)
{ //要与对方交换位置
int tmep = playerPos[playerNumber1];
playerPos[playerNumber1] = playerPos[playerNumber2];
playerPos[playerNumber2] = tmep;
msg = string.Format("{0}与对方交换了位置。", names[playerNumber1]);
}
else if (selectInput == 2)
{ // 轰炸对方
playerPos[playerNumber2] = 0;
msg = string.Format("{0}回到了原点", names[playerNumber2]);
}
break;
case 2: //踩到了地雷
playerPos[playerNumber1] -= 6;
checkPos();
msg = string.Format("{0}踩到了地雷,退6步。", names[playerNumber1]);
break;
case 3: //暂停一次
isStop[playerNumber1] = true;
msg = string.Format("{0}走到红灯,下次暂停一次", names[playerNumber1]);
break;
case 4: //时空隧道
playerPos[playerNumber1] = +10;
checkPos();
msg = string.Format("{0}走到了时空隧道,前进10步。", names[playerNumber1]);
break;
}
}
Console.Clear();
DrawMap();
if (msg != "")
{
Console.WriteLine(msg);
}
Console.WriteLine("{0}掷出了{1},行动完成!", names[playerNumber1], step);
Console.WriteLine("************玩家A和玩家B的位置如下***************");
Console.WriteLine("{0}的位置为:{1}", names[playerNumber1], playerPos[playerNumber1] + 1);
Console.WriteLine("{0}的位置为:{1}", names[playerNumber2], playerPos[playerNumber2] + 1);
Console.WriteLine("");
}
/// <summary>
/// 用于绘制飞棋名称
/// </summary>
static void ShowUI()
{
Console.WriteLine("****************************************************");
Console.WriteLine("* *");
Console.WriteLine("* 骑 士 飞 行 棋 *");
Console.WriteLine("* *");
Console.WriteLine("****************************************************");
}
/// <summary>
/// 地图初始化
/// </summary>
static void InitialMap()
{
int[] luckyTurn = { 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 < luckyTurn.Length; i++)
{
map[luckyTurn[i]] = 1;
}
for (int i = 0; i < landMine.Length; i++)
{
map[landMine[i]] = 2;
}
for (int i = 0; i < pause.Length; i++)
{
map[pause[i]] = 3;
}
for (int i = 0; i < timeTunnel.Length; i++)
{
map[timeTunnel[i]] = 4;
}
}
/// <summary>
/// 画地图
/// </summary>
static void DrawMap()
{
//在数组中 1:表示幸运轮盘◎
// 2:地雷☆
// 3:暂停▲
// 4:时空隧道卐
// 0:表示普通□
Console.WriteLine("<>代表二个玩家在同一个位置");
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++)
{
if (j < 29)
{
Console.Write(" ");
}
else
{
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();
}
/// <summary>
/// 获得第pos坐标上应该绘制的图案
/// </summary>
/// <param name="pos">要绘制的人坐标</param>
static string getMapString(int pos)
{
string mpaString = "";
if (playerPos[0] == pos && playerPos[1] == pos)
{
mpaString = "<>";
}
else if (playerPos[0] == pos)
{
mpaString = "A";
}
else if (playerPos[1] == pos)
{
mpaString = "B";
}
else
{
switch (map[pos])
{
case 0:
Console.ForegroundColor = ConsoleColor.White;
mpaString = "□";
break;
case 1:
Console.ForegroundColor = ConsoleColor.Red;
mpaString = "◎";
break;
case 2:
Console.ForegroundColor = ConsoleColor.Blue;
mpaString = "☆";
break;
case 3:
Console.ForegroundColor = ConsoleColor.Yellow;
mpaString = "▲";
break;
case 4:
Console.ForegroundColor = ConsoleColor.Green;
mpaString = "卐";
break;
}
}
return mpaString;
}
/// <summary>
/// 检查玩家坐标是否越界
/// </summary>
static void checkPos()
{
for (int i = 0; i < 1; i++)
{
if (playerPos[i] > 99)
{
playerPos[i] = 99;
}
if (playerPos[i] < 0)
{
playerPos[i] = 0;
}
}
}
static int ReadInt()
{
int i = ReadInt(int.MinValue, int.MaxValue);
return i;
}
/// <summary>
/// 读取一个min 到 max之间的一个整数。
/// </summary>
/// <param name="min"></param>
/// <param name="max"></param>
/// <returns></returns>
static int ReadInt(int min, int max)
{
while (true)
{
try
{
int num = Convert.ToInt32(Console.ReadLine());
if (num < min || num > max)
{
Console.WriteLine("只能输入{0}到{1}之间的数字。", min, max);
}
else
{
return num;
}
}
catch
{
Console.WriteLine("只能输入数字,请重新输入。");
}
}
}
}
}