我的Java阶段项目1 - 骑士飞行棋[两人对战][固定地图版]

来源:互联网 发布:威力导演软件 编辑:程序博客网 时间:2024/05/05 04:11
package s1java.xmal1;/** * S1T037阶段项目1 - 骑士飞行棋[固定地图版] * 启动游戏类(StartGame) * @author 邓超 * @version 0.1 2008/5/4 * 开发/测试环境:JDK 1.6 + Eclipse 3.3.2 */public class StartGame {/** * 启动游戏 * @param args */public static void main(String[] args) {Game game = new Game();   //创建游戏类game.start();             //开始游戏}}
 
 
package s1java.xmal1;/** * S1T037阶段项目1 - 骑士飞行棋[固定地图版] * 地图类(Map) * @author 邓超 * @version 0.1 2008/5/4 * 开发/测试环境:JDK 1.6 + Eclipse 3.3.2 */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 = "A";    }else if(index == playerPos2){    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--){  //输出28个(对)空格    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, 34, playerPos1, playerPos2);     //显示地图右竖行    showLine2(35, 66, playerPos1, playerPos2);     //显示地图第二行    System.out.println();                          //换行    showLLine(66, 68, playerPos1, playerPos2);     //显示地图左竖行    showLine1(69, 100, playerPos1, playerPos2);    //显示地图第三行    }  }
 
 
 
 
 
 
package s1java.xmal1;/** * S1T037阶段项目1 - 骑士飞行棋[固定地图版] * 游戏类(Game) * @author 邓超 * @version 0.1 2008/5/4 * 开发/测试环境:JDK 1.6 + Eclipse 3.3.2 */import java.util.Scanner;                 //导入Scanner类public class Game {    Map 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下一次走或停    }          /**     * 设置对战角色     * @param no 玩家次序 1:玩家1 2:玩家2     * @param role 角色代号为:1:戴高乐  2:艾森豪威尔  3:麦克阿瑟  4:巴顿  其它选择:匿名玩家     */    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;    }    }        /**     * 开始游戏     */      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);          String role1;          do {          System.out.print("请玩家1选择角色:  ");          role1 = input.next();  //玩家1选择角色代号          /*只能选择1~4的角色编号*/          } while (!role1.equals("1") && !role1.equals("2") && !role1.equals("3") && !role1.equals("4"));          String role2;          do{          System.out.print("请玩家2选择角色: ");          role2 = input.next();  //玩家2选择角色代号          /*不允许角色重复,且只能选择1~4的角色编号*/          } while (role2.equals(role1) || !role2.equals("1") && !role2.equals("2") && !role2.equals("3") && !role2.equals("4"));          setRole(1, Integer.parseInt(role1));    //设置玩家1代表的角色          setRole(2, Integer.parseInt(role2));    //设置玩家2代表的角色               play();                                 //开始两人对战      }            /**       * 两人对战玩法        */      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 + 1));                System.out.println("对方当前位置:"+ (playerPos2 + 1));                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 + 1));              System.out.println("对方当前位置:"+ (playerPos1 + 1));              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);      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 && playerPos2 == position){ //玩家1与对方骑兵相遇      playerPos2 = 0;                       //踩到对方,对方回到起点      System.out.println(":-D  哈哈哈哈...踩到了!");      }       if (no == 2 && playerPos1 == position){ //玩家2与对方骑兵相遇      playerPos1 = 0;                       //踩到对方,对方回到起点      System.out.println(":-D  哈哈哈哈...踩到了!");      }      break;      case 1:                                   //幸运轮盘      char choice;                          //接收玩家选择      do {      System.out.println("/n◆◇◆◇◆欢迎进入幸运轮盘◆◇◆◇◆");          System.out.println("   请选择一种运气:");          System.out.println("   1. 交换位置  2. 轰炸");          System.out.println("=============================/n");          choice  = input.next().charAt(0);      } while (choice != '1' && choice != '2');          int temp;                             //交换时的临时变量          switch(choice){          case '1':                             //交换位置          if(no == 1){                      //position与playerPos2数值互换          temp = position;          position = playerPos2;          playerPos2 = temp;           }else if(no == 2){                //position与playerPos1数值互换          temp = position;          position = playerPos1;          playerPos1 = temp;          }          break;          case '2':                             //轰炸          //计算玩家2当前位置          if(no == 1 && playerPos2 < 6){          playerPos2 = 0;          }else{          playerPos2 = playerPos2 - 6;          }          if(no == 2 && playerPos2 < 6){          playerPos1 = 0;          }else{          playerPos1 = playerPos1 - 6;          }          break;          }          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] + "将军! 您获胜了!");      }      }}