骑士飞行棋第二版(已完善)

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6
  7 namespace 骑士飞行棋
  8 {
  9     class Program
 10     {
 11
 12         //在下面的数组存储我们游戏地图各个关卡
 13         //数组的小标为0的元素对应地图上的第一格   下标为1的元素对应第二格。。。下标为n的元素对应n+1格
 14         //在数组中用 1.表格幸运轮盘◎
 15         //           2.地雷☆
 16         //           3.暂停▲
 17         //           4.时空隧道※
 18         //           0.表示普通□
 19         static int[] Map = new int[100];//设置地图格数并为每格赋值初始值为0
 20         static int[] playerPos = { 0, 0 };//playerPos[0]存玩家A的坐标,playerPos[1]存玩家B的坐标 ps:注意这里等于号后面的是{},并不是[],只表示数组长度为2,分别都为零→ static int[] playerPos = new int[1];
 21         static string[] names = new string[2]; //names[0]存玩家A的姓名,names[1]存玩家B的姓名
 22         static bool[] isStop = { false, false };//isStop[0]表示A是否上一次走到了暂停,isStop[1]表示B上一次是否走到了暂停,如果走到暂停则设置其值为true
 23         #region//主程序
 24         static void Main(string[] args)
 25         {
 26
 27
 28
 29
 30
 31
 32             ShowUI();//显示游戏名称
 33             Console.WriteLine("请输入玩家A的姓名:");//输出提示
 34             names[0] = Console.ReadLine();//把玩家A的姓名赋值给names[0]
 35             //判断用户输入的内容是否为空,如果为空,则让用户重新输入
 36             while (names[0] == "")//只要用户输入为空则执行下面的循环
 37             {
 38                 Console.WriteLine("姓名不能为空,请重新输入玩家A的姓名:");//提示不能输入空值
 39                 names[0] = Console.ReadLine();//把玩家A的姓名赋值给names[0]
 40
 41             }
 42             Console.WriteLine("请输入玩家B的姓名:"); //输出提示
 43             names[1] = Console.ReadLine();//把玩家B的姓名赋值给names[1]
 44             while ((names[1] == "") || (names[0] == names[1]))//只要用户输入空值或者与玩家A的姓名重复则执行下面的循环
 45             {
 46                 if (names[1] == "")//如果玩家B的姓名为空则
 47                 {
 48                     Console.WriteLine("姓名不能为空,请重新输入玩家B的姓名:");
 49                 }
 50                 else//如果玩家B的姓名与玩家A的姓名重复则
 51                 {
 52                     Console.WriteLine("姓名不能重复,请重新输入玩家B的姓名:");
 53                 }
 54                 names[1] = Console.ReadLine();//把玩家B的姓名赋值给names[1]
 55             }
 56             Console.Clear();//清屏
 57             ShowUI();//显示游戏名称
 58             Console.WriteLine("对战开始......");//输出提示
 59             Console.WriteLine("{0}用A来表示", names[0]);//输出玩家A的姓名
 60             Console.WriteLine("{0}用B来表示", names[1]);//输出玩家B的姓名
 61             Console.WriteLine("如果AB同一位置,用<>来表示");//输出提示
 62             InitialMap();//初始化地图
 63             DrawMap();//绘制地图
 64             Console.WriteLine("开始游戏......");
 65
 66             //这个循环中让玩家A和玩家B轮流掷骰子    当玩家A或者玩家B的坐标>=99时,则结束循环
 67             //那循环条件就是
 68             //产生一个m到n之间的随机数
 69             //Random r = new Random();
 70             //int i = r.Next(m,n+1);
 71             while (playerPos[0] < 99 && playerPos[1] < 99)//判断胜利条件,如果没有胜利,程序继续循环运行
 72             {
 73                 if (isStop[0] == false)
 74                 {
 75
 76                     Action(0);//玩家A掷骰子
 77                 }
 78                 else
 79                 {
 80                     //说明 isStop == true
 81                     isStop[0] = false;
 82                 }
 83
 84                 if (playerPos[0] >= 99)//如果玩家A坐标为最后一格,则退出循环,胜利
 85                 {
 86                     break; //退出循环
 87                 }
 88
 89                 if (isStop[1] == false)
 90                 {
 91                     Action(1);//玩家B掷骰子
 92                 }
 93                 else
 94                 {
 95                     //说明 isStop == true
 96                     isStop[1] = false;
 97                 }
 98
 99             }
100
101             //判断谁胜利,谁失败
102             Console.Clear();//清屏
103             ShowUI();//绘制游戏开头画面
104             if (playerPos[0] >= 99)
105             {
106                 Console.WriteLine("{0}胜利了!!!!!", names[0]);//提示玩家A胜利
107             }
108             else
109             {
110                 Console.WriteLine("{0}胜利了!!!!!", names[1]);//提示玩家B胜利
111             }
112
113             Console.ReadKey();//等待
114         }
115         #endregion
116
117         /// <summary>
118         /// A或B掷骰子的方法
119         /// </summary>
120         /// <param name="playerNumber">A掷骰子传0过来,B掷骰子传1过来</param>
121         static void Action(int playerNumber)
122         {
123             //playerNumber中存的就是当前玩家 姓名 坐标 是否暂停 这三个数组的下标
124             //1-playerNumber就是对方的 姓名 坐标 是否暂停 的下标
125             //当前0,对方1
126             //当前1,对方0
127
128             #region 掷骰子
129             Random r = new Random();//r是产生随机数用的
130             int step = 0;//用于存放临时产生的随机数
131             string msg = "";//用于存储用户踩到某关卡,输出的话
132             Console.WriteLine("{0}按任意键开始掷骰子......", names[playerNumber]);
133             //Console.ReadKey(true);//不显示输入的按键并等待
134             //step = r.Next(1, 7);//产生一个1-6之间的随机整数(掷骰子结果)
135             //取消上面的正常代码,改作弊代码:
136             ConsoleKeyInfo rec = Console.ReadKey(true);//ConsoleKeyInfo类似于类型(即int,string等等的类型),这里是ReadKey的类型,此行代码意思:把键盘动作赋值给rec
137             step = r.Next(1, 7);//产生一个1-6之间的随机整数(掷骰子结果)
138             if (rec.Key == ConsoleKey.Tab && rec.Modifiers == (ConsoleModifiers.Control | ConsoleModifiers.Shift))//如果键盘动作为组合键:Ctrl+Shift+Tab
139             {
140                 ConsoleKeyInfo cc = Console.ReadKey();//ConsoleKeyInfo类似于类型(即int,string等等的类型),这里是ReadKey的类型,此行代码意思:把键盘动作赋值给cc
141                 if (cc.Key == ConsoleKey.F1)//如果键盘动作为F1
142                 {
143                     step = ReadInt(1, 100);//选择1至100间的数为掷骰子结果
144                 }
145             }
146             else
147             {
148
149             }
150
151             Console.WriteLine("{0}掷出了:{1}", names[playerNumber], step);//输出当前玩家(names[playerNumber])掷骰子结果(随机数step)
152             Console.WriteLine("按任意键开始行动......");
153             Console.ReadKey(true);//不显示输入的按键并等待
154             playerPos[playerNumber] = playerPos[playerNumber] + step;//注意,一旦坐标发生改变,就要判断,坐标值是否>99或者<0
155             CheckPos();// 进行玩家A和玩家B坐标越界的判断
156
157             if (playerPos[0] == playerPos[1])//当前玩家踩到对方玩家
158             {
159                 playerPos[1-playerNumber] = 0;//对方玩家坐标归零
160                 msg = string.Format("{0}踩到了{1},{1}退回原点", names[playerNumber], names[1 - playerNumber]);//string.Format方法提供了不需即时输出又能实现占位符功能
161             }
162             else
163             {
164                 //没踩到,要判断当前玩家现在所在的位置是否有其他关卡
165                 switch (Map[playerPos[playerNumber]])
166                 {
167                     case 0:
168                         //普通,没有效果
169                         msg = "";
170                         break;
171                     case 1:
172                         //走到了幸运轮盘关卡
173                         Console.Clear();//清屏
174                         DrawMap();//绘制地图
175                         Console.WriteLine("{0}走到了幸运轮盘,请选择运气?", names[playerNumber]);
176                         Console.WriteLine("1--交换位置 2--轰炸对方");
177                         int userSelect = ReadInt(1, 2);
178                         if (userSelect == 1)//选择1,要与对方交换位置
179                         {
180                             int temp = playerPos[0];
181                             playerPos[0] = playerPos[1];
182                             playerPos[1] = temp;
183                             msg = string.Format("{0}选择了与对方交换位置!", names[playerNumber]);//string.Format方法提供了不需即时输出又能实现占位符功能
184                         }
185                         else//选择2,轰炸对方
186                         {
187                             playerPos[1 - playerNumber] = playerPos[1 - playerNumber] - 6;//对方玩家坐标退6格
188                             CheckPos();//检测退六格后有没有坐标越界,有则纠正
189                             msg = string.Format("{0}轰炸了{1},{1}退6格!", names[playerNumber], names[1 - playerNumber]);//string.Format方法提供了不需即时输出又能实现占位符功能
190                         }
191                         break;
192                     case 2:
193                         //踩到了地雷
194                         playerPos[playerNumber] = playerPos[playerNumber] - 6;//退六格
195                         CheckPos();//检测退六格后有没有坐标越界,有则纠正
196                         msg = string.Format("{0}踩到了地雷,退六格", names[playerNumber]);//string.Format方法提供了不需即时输出又能实现占位符功能
197                         break;
198                     case 3:
199                         //暂停一次
200                         isStop[playerNumber] = true;//赋值给isStop[playerNumber]为true,让下回合暂停
201                         msg = string.Format("{0}走到红灯,下次暂停一次!", names[playerNumber]);//string.Format方法提供了不需即时输出又能实现占位符功能
202                         break;
203                     case 4:
204                         //时空隧道
205                         playerPos[playerNumber] = playerPos[playerNumber] + 10;//前进10格
206                         CheckPos();//检测前进10格后有没有坐标越界,有则纠正
207                         msg = string.Format("{0}进入时空隧道,爽死了,进10步!", names[playerNumber]);//string.Format方法提供了不需即时输出又能实现占位符功能
208                         break;
209                 }
210             }
211
212             Console.Clear();//清屏
213             DrawMap();//绘制地图
214             if (msg != "")//如果msg不为空,则输出msg
215             {
216                 Console.WriteLine(msg);
217             }
218             Console.WriteLine("{0}掷出了{1},行动完成!", names[playerNumber], step);//step掷骰子结果
219             Console.WriteLine("****************玩家A和玩家B的位置如下****************");
220             Console.WriteLine("{0}的位置为:{1}", names[0], playerPos[0] + 1);
221             Console.WriteLine("{0}的位置为:{1}", names[1], playerPos[1] + 1);
222             Console.ReadKey();
223             #endregion
224         }
225
226         #region//绘制飞行棋的开头画面
227         /// <summary>
228         /// 用于绘制飞行棋的名称
229         /// </summary>
230         static void ShowUI()//显示游戏名称的方法
231         {
232             Console.WriteLine();
233             Console.WriteLine("******************************************");
234             Console.WriteLine("*                                        *");
235             Console.WriteLine("*         骑  士   飞   行  棋           *");
236             Console.WriteLine("*                                        *");
237             Console.WriteLine("******************************************");
238         }
239         #endregion
240
241         /// <summary>
242         /// 进行玩家A和玩家B坐标越界的判断
243         /// </summary>
244         static void CheckPos()//进行玩家A和玩家B坐标越界的判断
245         {
246             for (int i = 0; i <= 1; i++)
247             {
248                 if (playerPos[i] > 99)
249                 {
250                     playerPos[i] = 99;
251                 }
252                 if (playerPos[i] < 0)
253                 {
254                     playerPos[i] = 0;
255                 }
256             }
257         }
258
259         #region//对地图中的关卡进行初始化
260         /// <summary>
261         /// 对地图中的关卡进行初始化
262         /// </summary>
263         static void InitialMap()
264         {
265             //用于存储在地图中为地雷的下标
266             int[] luckyTurn = { 6, 23, 40, 55, 69, 83, 98 };//幸运轮盘1
267             int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷2
268             int[] pause = { 9, 27, 60, 93 };//暂停的坐标3
269             int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道※4
270
271             for (int i = 0; i < luckyTurn.Length; i++)//循环,从零开始/到luckyTurn的数组长度结束/每循环运行一次i增加1
272             {
273                 int pos = luckyTurn[i];//赋值给pos
274                 Map[pos] = 1;// 地图数组[下标]=1,把地雷的下标赋值给地图
275             }
276             for (int i = 0; i < landMine.Length; i++)//循环,从零开始/到landMine的数组长度结束/每循环运行一次i增加1
277             {
278                 Map[landMine[i]] = 2;//把地雷的下标赋值给地图
279             }
280             for (int i = 0; i < pause.Length; i++)//循环,从零开始/到pause的数组长度结束/每循环运行一次i增加1
281             {
282                 Map[pause[i]] = 3;//把暂停的下标赋值给地图
283             }
284             for (int i = 0; i < timeTunnel.Length; i++)//循环,从零开始/到timeTunnel的数组长度结束/每循环运行一次i增加1
285             {
286                 Map[timeTunnel[i]] = 4;//把时空隧道的下标赋值给地图
287             }
288         }
289         #endregion
290
291         /// <summary>
292         /// 获得第pos坐标上应该绘制的图案
293         /// </summary>
294         /// <param name="pos">要绘制的坐标</param>
295         /// <returns></returns>
296         static string GetMapString(int pos)//获得第pos坐标上应该绘制的图案 ps:DrawMap()方法需要用到该方法来判断并输出图案
297         {
298             string result = "";
299             //判断A和B是否在当前要画的第i格上,是则先绘制A和B的位置
300             if (playerPos[0] == pos && playerPos[1] == pos)
301             {
302                 Console.ForegroundColor = ConsoleColor.Yellow;//更改输出的字符颜色为黄色
303                 result = "<>";
304             }
305             else if (playerPos[0] == pos)//判断A在当前画的格上
306             {
307                 Console.ForegroundColor = ConsoleColor.Yellow;//更改输出的字符颜色为黄色
308                 result = "A";
309             }
310             else if (playerPos[1] == pos)//判断B在当前画的格上
311             {
312                 Console.ForegroundColor = ConsoleColor.Yellow;//更改输出的字符颜色为黄色
313                 result = "B";
314             }
315             else
316             {
317                 //绘制除开A和B位置的地图
318                 switch (Map[pos])//以外层循环到的地图格数为判定
319                 {
320                     case 0:
321                         Console.ForegroundColor = ConsoleColor.White;
322                         result = "□";//如果为0则绘制□,正常地图格
323                         break;//退出循环
324                     case 1:
325                         Console.ForegroundColor = ConsoleColor.Red;
326                         result = "◎";//如果为1则绘制◎,幸运轮盘
327                         break;//退出循环
328                     case 2:
329                         Console.ForegroundColor = ConsoleColor.Green;
330                         result = "☆";//如果为2则绘制☆,地雷
331                         break;//退出循环
332                     case 3:
333                         Console.ForegroundColor = ConsoleColor.Blue;
334                         result = "▲";//如果为3则绘制▲,暂停
335                         break;//退出循环
336                     case 4:
337                         Console.ForegroundColor = ConsoleColor.Magenta;
338                         result = "※";//如果为4则绘制※,时空隧道
339                         break;//退出循环
340                 }
341             }
342             return result;
343         }
344
345         static void DrawMap()
346         {
347             Console.WriteLine("图例: 幸运轮盘:◎  地雷:☆  暂停:▲  时空隧道:※");
348             //画第一行 绘制下标从0-29格的地图
349             for (int i = 0; i <= 29; i++)
350             {
351                 //判断A和B是否在当前要画的第i格上,是则先绘制A和B的位置
352                 Console.Write(GetMapString(i));
353             }
354             //绘制第一行完毕
355             Console.Write("\n");//换行
356             //绘制第一列
357             for (int i = 30; i <= 34; i++)
358             {
359                 //绘制29个双空格
360                 for (int j = 0; j < 29; j++)
361                 {
362                     Console.Write("  ");
363                 }
364                 Console.WriteLine(GetMapString(i));
365             }
366             //绘制第二行
367             for (int i = 64; i >= 35; i--)
368             {
369                 Console.Write(GetMapString(i));
370             }
371             Console.Write("\n");//换行
372             //绘制第二列
373             for (int i = 65; i <= 69; i++)
374             {
375                 Console.WriteLine(GetMapString(i));
376             }
377             //绘制第三行
378             for (int i = 70; i <= 99; i++)
379             {
380                 Console.Write(GetMapString(i));
381             }
382             Console.WriteLine();
383             Console.ResetColor();
384         }
385
386         #region//产生随机数方法???判断是否为一或者二的整数
387         static int ReadInt()//产生一个整数
388         {
389             int i = ReadInt(int.MaxValue, int.MinValue);
390             return i;
391         }
392
393         static int ReadInt(int min, int max)//产生min--max 之间的数
394         {
395             while (true)
396             {
397                 try
398                 {
399                     int number = Convert.ToInt32(Console.ReadLine());
400                     if (number < min || number > max)
401                     {
402                         Console.WriteLine("只能输入{0}--{1}之间的数字,请重新输入", min, max);
403                         continue;//跳出本次循环,继续下次循环
404                     }
405                     return number;//退出循环,并返回number值
406                 }
407                 catch
408                 {
409                     Console.WriteLine("只能输入数字,请重新输入!");
410                 }
411             }
412         }
413         #endregion
414
415     }
416 }
时间: 2024-10-14 08:58:56

骑士飞行棋第二版(已完善)的相关文章

骑士飞行棋第三版(上色)

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 骑士飞行棋 8 { 9 class Program 10 { 11 12 //在下面的数组存储我们游戏地图各个关卡 13 //数组的小标为0的元素对应地图上的第一格 下标为1的元素对应第二格...下标为n的元素对应n+1

骑士飞行棋第一版(掷骰子方法分开)

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 骑士飞行棋 8 { 9 class Program 10 { 11 12 //在下面的数组存储我们游戏地图各个关卡 13 //数组的小标为0的元素对应地图上的第一格 下标为1的元素对应第二格...下标为n的元素对应n+1

飞行棋2.0--输完姓名后全自动,可修改为人机交互模式

1 // 2 // main.m 3 4 #import <Foundation/Foundation.h> 5 #import "GameController.h" 6 int main(int argc, const char * argv[]) 7 { 8 GameController *ctl = [GameController new]; 9 [ctl startGame]; 10 11 // GameMap *map = [GameMap new]; 12 //

纠正飞行棋的错误

错误1:在运行暂停功能时,这个暂停功能可以实现,但无法显示提示信息. 改正如下: case 3: Console.Clear(); Program.drawmap(); isstop[0] = true; Console .WriteLine ("{0}走到了暂停,暂停一次!", name[0]); Console.WriteLine("按任意键继续...");  Console.ReadKey(true); 原因:缺少Console.WriteLine("

编写一个飞行棋项目(C#)遇到几个问题:

在写程序中遇到如下问题:如果有人知道,请您一定要指点迷津.小白. 1.在运行暂停功能时,这个暂停功能可以实现,但是无法显示提示信息. case 3: Console.Clear(); Program.drawmap(); isstop[0] = true; msg = string.Format("{0}走到了地雷,暂停一次!", name[0]); break; 2.下面这行代码没有效果:(我换了一下console.clear()的位置不行,但去掉可以实现,但是也没有清屏了.) Co

局域网多人对战飞行棋的实现

在项目之间有段“空项期”,上个项目刚刚完成,下个项目还没落实,时间比较充裕.去年9月份就经历了这么一次短暂的“空项期”,那时偶还是一名前端工作者,C#使用起来毫不含糊,还自己整过一个类SCSF的MVP框架AngelFrame(详见之前博客:http://www.cnblogs.com/wgp13x/p/99c2adc52d8f0dff30a038841ac32872.html).在那段“空项期”之前,有位朋友托我做个小游戏,偶也满口的答应,只可惜之前项目太忙没时间做,就一直耽搁了,正好有这段“空

写在《精通比特币》第二版发行之际

一.翻译<精通比特币第二版>的起因 作为一名老IT技术,我自信还是能够抱着非常开放的心态对待新技术新概念的.这从我的技术职业生涯从网络开始,到AIX操作系统,再到数据库以及存储备份,虚拟化,到后期熟悉SEO,网络运营,直到独立运营聚众培训视频网可以得到佐证. 但是不知不觉,技术的发展已经逐渐演变为对三观的触动,质疑甚至是改变的时候,我觉得自己还是像大多数人一样保守. 因为我们从小接受的教育就是把命运寄托给别人,忠实于自己已经选择的道路,不要冒险,听命于制定规则的人. 其实当颠覆性创新来临时,一

python基础学习05(核心编程第二版)部分

# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = 'Administrator' #dict{键:值} #哈希 #注:字典是无顺序的,所以你懂的 #创建与赋值 dict1={} dict2={'name':'apply','avg':24,'sex':'man'} print dict1,dict2

C语言实现词频统计——第二版

原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 2.支持命令行输入英文作品的文件名 3. 支持命令行输入存储有英文作品文件的目录名,批量统计 4. 从控制台读入英文单篇作品,重定向输出 代码实现: 在原代码的基础上稍做了修改,使之可以批量读取文件夹下的所有文件,所以加了一个mode来判断是单个文件输入还是文件夹输入,来不及整理程序,所以现在程序有点丑.这次