我目前正致力于开发Java国际象棋游戏,让游戏正常运行。但是我想在开始时添加一个功能,用户可以选择他们想要玩的难度。我想补充3个难点,(简单,中等,难度)。目前,我已经在开始时有一个弹出功能,询问用户他们或计算机是否想要开始游戏。感谢。
代码如下:
import java.util.*;
import javax.swing.*;
public class Chess {
static String chessBoard[][]={
{"r","k","b","q","a","b","k","r"},
{"p","p","p","p","p","p","p","p"},
{" "," "," "," "," "," "," "," "},
{" "," "," "," "," "," "," "," "},
{" "," "," "," "," "," "," "," "},
{" "," "," "," "," "," "," "," "},
{"P","P","P","P","P","P","P","P"},
{"R","K","B","Q","A","B","K","R"}};
static int kingPositionC, kingPositionL;
static int humanAsWhite=-1;//1=human as white, 0=human as black
static int globalDepth=4;
public static void main(String[] args) {
while (!"A".equals(chessBoard[kingPositionC/8][kingPositionC%8])) {kingPositionC++;}//get King's location
while (!"a".equals(chessBoard[kingPositionL/8][kingPositionL%8])) {kingPositionL++;}//get king's location
JFrame f=new JFrame("Chess Tutorial");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
UserInterface ui=new UserInterface();
f.add(ui);
f.setSize(500, 500);
f.setVisible(true);
System.out.println(sortMoves(posibleMoves()));
Object[] option={"Computer","Human"};
humanAsWhite=JOptionPane.showOptionDialog(null, "Who should play as white?", "ABC Options", JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, option, option[1]);
if (humanAsWhite==0) {
long startTime=System.currentTimeMillis();
makeMove(alphaBeta(globalDepth, 1000000, -1000000, "", 0));
long endTime=System.currentTimeMillis();
System.out.println("That took "+(endTime-startTime)+" milliseconds");
flipBoard();
f.repaint();
}
makeMove("7655 ");
undoMove("7655 ");
for (int i=0;i<8;i++) {
System.out.println(Arrays.toString(chessBoard[i]));
}
}
public static String alphaBeta(int depth, int beta, int alpha, String move, int player) {
//return in the form of 1234b##########
String list=posibleMoves();
if (depth==0 || list.length()==0) {return move+(Rating.rating(list.length(), depth)*(player*2-1));}
list=sortMoves(list);
player=1-player;//either 1 or 0
for (int i=0;i<list.length();i+=5) {
makeMove(list.substring(i,i+5));
flipBoard();
String returnString=alphaBeta(depth-1, beta, alpha, list.substring(i,i+5), player);
int value=Integer.valueOf(returnString.substring(5));
flipBoard();
undoMove(list.substring(i,i+5));
if (player==0) {
if (value<=beta) {beta=value; if (depth==globalDepth) {move=returnString.substring(0,5);}}
} else {
if (value>alpha) {alpha=value; if (depth==globalDepth) {move=returnString.substring(0,5);}}
}
if (alpha>=beta) {
if (player==0) {return move+beta;} else {return move+alpha;}
}
}
if (player==0) {return move+beta;} else {return move+alpha;}
}
public static void flipBoard() {
String temp;
for (int i=0;i<32;i++) {
int r=i/8, c=i%8;
if (Character.isUpperCase(chessBoard[r][c].charAt(0))) {
temp=chessBoard[r][c].toLowerCase();
} else {
temp=chessBoard[r][c].toUpperCase();
}
if (Character.isUpperCase(chessBoard[7-r][7-c].charAt(0))) {
chessBoard[r][c]=chessBoard[7-r][7-c].toLowerCase();
} else {
chessBoard[r][c]=chessBoard[7-r][7-c].toUpperCase();
}
chessBoard[7-r][7-c]=temp;
}
int kingTemp=kingPositionC;
kingPositionC=63-kingPositionL;
kingPositionL=63-kingTemp;
}
public static void makeMove(String move) {
if (move.charAt(4)!='P') {
chessBoard[Character.getNumericValue(move.charAt(2))][Character.getNumericValue(move.charAt(3))]=chessBoard[Character.getNumericValue(move.charAt(0))][Character.getNumericValue(move.charAt(1))];
chessBoard[Character.getNumericValue(move.charAt(0))][Character.getNumericValue(move.charAt(1))]=" ";
if ("A".equals(chessBoard[Character.getNumericValue(move.charAt(2))][Character.getNumericValue(move.charAt(3))])) {
kingPositionC=8*Character.getNumericValue(move.charAt(2))+Character.getNumericValue(move.charAt(3));
}
} else {
//if pawn promotion
chessBoard[1][Character.getNumericValue(move.charAt(0))]=" ";
chessBoard[0][Character.getNumericValue(move.charAt(1))]=String.valueOf(move.charAt(3));
}
}
public static void undoMove(String move) {
if (move.charAt(4)!='P') {
chessBoard[Character.getNumericValue(move.charAt(0))][Character.getNumericValue(move.charAt(1))]=chessBoard[Character.getNumericValue(move.charAt(2))][Character.getNumericValue(move.charAt(3))];
chessBoard[Character.getNumericValue(move.charAt(2))][Character.getNumericValue(move.charAt(3))]=String.valueOf(move.charAt(4));
if ("A".equals(chessBoard[Character.getNumericValue(move.charAt(0))][Character.getNumericValue(move.charAt(1))])) {
kingPositionC=8*Character.getNumericValue(move.charAt(0))+Character.getNumericValue(move.charAt(1));
}
} else {
//if pawn promotion
chessBoard[1][Character.getNumericValue(move.charAt(0))]="P";
chessBoard[0][Character.getNumericValue(move.charAt(1))]=String.valueOf(move.charAt(2));
}
}
public static String posibleMoves() {
String list="";
for (int i=0; i<64; i++) {
switch (chessBoard[i/8][i%8]) {
case "P": list+=posibleP(i);
break;
case "R": list+=posibleR(i);
break;
case "K": list+=posibleK(i);
break;
case "B": list+=posibleB(i);
break;
case "Q": list+=posibleQ(i);
break;
case "A": list+=posibleA(i);
break;
}
}
return list;//x1,y1,x2,y2,captured piece
}
public static String posibleP(int i) {
String list="", oldPiece;
int r=i/8, c=i%8;
for (int j=-1; j<=1; j+=2) {
try {//capture
if (Character.isLowerCase(chessBoard[r-1][c+j].charAt(0)) && i>=16) {
oldPiece=chessBoard[r-1][c+j];
chessBoard[r][c]=" ";
chessBoard[r-1][c+j]="P";
if (kingSafe()) {
list=list+r+c+(r-1)+(c+j)+oldPiece;
}
chessBoard[r][c]="P";
chessBoard[r-1][c+j]=oldPiece;
}
} catch (Exception e) {}
try {//promotion && capture
if (Character.isLowerCase(chessBoard[r-1][c+j].charAt(0)) && i<16) {
String[] temp={"Q","R","B","K"};
for (int k=0; k<4; k++) {
oldPiece=chessBoard[r-1][c+j];
chessBoard[r][c]=" ";
chessBoard[r-1][c+j]=temp[k];
if (kingSafe()) {
//column1,column2,captured-piece,new-piece,P
list=list+c+(c+j)+oldPiece+temp[k]+"P";
}
chessBoard[r][c]="P";
chessBoard[r-1][c+j]=oldPiece;
}
}
} catch (Exception e) {}
}
try {//move one up
if (" ".equals(chessBoard[r-1][c]) && i>=16) {
oldPiece=chessBoard[r-1][c];
chessBoard[r][c]=" ";
chessBoard[r-1][c]="P";
if (kingSafe()) {
list=list+r+c+(r-1)+c+oldPiece;
}
chessBoard[r][c]="P";
chessBoard[r-1][c]=oldPiece;
}
} catch (Exception e) {}
try {//promotion && no capture
if (" ".equals(chessBoard[r-1][c]) && i<16) {
String[] temp={"Q","R","B","K"};
for (int k=0; k<4; k++) {
oldPiece=chessBoard[r-1][c];
chessBoard[r][c]=" ";
chessBoard[r-1][c]=temp[k];
if (kingSafe()) {
//column1,column2,captured-piece,new-piece,P
list=list+c+c+oldPiece+temp[k]+"P";
}
chessBoard[r][c]="P";
chessBoard[r-1][c]=oldPiece;
}
}
} catch (Exception e) {}
try {//move two up
if (" ".equals(chessBoard[r-1][c]) && " ".equals(chessBoard[r-2][c]) && i>=48) {
oldPiece=chessBoard[r-2][c];
chessBoard[r][c]=" ";
chessBoard[r-2][c]="P";
if (kingSafe()) {
list=list+r+c+(r-2)+c+oldPiece;
}
chessBoard[r][c]="P";
chessBoard[r-2][c]=oldPiece;
}
} catch (Exception e) {}
return list;
}
public static String posibleR(int i) {
String list="", oldPiece;
int r=i/8, c=i%8;
int temp=1;
for (int j=-1; j<=1; j+=2) {
try {
while(" ".equals(chessBoard[r][c+temp*j]))
{
oldPiece=chessBoard[r][c+temp*j];
chessBoard[r][c]=" ";
chessBoard[r][c+temp*j]="R";
if (kingSafe()) {
list=list+r+c+r+(c+temp*j)+oldPiece;
}
chessBoard[r][c]="R";
chessBoard[r][c+temp*j]=oldPiece;
temp++;
}
if (Character.isLowerCase(chessBoard[r][c+temp*j].charAt(0))) {
oldPiece=chessBoard[r][c+temp*j];
chessBoard[r][c]=" ";
chessBoard[r][c+temp*j]="R";
if (kingSafe()) {
list=list+r+c+r+(c+temp*j)+oldPiece;
}
chessBoard[r][c]="R";
chessBoard[r][c+temp*j]=oldPiece;
}
} catch (Exception e) {}
temp=1;
try {
while(" ".equals(chessBoard[r+temp*j][c]))
{
oldPiece=chessBoard[r+temp*j][c];
chessBoard[r][c]=" ";
chessBoard[r+temp*j][c]="R";
if (kingSafe()) {
list=list+r+c+(r+temp*j)+c+oldPiece;
}
chessBoard[r][c]="R";
chessBoard[r+temp*j][c]=oldPiece;
temp++;
}
if (Character.isLowerCase(chessBoard[r+temp*j][c].charAt(0))) {
oldPiece=chessBoard[r+temp*j][c];
chessBoard[r][c]=" ";
chessBoard[r+temp*j][c]="R";
if (kingSafe()) {
list=list+r+c+(r+temp*j)+c+oldPiece;
}
chessBoard[r][c]="R";
chessBoard[r+temp*j][c]=oldPiece;
}
} catch (Exception e) {}
temp=1;
}
return list;
}
public static String posibleK(int i) {
String list="", oldPiece;
int r=i/8, c=i%8;
for (int j=-1; j<=1; j+=2) {
for (int k=-1; k<=1; k+=2) {
try {
if (Character.isLowerCase(chessBoard[r+j][c+k*2].charAt(0)) || " ".equals(chessBoard[r+j][c+k*2])) {
oldPiece=chessBoard[r+j][c+k*2];
chessBoard[r][c]=" ";
if (kingSafe()) {
list=list+r+c+(r+j)+(c+k*2)+oldPiece;
}
chessBoard[r][c]="K";
chessBoard[r+j][c+k*2]=oldPiece;
}
} catch (Exception e) {}
try {
if (Character.isLowerCase(chessBoard[r+j*2][c+k].charAt(0)) || " ".equals(chessBoard[r+j*2][c+k])) {
oldPiece=chessBoard[r+j*2][c+k];
chessBoard[r][c]=" ";
if (kingSafe()) {
list=list+r+c+(r+j*2)+(c+k)+oldPiece;
}
chessBoard[r][c]="K";
chessBoard[r+j*2][c+k]=oldPiece;
}
} catch (Exception e) {}
}
}
return list;
}
public static String posibleB(int i) {
String list="", oldPiece;
int r=i/8, c=i%8;
int temp=1;
for (int j=-1; j<=1; j+=2) {
for (int k=-1; k<=1; k+=2) {
try {
while(" ".equals(chessBoard[r+temp*j][c+temp*k]))
{
oldPiece=chessBoard[r+temp*j][c+temp*k];
chessBoard[r][c]=" ";
chessBoard[r+temp*j][c+temp*k]="B";
if (kingSafe()) {
list=list+r+c+(r+temp*j)+(c+temp*k)+oldPiece;
}
chessBoard[r][c]="B";
chessBoard[r+temp*j][c+temp*k]=oldPiece;
temp++;
}
if (Character.isLowerCase(chessBoard[r+temp*j][c+temp*k].charAt(0))) {
oldPiece=chessBoard[r+temp*j][c+temp*k];
chessBoard[r][c]=" ";
chessBoard[r+temp*j][c+temp*k]="B";
if (kingSafe()) {
list=list+r+c+(r+temp*j)+(c+temp*k)+oldPiece;
}
chessBoard[r][c]="B";
chessBoard[r+temp*j][c+temp*k]=oldPiece;
}
} catch (Exception e) {}
temp=1;
}
}
return list;
}
public static String posibleQ(int i) {
String list="", oldPiece;
int r=i/8, c=i%8;
int temp=1;
for (int j=-1; j<=1; j++) {
for (int k=-1; k<=1; k++) {
if (j!=0 || k!=0) {
try {
while(" ".equals(chessBoard[r+temp*j][c+temp*k]))
{
oldPiece=chessBoard[r+temp*j][c+temp*k];
chessBoard[r][c]=" ";
chessBoard[r+temp*j][c+temp*k]="Q";
if (kingSafe()) {
list=list+r+c+(r+temp*j)+(c+temp*k)+oldPiece;
}
chessBoard[r][c]="Q";
chessBoard[r+temp*j][c+temp*k]=oldPiece;
temp++;
}
if (Character.isLowerCase(chessBoard[r+temp*j][c+temp*k].charAt(0))) {
oldPiece=chessBoard[r+temp*j][c+temp*k];
chessBoard[r][c]=" ";
chessBoard[r+temp*j][c+temp*k]="Q";
if (kingSafe()) {
list=list+r+c+(r+temp*j)+(c+temp*k)+oldPiece;
}
chessBoard[r][c]="Q";
chessBoard[r+temp*j][c+temp*k]=oldPiece;
}
} catch (Exception e) {}
temp=1;
}
}
}
return list;
}
public static String posibleA(int i) {
String list="", oldPiece;
int r=i/8, c=i%8;
for (int j=0;j<9;j++) {
if (j!=4) {
try {
if (Character.isLowerCase(chessBoard[r-1+j/3][c-1+j%3].charAt(0)) || " ".equals(chessBoard[r-1+j/3][c-1+j%3])) {
oldPiece=chessBoard[r-1+j/3][c-1+j%3];
chessBoard[r][c]=" ";
chessBoard[r-1+j/3][c-1+j%3]="A";
int kingTemp=kingPositionC;
kingPositionC=i+(j/3)*8+j%3-9;
if (kingSafe()) {
list=list+r+c+(r-1+j/3)+(c-1+j%3)+oldPiece;
}
chessBoard[r][c]="A";
chessBoard[r-1+j/3][c-1+j%3]=oldPiece;
kingPositionC=kingTemp;
}
} catch (Exception e) {}
}
}
//need to add casting later
return list;
}
public static String sortMoves(String list) {
int[] score=new int [list.length()/5];
for (int i=0;i<list.length();i+=5) {
makeMove(list.substring(i, i+5));
score[i/5]=-Rating.rating(-1, 0);
undoMove(list.substring(i, i+5));
}
String newListA="", newListB=list;
for (int i=0;i<Math.min(6, list.length()/5);i++) {//first few moves only
int max=-1000000, maxLocation=0;
for (int j=0;j<list.length()/5;j++) {
if (score[j]>max) {max=score[j]; maxLocation=j;}
}
score[maxLocation]=-1000000;
newListA+=list.substring(maxLocation*5,maxLocation*5+5);
newListB=newListB.replace(list.substring(maxLocation*5,maxLocation*5+5), "");
}
return newListA+newListB;
}
public static boolean kingSafe() {
//bishop/queen
int temp=1;
for (int i=-1; i<=1; i+=2) {
for (int j=-1; j<=1; j+=2) {
try {
while(" ".equals(chessBoard[kingPositionC/8+temp*i][kingPositionC%8+temp*j])) {temp++;}
if ("b".equals(chessBoard[kingPositionC/8+temp*i][kingPositionC%8+temp*j]) ||
"q".equals(chessBoard[kingPositionC/8+temp*i][kingPositionC%8+temp*j])) {
return false;
}
} catch (Exception e) {}
temp=1;
}
}
//rook/queen
for (int i=-1; i<=1; i+=2) {
try {
while(" ".equals(chessBoard[kingPositionC/8][kingPositionC%8+temp*i])) {temp++;}
if ("r".equals(chessBoard[kingPositionC/8][kingPositionC%8+temp*i]) ||
"q".equals(chessBoard[kingPositionC/8][kingPositionC%8+temp*i])) {
return false;
}
} catch (Exception e) {}
temp=1;
try {
while(" ".equals(chessBoard[kingPositionC/8+temp*i][kingPositionC%8])) {temp++;}
if ("r".equals(chessBoard[kingPositionC/8+temp*i][kingPositionC%8]) ||
"q".equals(chessBoard[kingPositionC/8+temp*i][kingPositionC%8])) {
return false;
}
} catch (Exception e) {}
temp=1;
}
//knight
for (int i=-1; i<=1; i+=2) {
for (int j=-1; j<=1; j+=2) {
try {
if ("k".equals(chessBoard[kingPositionC/8+i][kingPositionC%8+j*2])) {
return false;
}
} catch (Exception e) {}
try {
if ("k".equals(chessBoard[kingPositionC/8+i*2][kingPositionC%8+j])) {
return false;
}
} catch (Exception e) {}
}
}
//pawn
if (kingPositionC>=16) {
try {
if ("p".equals(chessBoard[kingPositionC/8-1][kingPositionC%8-1])) {
return false;
}
} catch (Exception e) {}
try {
if ("p".equals(chessBoard[kingPositionC/8-1][kingPositionC%8+1])) {
return false;
}
} catch (Exception e) {}
//king
for (int i=-1; i<=1; i++) {
for (int j=-1; j<=1; j++) {
if (i!=0 || j!=0) {
try {
if ("a".equals(chessBoard[kingPositionC/8+i][kingPositionC%8+j])) {
return false;
}
} catch (Exception e) {}
}
}
}
}
return true;
}
}
答案 0 :(得分:0)
首先:请仅显示相关代码。
除此之外,答案非常简单。我想你想要实现几种人工智能策略并让玩家选择使用哪种策略。有一个类ComputerPlayer
并给它一个构造函数public ComputerPlayer(Strategy s)
。这将决定使用哪种策略,因此将其存储为实例变量。然后应该调用s.determineMove()
或者您决定命名方法的任何内容:确定移动。
然后创建一个接口Strategy
并有几个策略(在这种情况下:easy,medium,hard)实现这个。
如果您不知道我在说什么,那么您可能还没准备好实施AI。
另外,我想建议至少在MVC-pattern
查看