骑士飞行棋

一个棋牌类小游戏

先写一个地图类:

public class Map {
    int[] map = new int[100];   //对战地图
    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};   //时空隧道

     
     /**
       * 生成地图: 
       * 关卡代号为:1:幸运轮盘 2:地雷  3: 暂停 4:时空隧道 0:普通
       */
    public void createMap(){
          int i = 0; 
          
          //在对战地图上设置幸运轮盘
          for(i = 0; i < luckyTurn.length; i++){
              map[luckyTurn[i]] = 1; 
          } 
        //添加代码实现在对战地图上设置地雷
          for(i = 0; i < landMine.length; i++)
              map[landMine[i]] = 2;
          
          //添加代码实现在对战地图上设置暂停
          for(i = 0; i < pause.length; i++)
            map[pause[i]] = 3;
   
          //添加代码实现在对战地图上设置时空隧道
          for(i = 0; i < timeTunnel.length; i++)
            map[timeTunnel[i]] = 4;

    }
    
    /**
     * 显示地图关卡对应的图形
     * @param i 地图当前位置的关卡代号
     * @param index 当前地图位置编号
     * @param playerPos1 玩家1的当前位置
     * @param playerPos2 玩家2的当前位置
     * @return 地图当前位置的对应图片
     */
    public String getGraph(int i, int index, int playerPos1, int playerPos2){
        String graph = "";
        
        //添加代码
        if(playerPos1 == index && playerPos2 == index)
            graph = "@@";
        else if(playerPos1 == index)
            graph = "A";
        else if(playerPos2 == index)
            graph = "B";
        else{
            switch(i){
            case 1: graph = "¤"; break;
            case 2: graph = "★"; break;
            case 3: graph = "■"; break;
            case 4: graph = "〓"; break;
            default : graph = "∷"; break;
            }
        }
        
        return graph;
    }
    
    /**
     * 输出地图的奇数行(第1、3行)
     * @param start 输出的起始点在地图上的位置
     * @param end  输出的结束点在地图上的位置
     * @param playerPos1 玩家1的当前位置
     * @param playerPos2 玩家2的当前位置
     */
    public void showLine1(int start, int end, int playerPos1, int playerPos2){     
        //添加代码
        for(int i = start; i < end; i++)
            System.out.print(getGraph(map[i], i, playerPos1, playerPos2));
    }
    
    /**
     * 输出地图的偶数行(第2行)
     * @param start 输出的起始点在地图上的位置
     * @param end  输出的结束点在地图上的位置
     * @param playerPos1 玩家1的当前位置
     * @param playerPos2 玩家2的当前位置
     */
    public void showLine2(int start, int end, int playerPos1, int playerPos2){    
        for(int i = end-1; i >= start; i-- ){    
            System.out.print(getGraph(map[i], i,playerPos1, playerPos2));
        }
    }
    
    /**
     * 输出地图的右竖列
     * @param start 输出的起始点在地图上的位置
     * @param end  输出的结束点在地图上的位置
     * @param playerPos1 玩家1的当前位置
     * @param playerPos2 玩家2的当前位置
     */
    public void showRLine(int start, int end, int playerPos1, int playerPos2){
        for(int i = start; i< end; i++){
           for(int j = 29; j > 0; j--){  //输出29个空格
               System.out.print("     ");
           }
           System.out.print(getGraph(map[i], i,playerPos1, playerPos2));
           System.out.println();
        }
    }
    
    /**
     * 输出地图的左竖列
     * @param start 输出的起始点在地图上的位置
     * @param end  输出的结束点在地图上的位置
     * @param playerPos1 玩家1的当前位置
     * @param playerPos2 玩家2的当前位置
     */
    public void showLLine(int start, int end, int playerPos1, int playerPos2){
        //添加代码
        for(int i = start; i < end; i++){
            System.out.print(getGraph(map[i], i, playerPos1, playerPos2));
            System.out.println();
        }            
    }

    /**
     * 显示对战地图
     * @param playerPos1 玩家1的当前位置
     * @param playerPos2 玩家2的当前位置
     */
    public void showMap(int playerPos1, int playerPos2){
        //显示地图第一行
        showLine1(0, 31, playerPos1, playerPos2);
        //换行
        System.out.println();
        //显示地图右竖行
        showRLine(31, 35, playerPos1, playerPos2);
        //显示地图第二行
        showLine2(35, 66, playerPos1, playerPos2);
        //换行
        System.out.println();
        //显示地图左竖行
        showLLine(66, 69, playerPos1, playerPos2);
        //显示地图第3行
        showLine1(69, 100, playerPos1, playerPos2);
    }  
}

接下来是游戏类:

import java.util.*;
public class Game {
      //声明地图
    Map map;
    
      //声明对战中玩家1的当前位置
    int playerPos1;
    
      //声明对战中玩家2的当前位置
    int playerPos2;
     
      //声明走或停标识设置
    String[] goAndStop = new String[2];
      
      //声明对战角色
    String[] playerName = new String[2];
      
      /**
       * 初始化游戏的一局
       */
      public void init(){   
           //创建Map对象
          map = new Map();
          
           //生成地图
          map.createMap();
          
           //设置玩家1起始位置
          playerPos1 = 0;
          
           //设置玩家2起始位置
          playerPos2 = 0;
          
           //记录玩家1下一次走或停
          goAndStop[0] = "on"; 
          
           //设置玩家2下一次走或停
          goAndStop[1] = "on";
      }
      
      
      /**
       * 开始游戏
       */
      public void start(){
          //调用初始化方法
          init();

         //显示游戏界面
          System.out.print("※※※※※※※※※※※※※※※※※※※※※※※※※\n");
          System.out.println("//                                             //");
          System.out.println("//                                             //");
          System.out.println("//         骑      士      飞       行       棋                                             //");
          System.out.println("//                                             //");
          System.out.println("//                                             //");
          System.out.print("※※※※※※※※※※※※※※※※※※※※※※※※※\n");
          System.out.println();
          System.out.println();
          System.out.println();
          System.out.println("~~~~~~~~~~~~~~~~~~两    人    对    战~~~~~~~~~~~~~~~~~~~");
          System.out.println();
          System.out.println("请选择角色: 1. 戴高乐    2. 艾森豪威尔    3. 麦克阿瑟    4. 巴顿");
          

          //角色设置
          System.out.print("请玩家1选择角色:");
          Scanner input = new Scanner(System.in);
          int role1 = input.nextInt();
          int role2;
          do{
              System.out.print("请玩家2选择角色:");
              role2 = input.nextInt();
          }while(role1 == role2);
          setRole(1, role1);
          setRole(2, role2);
          
          //开始游戏
          play();
      }
      
      /**
       * 设置对战角色
       * @param no 玩家次序 1:玩家1 2:玩家2
       * @param role 角色代号
       */
      public void setRole(int no, int role){
          switch(role){
              case 1: 
                  playerName[no-1] = "戴高乐";
                  break;
              case 2: 
                  //设置玩家名称为"艾森豪威尔"
                  playerName[no-1] = "艾森豪威尔";
                  
              case 3:
                  //设置玩家名称为"麦克阿瑟"
                  playerName[no-1] = "麦克阿瑟";
                  
              case 4: 
                  //设置玩家名称为"巴顿"
                  playerName[no-1] = "巴顿";

              default: 
                  break;
          }
      }
      
      
      /**
       * 两人对战玩法
       */
      public void play(){      
          System.out.println("\n\n\n\n");
          
          System.out.print("\n\n****************************************************\n");
          System.out.print("                     Game  Start                    \n");
          System.out.print("****************************************************\n\n");
          
          //显示对战双方士兵样式
          System.out.println("^_^" + playerName[0] + "的士兵: A");
          System.out.println("^_^" + playerName[1] + "的士兵:  B\n");
          
          //显示对战地图
          System.out.println("\n图例: " + "■ 暂停  ¤ 幸运轮盘   ★ 地雷   〓 时空隧道   ∷ 普通\n");
          
          map.showMap(playerPos1, playerPos2);
          
          
          //游戏开始
          int step;  //存储骰子数目
          while(playerPos1 < 99 && playerPos2 < 99){    //有任何一方走到终点,跳出循环 
              
              //轮流掷骰子
              if(goAndStop[0].equals("on")){    
                  //玩家1掷骰子
                  step = throwShifter(1);   //掷骰子
                  System.out.println("\n-----------------");  //显示结果信息
                  System.out.println("骰子数: "+ step);
                  playerPos1 = getCurPos(1, playerPos1, step);   //计算这一次移动后的当前位置
                  System.out.println("\n您当前位置:  "+ playerPos1);
                  System.out.println("对方当前位置:"+ playerPos2);
                  System.out.println("-----------------\n");
                  map.showMap(playerPos1, playerPos2); //显示当前地图
                  if(playerPos1 == 99){  //如果走到终点
                      break;   //退出
                  }
              }else{
                  System.out.println("\n" + playerName[0] +"停掷一次!\n");   //显示此次暂停信息
                  goAndStop[0] = "on";   //设置下次可掷状态 
              }

              
              System.out.println("\n\n\n\n");
              
              if(goAndStop[1].equals("on")){
                  //玩家2掷骰子
                  step = throwShifter(2); //掷骰子
                  System.out.println("\n-----------------"); //显示结果信息
                  System.out.println("骰子数: "+ step);
                  playerPos2 = getCurPos(2, playerPos2, step);   //计算这一次移动后的当前位置
                  System.out.println("\n您当前位置:  "+ playerPos2);
                  System.out.println("对方当前位置:"+ playerPos1);
                  System.out.println("-----------------\n");
                  map.showMap(playerPos1, playerPos2);
                  if(playerPos2 == 99){  //如果走到终点
                      break;   //退出
                  }
              }else{
                  System.out.println("\n" + playerName[1] + "停掷一次!\n");  //显示此次暂停信息
                  goAndStop[1] = "on";  //设置下次可掷状态 
              }
 
              System.out.println("\n\n\n\n");
          } 
          
          //游戏结束
          System.out.println("\n\n\n\n");
          System.out.print("****************************************************\n");
          System.out.print("                      Game  Over                    \n");
          System.out.print("****************************************************\n\n");
          judge();
      }
      
      
      /**
       * 掷骰子
       * @param no 玩家次序
       * @return step 掷出的骰子数目
       */
      public int throwShifter(int no){
          //定义变量存储骰子数目
          int step = 0;
          
          //提示玩家启动掷骰子
          System.out.print("请输入任意key并回车开始掷骰子:");
          Scanner input = new Scanner(System.in);
          input.next();

          //模拟掷骰子:产生一个1~6的数字作为玩家掷的骰子数目
          step = (int)(Math.random()*10) % 6 + 1;
          
          return step; 
      }
      

      
      /**
       * 计算玩家此次移动后的当前位置
       * @param no 玩家次序
       * @param position 移动前位置
       * @param step 掷的骰子数目
       * @return position 移动后的位置
       */
      public int getCurPos(int no, int position, int step){
          position = position + step;  //第一次移动后的位置
          if(position >= 99){
              return 99;
          }
          Scanner input = new Scanner(System.in);
          switch(map.map[position]){   //根据地图中的关卡代号进行判断
             case 0:    //走到普通格
                 if(no == 1 && position == playerPos2){   //添加条件:玩家1与对方骑兵相遇
                    //添加代码实现:踩到对方,对方回到起点
                         playerPos2 = 0;
                     System.out.println(":-D  哈哈哈哈...踩到了!");
                 } 
                 if (no == 2 && position == playerPos1){ //添加条件:玩家2与对方骑兵相遇
                     //添加代码实现:踩到对方,对方回到起点
                     playerPos1 = 0;
                     System.out.println(":-D  哈哈哈哈...踩到了!");
                 }
                 break;
             case 1:   //幸运轮盘
                 System.out.println("\n◆◇◆◇◆欢迎进入幸运轮盘◆◇◆◇◆");
                 System.out.println("   请选择一种运气:");
                 System.out.println("   1. 交换位置  2. 轰炸");
                 System.out.println("=============================\n");
                 int choice  = input.nextInt();
                 int temp; //交换时的临时变量
                 switch(choice){
                     case 1:  //交换位置 
                         if(no == 1){
                             //添加代码实现交换:position与playerPos2数值互换
                             temp = playerPos2;
                             playerPos2 = position;
                             position = temp;
                         }else if(no == 2){
                             //添加代码实现交换:position与playPos1数值互换
                             temp = playerPos1;
                             playerPos1 = position;
                             position = temp;
                         }
                         break;
                     case 2:   //轰炸
                         if(no==1 && playerPos2<6){ //no为1并且玩家2位置小于6
                             //添加代码实现:计算玩家2当前位置
                             playerPos2 = 0;
                         }else{
                             //添加代码实现:计算玩家2当前位置
                             playerPos2 -= 6;
                         }
                         if(no==1 && playerPos1<6){   //no为2并且玩家1位置小于6
                             //添加代码实现: 计算玩家1当前位置
                             playerPos1 = 0;
                         }else{
                             //添加代码实现:计算玩家1当前位置
                             playerPos1 -= 6;
                         }
                         break;
                 }
                 break;
            case 2:   //踩到地雷
                //添加代码实现:踩到地雷退6步
                position -= 6;
                System.out.println("~:-(  " + "踩到地雷,气死了...");
                break;
            case 3:  //下一次暂停一次
                //添加代码实现:设置下次暂停掷骰子
                goAndStop[no-1] = "off";
                System.out.println("~~>_<~~  要停战一局了。");
                break;
            case 4:   //时空隧道
                //添加代码实现:进入时空隧道,加走10步
                position += 10;
                System.out.println("|-P  " + "进入时空隧道, 真爽!");
                break;
          }
          
          //返回此次掷骰子后玩家的位置坐标      
          if(position < 0){
              return 0;
          }else if(position > 99){
              return 99;
          }else{
              return position; 
          }
      }
      
      /**
       * 显示对战结果
       */
      public void judge(){
          //添加代码
          if(playerPos1 > playerPos2)
              System.out.println("恭喜!玩家" + playerName[0] + "胜利!");
          else
              System.out.println("恭喜!玩家" + playerName[0] + "胜利!");
      }
}

然后写一个启动游戏的类:

public class StartGame {

    /**
     * 启动游戏
     * @param args
     */
    public static void main(String[] args) {
        Game game = new Game();   //创建游戏类
          game.start();             //开始游戏
    }
}
原文地址:https://www.cnblogs.com/tangzhengyue/p/2612664.html