骑士飞行棋 - C#基础 练习项目


    一开始看骑士飞行棋演示,在心里想,这个游戏怎么做啊,应该很难吧, 还是在这之前把前面的基础视频学好吧,经过几天的学习,终于开始学这个小游戏项目了,
教程学到一半,回家了,上不了网,也没有笔记本带回家,中间就停了,昨天回来,接着学,到现在终于学完了,看完老师的视频,自己然后按老师说的,一点一点 做,输入 代码,中间有错误,再按老师的方法,一点一点的调式,居然出来的都是正确的,很高兴,
    原来游戏就是这样做的啊,经过老师的分解,讲解,整个游戏的过程,在脑子中,很清楚的显示出来,特别是调式方法,变量在调试中还可以手动更改,以前遇到问题不知道从何处下手,经常这个小项目的学习,对.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("只能输入数字,请重新输入。");
                }
            }

        }
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
特点介绍:大量运用指针,结构等C语言的特色,使用OO思想编写代码. ------------------1.对战模式------------------ 1.本游戏用C语言实现,模仿大富翁4,与电脑玩家在地图上循环行走购买房屋,以一方金钱耗尽为结束 2.玩家在游戏开始时可以设置对战的难度,不同的难度初始金钱、点卷、电脑AI等都是不同的,详情请参看[难度说明] 3.在游戏过程中可以使用道具来限制对方发展或增强自己的发展,详情请参看[道具详解] 4.在地图中有许多特殊关卡,当行走到这些关卡上的时候会触发相应的事件,详情请参看[关卡详解] 5.由于开发过程比较仓促且对C语言的很多特性还不够了解,也许游戏中还有很多BUG,尽请见谅! ------------------2.难度说明------------------ 1.买和使用任何道具,不会进行股票交易,初始金钱为20万,初始点卷为100点 2.普通难度:电脑玩家会购买和使用除了核子飞弹以外的所有道具,每五轮会利用较少比例金钱进行股票交易,初始金钱为10万,初始点卷为50点 3.困难难度:电脑玩家会购买和使用所有道具,每三轮会利用较多比例金钱进行股票交易,初始金钱为5万,初始点卷为0点 ------------------3.道具详解------------------ 1.购地卡:需要点卷10点,如果玩家当前位置是对方的地,使用此卡则可以强行购买,并支付给对方2000元购地费 2.遥控骰子:需要点卷10点,使用后可以选择1-6步的行走步数 3.请神符:需要点卷10点,使用后会在以当前位置为中心,左右各3步的范围搜索最近的神灵,并让其附身 4.送神符:需要点卷8点,清楚当前附身的任何神灵附身状态 5.核子飞弹:需要点卷100点,选择轰炸目的地后,会摧毁以该位置为中心,左右各3步范围的房屋、关卡,并让此范围内的所有玩家暂停3回合 ------------------4.关卡详解------------------ 1.∷ 普通关卡:可任意行走的关卡 2.※ 暂停关卡:若玩家行走到该关卡上会暂停一回合 3.★ 地雷关卡:若玩家行走到该关卡上会暂停一回合,并将当前位置的房屋炸掉,成为空地 4.⊙ 幸运轮盘:若玩家行走到该关卡上可以选择与对方交换位置或轰炸对方(效果同 地雷关卡) 5.¥ 幸运点卷:随机获得5-20个点卷 6.〓 时空隧道:加走(1-6)步,效果与遥控骰子相同 7.@ 神秘商店:进入后可购买道具 8.X 小衰神:附身后立即随机损失500-1000金币,走到对方地盘加倍罚款,附身3回合 9.Z 大衰神:附身后立即随机损失1000-2000金币,走到对方地盘加倍罚款,无法购买房屋,附身5回合 10.◇ 小福神:附身后立即随机获得500-1000金币,走到对方地盘免费,附身3回合 11.◆ 大福神:附身后立即随机获得1000-2000金币,走到对方地盘免费,免费买地,附身5回合 12.◎ 空地:可以被玩家购买的地 13.① 玩家的地:玩家自己的地,电脑踩上后会支付玩家500元 14.② 电脑的地:电脑玩家的地,玩家踩上后会支付电脑500元 15.A 玩家位置:玩家当前位置坐标 16.B 电脑位置:电脑当前位置坐标 ------------------5.股票系统------------------ 1.玩家在游戏中可投资股票来提升自己的金钱 2.每种股票根据基价的不同会有不同的成长率 3.每开始一轮新回合,所有股票的价值都会随机变化 4.股票的状态:上涨(状态用\"↑\"表示),下跌(状态用\"↓\"表示),涨停(状态用\"▲\"表示),跌停(状态用\"▼\"表示)") 5.任何股票连续两轮上涨会进入涨停状态,处于涨停状态的股票不能买入 6.任何股票连续两轮下跌会进入跌停状态,处于跌停状态的股票不能卖出 7.可以通过观察股票价格曲线图来帮助判断该股价格的走向,该曲线图描述的是近30个回合的股票价格走向
以下是一个简单的Java骑士飞行源码示例,供参考: ```java import java.util.Scanner; public class KnightFlyingChess{ public static void main(String[] args){ System.out.println("欢迎来到骑士飞行游戏!"); // 初始化盘 int[][] board = new int[8][8]; for(int i = 0; i < 8; i++){ for(int j = 0; j < 8; j++){ board[i][j] = -1; } } // 初始化骑士的位置 int x = 0; int y = 0; board[x][y] = 0; // 开始游戏 Scanner scanner = new Scanner(System.in); while(true){ // 打印盘 for(int i = 0; i < 8; i++){ for(int j = 0; j < 8; j++){ System.out.print(board[i][j] + "\t"); } System.out.println(); } // 获取玩家输入 System.out.println("请输入行动方向(1-8):"); int direction = scanner.nextInt(); // 根据方向移动骑士 switch (direction) { case 1: x += 1; y -= 2; break; case 2: x += 2; y -= 1; break; case 3: x += 2; y += 1; break; case 4: x += 1; y += 2; break; case 5: x -= 1; y += 2; break; case 6: x -= 2; y += 1; break; case 7: x -= 2; y -= 1; break; case 8: x -= 1; y -= 2; break; default: break; } // 判断骑士是否越界 if(x < 0 || x > 7 || y < 0 || y > 7){ System.out.println("骑士越界了,游戏结束!"); break; } // 判断骑士是否到达终点 if(board[x][y] == 99){ System.out.println("骑士到达终点,游戏胜利!"); break; } // 判断骑士是否经过之前的位置 if(board[x][y] != -1){ System.out.println("骑士经过之前的位置,游戏结束!"); break; } // 在盘上标记骑士的位置 board[x][y] = board[x][y] + 1; } } } ``` 这只是一个简单的示例,骑士飞行游戏还有很多其他的规则和玩法,你可以根据自己的需求进行扩展和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值