飞行棋源代码

本文分享了飞行棋游戏的源代码实现,涉及图形界面设计、棋盘逻辑处理、玩家输入处理及单元测试等内容。通过阅读,读者可以了解如何运用graph、string和class等技术来构建一个完整的游戏程序。

 

Game类

 

package s1java.xmal1;
import java.util.*;
public class Game {
   Map map;  //地图
   int playerPos1; //对战中玩家1的当前位置
   int playerPos2; //对战中玩家2的当前位置
   String[] goAndStop = new String[2];   //走或停标识设置
   String[] playerName = new String[2];  //对战角色
  
   /**
    * 初始化游戏的一局
    */
   public void init(){  
     map = new Map();
     map.createMap();  //生成地图
        playerPos1 = 0;   //设置玩家1起始位置
        playerPos2 = 0;   //设置玩家2起始位置
        goAndStop[0] = "on";  //记录玩家1下一次走或停
        goAndStop[1] = "on";  //设置玩家2下一次走或停
   }
     
  
   /**
    * 开始游戏
    */
      public void start(){
          //初始化
          init(); 
       System.out.println("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
       System.out.println("//                                                //");
       System.out.println("//                                                //");
       System.out.println("//             骑    士    飞    行    棋               //");
       System.out.println("//                                                //");
       System.out.println("//                                                //");
       System.out.println("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※/n/n/n");
      
      
       System.out.println("/n~~~~~~~~~~~~~~~~~~~两  人  对  战~~~~~~~~~~~~~~~~~~~");
       System.out.println("/n请选择角色: 1. 戴高乐 2. 艾森豪威尔 3. 麦克阿瑟 4. 巴顿");
       Scanner input = new Scanner(System.in);
       System.out.print("请玩家1选择角色:  ");
       int role1 = input.nextInt();
          int role2;
          do{
           System.out.print("请玩家2选择角色: ");
            role2 = input.nextInt();  //双方选择角色代号
        }while(role2==role1);  //不允许角色重复
          setRole(1, role1);   //设置玩家1代表的角色
          setRole(2, role2);   //设置玩家2代表的角色    
          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] = "艾森豪威尔";
         break;
        case 3:
         playerName[no-1] = "麦克阿瑟";
         break;
        case 4:
         playerName[no-1] = "巴顿";
         break;
        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("/n/n" + playerName[no-1] + ", 请您按任意字母键后回车启动掷骰子: ");
       Scanner input = new Scanner(System.in);
       String answer = input.next();
          step = (int)(Math.random()*10) % 6 + 1;   //产生一个1~6的数字,即掷的骰子数目
       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 && playerPos2 == position){   //玩家1与对方骑兵相遇
            playerPos2 = 0;    //踩到对方,对方回到起点
            System.out.println(":-D  哈哈哈哈...踩到了!");
           }
           if (no == 2 && playerPos1 == position){ //玩家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){
                 temp = position;
                    position = playerPos2;
                    playerPos2 = temp;
                }else if(no == 2){
                 temp = position;
                    position = playerPos1;
                    playerPos1 = temp;
                }
                break;
               case 2:
                if(no == 1 && playerPos2 < 6){
                 playerPos2 = 0;
                }else{
                 playerPos2 = playerPos2 - 6;
                }
                if(no == 2 && playerPos2 < 6){
                 playerPos1 = 0;
                }else{
                 playerPos1 = playerPos1 - 6;
                }
                break;
           }
           //System.out.println(":~)  " + "幸福的我都要哭了...");
           break;
         case 2:   //踩到地雷
          position = position -6; //踩到地雷退6步
          System.out.println("~:-(  " + "踩到地雷,气死了...");
          break;
         case 3:  //下一次暂停一次
          goAndStop[no-1] = "off";  //设置下次暂停掷骰子
          System.out.println("~~>_<~~  要停战一局了。");
          break;
         case 4:   //时空隧道
             position = position + 10;  //进入时空隧道,加走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("/n恭喜" + playerName[0] + "将军! 您获胜了!");
       }else{
        System.out.println("/n恭喜" + playerName[1] + "将军! 您获胜了!");
       }
      }
}

Map类

package s1java.xmal1;

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(index == playerPos1 && index== playerPos2){
      graph = "@@";
     }else if(index == playerPos1){ 
         //graph = "♀";
      graph = "A";
        }else if(index == playerPos2){
         //graph = "♂";
         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 = 28; 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.println(getGraph(map[i], i,playerPos1, playerPos2));
     }
    }

    /**
     * 显示对战地图
     * @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); //显示地图左竖行
        showLine2(69, 100, playerPos1, playerPos2); //显示地图第3行
    } 
}

 

 

开始游戏

package s1java.xmal1;

public class StartGame {

 /**
  * 启动游戏
  * @param args
  */
 public static void main(String[] args) {
  Game game = new Game();   //创建游戏类
       game.start();             //开始游戏
 }
}

 

测试类

 

package s1java.xmal1;

public class Test {

 /**
  * 测试Map类
  * @param args
  */
 public static void main(String[] args) {
  Map map = new Map();
  map.createMap();
  map.showMap(0,0);
 }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值