您的位置:首页 > 编程语言 > C#

骑士飞行棋 C#代码详解

2016-03-04 17:13 603 查看
最近看见一个骑士飞行棋的小游戏代码,感觉这个代码中将大多数C#的基础知识都运用到了,是一个新手检验学习成果的有效方法,特此将这个代码整理一遍。这是一个控制台程序。这是代码下载地址,代码中的注释非常详细介绍了每段代码的作用:
http://files.cnblogs.com/files/xiaohua92/%E9%AA%91%E5%A3%AB%E9%A3%9E%E8%A1%8C%E6%A3%8B.zip
首先要了解一下 骑士飞行棋 这个游戏的游戏规则:

1)参与游戏的一共有两个人,暂且称之为A和B.两个人轮流掷筛子,根据掷得的点数在地图上移动

2)地图上有5中元素,分别是无效果:□ 幸运轮盘:◎ 地雷:☆ 暂停:▲ 时空隧道:卍 。其中当走到□时候没有任何特殊效果,当走到幸运轮盘的时候会让你选择是要跟对手交换位置还是要轰炸对手(轰炸效果为让对手后退6格),当走到地雷的时候会自动倒退6格,当走到暂时的时候下一次暂停掷筛子一次,当走到时空隧道的时候会前进10格

3)如果A踩到了B,既A在B之后到了B所在的位置,此时B将要退回原点

4)为了调试方便,在代码中给游戏加了一个作弊按钮:在掷筛子的时候,按Tab键之后再按F1键的话,会让玩家自主输入想要掷的点数

代码构成:

一共设立了5个类,分别是Program(Main函数所在类)\drawMap(用来绘制地图)\baseUse(一些必要的基本函数)\Initial(初始化姓名以及地图等)\match(比赛逻辑) 。其中:

Program类:定义了公共的静态变量以及Main函数

drawMap类:定义了drawMaps()函数(用来绘制地图),getMapString()函数(主要用来在绘制地图的时候,确定当前位置图标)

baseUse类:定义了ShowUI()函数(用来绘制飞行棋的名称),ReadInt(int min, int max)函数(用来读取用户输入的数字), checkPos()函数(用来检查玩家当前位 置是否超出边界)

Initial类:InitialMap()函数(用来初始化地图信息),InitialName()函数(用来记录玩家输入的用户名)

match类:Action(int playerNumber)类(用来玩家掷筛子之后的逻辑判断)

下面附上所有代码 :

Program类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 骑士飞行棋
{
class match
{
public static void Action(int playerNumber)
{
if (Program.isStop[playerNumber] == false)
{
Console.WriteLine("{0}按任意键开始掷筛子......", Program.names[playerNumber]);
ConsoleKeyInfo sec = Console.ReadKey(true);//读取用户在键盘上键入的内容
Program.step = Program.r.Next(1, 7);//产生一个1到6之间的随机数

//当用户先输入Tab,在输入F1之后,就进入作弊环节,在状态下用户可以任意输入一个1到100之间的数字来当做自己掷的点数
if (sec.Key == ConsoleKey.Tab)//如果用户键入的内容为Tab键
{
ConsoleKeyInfo sec1 = Console.ReadKey(true);//新建一个变量用来读取用户在键盘上的输入
//如果用户按下了F1键
if (sec1.Key == ConsoleKey.F1)
{
Program.step = baseUse.ReadInt(1, 100);//让用户输入一个1到100之间的数字
}
}

Console.WriteLine("{0}掷出了{1}", Program.names[playerNumber], Program.step);
Console.WriteLine("{0}按任意键开始行动......", Program.names[playerNumber]);
Console.ReadKey();

Program.playerPos[playerNumber] += Program.step;//用户向前走step步
baseUse.checkPos();//检查是否超出了边界

if (Program.playerPos[playerNumber] == Program.playerPos[1 - playerNumber])//当玩家A/B踩到了玩家B/A的时候
{
Program.playerPos[1 - playerNumber] = 0;
Program.msg = string.Format("{0}踩到了{1},{1}退回了原点", Program.names[playerNumber], Program.names[1 - playerNumber]);
}
else //如果没有踩到的话
{
switch (Program.map[Program.playerPos[playerNumber]])
{
case 0://没有踩到任何机关
Program.msg = "";
break;
case 1://进入了幸运轮盘
Console.Clear();
Console.WriteLine("你走到了幸运轮盘,请选择运气?");
Console.WriteLine("1 ---交换位置  2---轰炸对方");
int userSelect = baseUse.ReadInt(1, 2);
if (userSelect == 1)//与对方交换位置
{
int temp = Program.playerPos[playerNumber];
Program.playerPos[playerNumber] = Program.playerPos[1 - playerNumber];
Program.playerPos[1 - playerNumber] = temp;
Program.msg = string.Format("{0}选了与对方交换位置", Program.names[playerNumber]);
}
else//轰炸对方
{
Program.playerPos[1 - playerNumber] -= 6;
Program.msg = string.Format("{0}轰炸了{1},{1}退回了6格", Program.names[playerNumber], Program.names[1 - playerNumber]);
baseUse.checkPos();
}
break;
case 2://踩到了地雷
Program.playerPos[playerNumber] -= 6;
baseUse.checkPos();
Program.msg = string.Format("{0}踩到了地雷,{0}退了6格", Program.names[playerNumber]);
break;
case 3:
//暂停一次
Program.isStop[playerNumber] = true;
Program.msg = string.Format("{0}走到了红灯,下次暂停一次啊", Program.names[playerNumber]);
break;
case 4:
//踩到时空隧道
Program.playerPos[playerNumber] += 10;
baseUse.checkPos();
Program.msg = string.Format("{0}进入了时空隧道,爽死了,进了10格", Program.names[playerNumber]);
break;
}
}
}
else
Program.isStop[playerNumber] = false;

if (Program.playerPos[playerNumber] >= 99)//当有人胜利的时候
{
Console.Clear();
if (Program.playerPos[0] >= 99)
{
Console.WriteLine("{0}胜利了!!游戏结束", Program.names[0]);
}
else
{
Console.WriteLine("{0}胜利了!!游戏结束", Program.names[1]);
}
}
else//如果没有人走到尽头
{
Console.Clear();
drawMap.drawMaps();
if (Program.msg != "")
{
Console.WriteLine(Program.msg);
}
Console.WriteLine("{0}掷出了{1},行动完成!", Program.names[playerNumber], Program.step);
Console.WriteLine("*************玩家A和玩家B的位置*********");
Console.WriteLine("{0}的位置为:{1}", Program.names[0], Program.playerPos[0] + 1);
Console.WriteLine("{0}的位置为:{1}", Program.names[1], Program.playerPos[1] + 1);
}
}

}
}


View Code
学习总结:

1)如果所定义的静态变量没有声明为public,则在另外的类里无法引用,只能在所定义的类中使用。方法亦然。当声明为public之后,可以在其他类中通过 类型.方法名 的方式来引用。关于静态类型的更多说明,可以看C#中的static静态变量的用法一文。

2)在代码中新接触的语句:

ConsoleKeyInfo sec = Console.ReadKey(true);//读取用户在键盘上键入的内容
Program.step = Program.r.Next(1, 7);//产生一个1到6之间的随机数

if (sec.Key == ConsoleKey.Tab); //如果用户键入的内容为Tab键

Console.ForegroundColor = ConsoleColor.White; //设置控制台当前位置的颜色为白色
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: