import java.util.Scanner;
//游戏类
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.println("~~~~~~~~~~~~~~~~~~~~~~~~~两 人 对 战~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println("请选择角色:1.A 2.B ");
Scanner input = new Scanner(System.in);
String role1;
do {
System.out.print("请玩家1选择角色: ");
role1 = input.next(); //玩家1选择角色代号
} while (!role1.equals("1") && !role1.equals("2") );
String role2;
do{
System.out.print("请玩家2选择角色: ");
role2 = input.next(); //玩家2选择角色代号
} while ( !role2.equals("1") && !role2.equals("2") );
//角色设置
setRole(1, Integer.parseInt(role1));
setRole(2, Integer.parseInt(role2));
//开始游戏
play();
}
/**
* 设置对战角色
* @param no 玩家次序 1:玩家1 2:玩家2
* @param role 角色代号
*/
public void setRole(int no, int role){
switch(role){
case 1:
playerName[no-1] = "A";
break;
case 2:
//设置玩家名称为"艾森豪威尔"
playerName[no-1] = "B";
break;
default:
break;
}
}
/**
* 两人对战玩法
*/
public void play(){
System.out.println("\n");
System.out.print("\n\n****************************************************\n");
System.out.print(" 开始游戏 \n");
System.out.print("****************************************************\n\n");
//显示对战地图
System.out.println("\n4种类型的陷阱: " + "$ 暂停 & 幸运轮盘 @ 地雷 # 时空隧道 * 普通\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");
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(playerName[no-1]+",请您输入任意字符并按回车键扔骰子:");
Scanner scan = new Scanner(System.in);
scan.next();
//模拟掷骰子:产生一个1~6的数字作为玩家掷的骰子数目
step = (int)(Math.random()*6+1);
System.out.print(step);
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与对方骑兵相遇
//添加代码实现:踩到对方,对方回到step步
playerPos2 -=4;
System.out.println("碰撞了");
}
if (no == 2 && playerPos1 == position){ //添加条件:玩家2与对方骑兵相遇
//添加代码实现:踩到对方,对方回到step步
playerPos1 -= 4;
System.out.println("碰撞了");
}
break;
case 1: //幸运轮盘
System.out.println("\n进入幸运轮盘");
//1.对方后退四步 2.自己前进4步
if(no==1)
{
playerPos1+=4;
}
if(no==2)
{
playerPos2+=4;
}
break;
case 2: //踩到地雷
//添加代码实现:踩到地雷退4步
position = position - 4;
System.out.println("踩到地雷");
break;
case 3: //下一次暂停一次
//添加代码实现:设置下次暂停掷骰子
goAndStop[no-1] = "off";
System.out.println("要停战一局了。");
break;
case 4: //时空隧道
//添加代码实现:进入时空隧道,加走4步
position = position + 4;
System.out.println("进入时空隧道");
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[1]+"您获胜了");
}
}
}
//地图类
import java.util.ArrayList;
import java.util.Random;
public class Map {
int[] map = new int[100]; //对战地图
int[] luckyTurn = {6, 55, 69, 83}; //幸运轮盘
int[] landMine = {5, 13, 64, 80, 94}; //地雷位置
int[] pause = {9, 27, 60, 93}; //暂停
int[] timeTunnel = {20, 25, 72, 88}; //时空隧道
/**
* 生成地图:
* 关卡代号为: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="X";
}else if(index==playerPos1){//显示玩家1
graph="A";
}else if(index==playerPos2){//显示玩家2
graph="B";
}else{
switch(i){
case 1:
graph="&";
break;
case 2:
graph="@";
break;
case 3:
graph="$";
break;
case 4:
graph="#";
break;
case 0:
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; 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 = 31; j > 0; j--){
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(32,36,playerPos1,playerPos2);
//显示地图第二行
showLine2(36,66,playerPos1,playerPos2);
//换行
System.out.println();
//显示地图左竖行
showLLine(67,70,playerPos1,playerPos2);
//显示地图第3行
showLine1(70,100,playerPos1,playerPos2);
}
}
//测试类
public class Test {
public static void main(String[] args) {
Game game = new Game();
game.start();
}
}