源代码,优化部分代码,把map改为全局变量。完善内容。
修复了一个BUG,位置可以小于0,现在被轰炸之后最小位置为0,起点位置。
调整try catch 语句位置,只包含可能出错的部分代码,不包含其他不该包含的代码块。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 大富翁1
{
public class Player{
//public Player(){}
//private string name;
//private int site;
//private int status;
//private int step;
private int userChoice;//用户的选择
public int gameMode;
public int Step { set; get; }//筛子结果/步数
public int Status { set; get; }//状态
public string Name { set; get; }//名称
public int Site { set; get; }//位置
public int times;//可以行动的次数
public Player other;//另一个玩家的引用,实现对另一个玩家的位置交换或者轰炸。操作对方的位置。
public bool win = false;
public Random ra;//随机数引用,不能创建实例,否则每次结果一样。两个玩家只能使用同一个随机数实例
private void ThrowTheDice()//掷塞子
{
Step = ra.Next(1, 7);
Console.WriteLine("{0}掷出了{1}",Name,Step);
}
private void Move()//移动
{
Site += Step;
Console.WriteLine("{0}走到了{1}",Name,Site);
}
private void CheckStatus()//检测是否遇到特效,遇到就行动并清除地图上该特效
{
if (Program.map[Site]==1)//如果遇到幸运
{
//提示用户可以选择前进或者交换位置或者轰炸对方
Console.WriteLine("恭喜 {0} 获得一次幸运轮盘机会,请选择:\n1.前进3步. 2.交换位置. 3.轰炸对方(倒退6步).",Name);
if (gameMode == 1)//p2默认0由电脑控制,1为玩家控制,所以此刻由玩家做出选择
{
try//尝试获取用户选择,防止用户输入非法字符
{
userChoice = Convert.ToInt32(Console.ReadLine());
}
catch(Exception ex){
Console.WriteLine("错误详情:{0}",ex.Message);
Console.WriteLine("你的选择有误.请重新选择.");
CheckStatus();
}
}
else//电脑自动做出选择
{
if (Site < other.Site && other.Site-Site>=6)//如果玩家的位置在电脑前边6格以及6格之上就交换位置
{
userChoice = 2;
}
else//否则玩家在电脑前边6格以内和电脑当前位置之后
{
if (Site - other.Site < 6)//如果玩家的位置在电脑前后6格就轰炸对方
{
userChoice = 3;
}
else//否则向前3步.
userChoice = 1;
}
}
if (1 == userChoice)//前进3步
{
Program.map[Site] = 0;//将地图这个位置的特效移除
Site += 3;
Console.WriteLine("{0}向前走了3步到了{1}.",Name,Site);
}
else if (2 == userChoice)//交换位置
{
Program.map[Site] = 0;//将地图这个位置的特效移除
int tmp;
tmp=Site;
Site=other.Site;
other.Site = tmp;
Console.WriteLine("{0}与{1}交换了位置.",Name,other.Name);
}
else if (3 == userChoice)//轰炸对方
{
Program.map[Site] = 0;//将地图这个位置的特效移除
if (other.Site >= 6)
{
other.Site = other.Site - 6;
Console.WriteLine("{1}被{0}轰炸,倒退了6步,到了位置{2}", Name, other.Name, other.Site);
}
else
{
other.Site = 0;
Console.WriteLine("{1}被{0}轰炸,倒退了回了起点,到了位置{2}", Name, other.Name, other.Site);
}
}
else if(Program.map[Site]==2)//如果遇到穿越
{
Program.map[Site] = 0;//将地图这个位置的特效移除
//本人向前穿越6格
Site += 6;
Console.WriteLine("{0}幸运的进入了时空隧道,向前穿越6步,到了{1}",Name,Site);
}
else if(Program.map[Site]==3)//如果遇到障碍
{
Program.map[Site] = 0;//将地图这个位置的特效移除
//检测对方状态是否为暂停一轮.
//本人状态转为暂停一轮
times--;//行动次数减一
Console.WriteLine("{0}遇到了雨,要休息一轮.",Name);
}
}
private void CheckWinLose()
{
if (Site >= 100)
{
Console.WriteLine("恭喜 {0} 获得胜利!!!",Name);
other.Status = 0;
Status = 0;
win = true;
}
}
public void Action()
{
if (times > 0)//行动次数大于1才能行动
{
Status = 1;
ThrowTheDice();
Move();
CheckWinLose();
if (win == false)
{
CheckStatus();
}
Status = 0;
Console.ReadKey();
}
else //否则行动次数加1,本轮行动结束。
{
times++;
Status = 0;
Console.WriteLine("{0}本轮无法行动,行动结束.",Name);
Console.ReadKey();
}
}
}
class Paint
{
public int choice=0;
//public int[] map;
public Player p1;
public Player p2;
private string[] menu=new string[]{"1.人机对战","2.双人游戏","3.游戏说明","4.关 于","请按上下键选择,按回车键确定选择。Esc键退出。"};
private string tag = " <=========";
public void OutMenu()//显示主界面
{
Console.Clear();
Console.WriteLine("******************************");
Console.WriteLine(" 大富翁 V2.1");
Console.WriteLine("******************************");
for (int i = 0; i < 5; i++)
{
if(choice==i)
Console.WriteLine(menu[i]+tag);
else
Console.WriteLine(menu[i]);
}
}
public void OutAbout()//显示关于
{
Console.Clear();
Console.WriteLine(@"
大富翁 V2.1
作者:陈剑虹
日期:2015年5月15日
开发语言:C# Visual Studio 2010");
Console.ReadKey();
}
public void OutHelp()//显示帮助
{
Console.Clear();
Console.WriteLine(@"游戏说明
游戏很简单,只需要按键就可以自动投筛子,这只是一个学习练习用的游戏,还在不断完善。
每学习一点新知识就完善一部分.目前使用到的有
Class 类,对象
public static map 全局变量
public string Name{set;get;} 对象的属性
对象引用.
while
for
if -else if-else
try catch
这个版本还不满意.还可以做的更好。
待更新,应该使用继承来创建 电脑玩家 这个子类 继承 Player类.加入电脑特有的控制方法.而不是在Player类中判断是不是电脑控制.
应该加入数据类,用来存储基本的数据,如:菜单,关于,帮助,地图数据,玩家数据,历史记录
加入游戏暂停,游戏保存。
");
Console.ReadKey();
}
public void OutState()//显示行动信息
{
Console.WriteLine("{0}的位置是:{1}",p1.Name,p1.Site);
Console.WriteLine("{0}的位置是:{1}", p2.Name, p2.Site);
if (p1.Status == 1)
{
Console.WriteLine("{0}走了{1}步.",p2.Name,p2.Step);
Console.WriteLine("现在轮到{0}行动了。", p1.Name);
}
else if (p2.Status == 1)
{
Console.WriteLine("{0}走了{1}步.", p1.Name, p1.Step);
Console.WriteLine("现在轮到{0}行动了。", p2.Name);
}
Console.WriteLine("任意键继续.");
}
public void OutMap()//显示地图
{
Console.Clear();
Console.WriteLine("{0}:● {1}:▲ 两人共同位置:<> 幸运轮盘:☆ 时空隧道:¤ 下雨:≡ 普通:□",p1.Name,p2.Name);
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 20; j++)
{
if (i * 20 + j == p1.Site && i * 20 + j == p2.Site)
{
Console.Write("<>");
}
else if (i * 20 + j == p1.Site)
{
Console.Write("●");
}
else if (i * 20 + j == p2.Site)
{
Console.Write("▲");
}
else if (Program.map[i * 20 + j] == 1)
Console.Write("☆");
else if (Program.map[i * 20 + j] == 2)
Console.Write("¤");
else if (Program.map[i * 20 + j] == 3)
Console.Write("≡");
else
Console.Write("□");
}
Console.Write("\n");
}
}
}
class Program
{
public static int[] map = new int[100];
static void Main(string[] args)
{
//int gameMod = 0;//0为人机模式,1为玩家对战
ConsoleKeyInfo cki;
Paint paint = new Paint();
Player p1 = new Player();
Player p2 = new Player();
Random ra = new Random();
Random ra2 = new Random();
int raNum;
paint.p1 = p1;
paint.p2 = p2;
p1.other = p2;
p2.other = p1;
p1.ra = ra;
p2.ra = ra;
//大循环,程序伊始,初始化数据,进入菜单。
while (true)
{
p1.win = false;
p2.win = false;
p1.Site = 0;
p2.Site = 0;
p1.times = 1;
p2.times = 1;
p1.Status = 1;
p2.Status = 0;
p2.gameMode = 0;
p1.Name = "";
p2.Name = "";
//初始化地图数据
for (int i = 0; i < 100; i++)
{
raNum=ra2.Next(1, 10);
if (raNum > 3)
map[i] = 0;
else
map[i] = raNum;
}
//进入菜单,等待用户做出选择
while (true)//用户选择界面
{
paint.OutMenu();//输出菜单,在控制台里显示文本。
cki = Console.ReadKey();//接收用户按键,上,下,ENTER,ESC
if (cki.Key == ConsoleKey.DownArrow)//用户按下 下按键 向下调整选择
{
if (paint.choice < 3)
paint.choice += 1;
else
paint.choice = 0;
paint.OutMenu();
}
else if (cki.Key == ConsoleKey.UpArrow)//用户按下 上按键 向上调整选择
{
if (paint.choice > 0)
paint.choice -= 1;
else
paint.choice = 3;
paint.OutMenu();
}
else if (cki.Key == ConsoleKey.Escape)//用户按下 Esc按键 退出
{
paint.choice = -1;
return;
}
else if (cki.Key == ConsoleKey.Enter)//用户按下 Enter键 选择结束。跳出选择循环。
{
break;
}
}//直到用户选择一项之后跳出循环
if (paint.choice == 0)//如果选择的是0,那么就开始人机对战
{
//gameMod = 0;
while (p1.Name.Length<1)
{
Console.WriteLine("请输入你的名字:");
p1.Name = Console.ReadLine();
}
p1.gameMode = 1;//玩家控制
p2.Name = "电脑";
p2.gameMode = 0;//电脑控制
while (p1.win == false && p2.win == false)
{
paint.OutMap();
p1.Action();
paint.OutMap();
paint.OutState();
Console.ReadKey();
paint.OutMap();
p2.Action();
paint.OutMap();
paint.OutState();
Console.ReadKey();
}
}
else if (paint.choice == 1)//如果选择的是2,那么就开始玩家对战
{
//gameMod = 1;
p1.gameMode = 1;
p2.gameMode = 1;
while (p1.Name.Length < 1)
{
Console.WriteLine("请输入玩家1的名字:");
p1.Name = Console.ReadLine();
}
while (p2.Name.Length < 1)
{
Console.WriteLine("请输入玩家2的名字:");
p2.Name = Console.ReadLine();
}
while (p1.win == false && p2.win == false)
{
paint.OutMap();
paint.OutState();
p1.Action();
Console.ReadKey();
paint.OutMap();
paint.OutState();
p2.Action();
Console.ReadKey();
}
}
else if (paint.choice == 2)//如果选择的是2,那么显示游戏说明
{
paint.OutHelp();
}
else if (paint.choice == 3)//如果选择的是3,那么显示 关于
{
paint.OutAbout();
}
else
{
break ;
}
//反馈完毕之后,要么是游戏结束,要么是显示完毕信息。应回到程序开头,初始化所有数据。
}
Console.ReadKey();
}
}
}