📄 threechessgame.java
字号:
/**
* @(#)ThreeChessGame.java
*
*
* @author
* @version 1.00 2009/3/13
*/
import javax.swing.JOptionPane;
public class ThreeChessGame {
//二维数组模拟棋盘
private char[][] chessBoard;
//构造函数
public ThreeChessGame() {
//棋盘初始化
chessBoard=new char [3][3];
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
chessBoard[i][j]='*';
}
//供开始比赛的方法
public void startGame()
{
//提示用户比赛开始
JOptionPane.showMessageDialog(null,"开始游戏。。。\n先走的一方在棋盘中X为标记,\n"+
"后走的一方在棋盘中O为标记,\n棋盘中暂时的地方用*标出.\n\n"+
showChessBoard(),"Game Hint",JOptionPane.INFORMATION_MESSAGE);
//键入玩比赛的方法
playThreeChessGame();
}
//玩三子棋比赛
private void playThreeChessGame()
{
//
int chessNumber=0;
//这里可以调用testFinished()函数替代chessNumber<15;
while(chessNumber<9)
{
boolean gameGoOn=false;
//X落子?
if(chessNumber%2==0)
{
//X落子成功???
gameGoOn = xTurn();
//落子失败,终止比赛
if(!gameGoOn)
{
JOptionPane.showMessageDialog(null,"比赛终止\n","Game Result",JOptionPane.INFORMATION_MESSAGE);
return;
}
//落子成功,棋子个数自增
chessNumber++;
//测试比赛状态
if(chessNumber>=5)
{
boolean isXWin=testXWin();
if(isXWin)
{
JOptionPane.showMessageDialog(null,"第一个游戏者获胜,比赛结束\n"+showChessBoard(),
"Game Result",JOptionPane.INFORMATION_MESSAGE);
return;
}
}
}
//O落子
else
{
gameGoOn=oTurn();
if(!gameGoOn)
{
JOptionPane.showMessageDialog(null,"比赛终止\n","Game Result",JOptionPane.INFORMATION_MESSAGE);
return;
}
chessNumber++;
if(chessNumber>=6)
{
boolean isOWin=testOWin();
if(isOWin)
{
JOptionPane.showMessageDialog(null,"第二个游戏者获胜,比赛结束\n"+showChessBoard(),
"Game Result",JOptionPane.INFORMATION_MESSAGE);
return;
}
}
}
}
//比赛是平局
JOptionPane.showMessageDialog(null,"平局,比赛结束\n"+showChessBoard(),
"Game Result",JOptionPane.INFORMATION_MESSAGE);
return;
}
//显示棋盘
private String showChessBoard()
{
String strChessBoard="";
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(testPosition(i+1,j+1))
strChessBoard=strChessBoard+chessBoard[i][j]+" ";
else
strChessBoard=strChessBoard+chessBoard[i][j]+" ";
}
//每一行需要换行
strChessBoard+="\n\n\n";
}
return strChessBoard;
}
//处理X落子
private boolean xTurn()
{
int i=0;
//最多有三次输入机会,连续三次落子有误,即落子失败.
while(i<3)
{
String strInputPosition=JOptionPane.showInputDialog(null,"请第一个游戏者输入落子位置,如,12(指第一行第二列):\n\n"+
showChessBoard(),"Game Input",JOptionPane.QUESTION_MESSAGE);
int inputPosition=Integer.parseInt(strInputPosition);
int inputRow=inputPosition/10;
int inputColumn=inputPosition%10;
boolean flag=true;
if(inputRow<4&&inputRow>0&&inputColumn<4&&inputColumn>0)
{
if(testPosition(inputRow,inputColumn))
{
chessBoard[inputRow-1][inputColumn-1]='X';
return true;
}
}
i++;
JOptionPane.showMessageDialog(null,"第一个游戏者落子位置有误!","Game Warning",JOptionPane.INFORMATION_MESSAGE);
}
JOptionPane.showMessageDialog(null,"第一个游戏者多次落子位置有误!","Game Warning",JOptionPane.INFORMATION_MESSAGE);
return false;
}
private boolean oTurn()
{
int i=0;
//最多有三次输入机会,连续三次落子有误,即落子失败.
while(i<3)
{
String strInputPosition=JOptionPane.showInputDialog(null,"请第二个游戏者输入落子位置,如,12(指第一行第二列):\n\n"+
showChessBoard(),"Game Input",JOptionPane.QUESTION_MESSAGE);
int inputPosition=Integer.parseInt(strInputPosition);
int inputRow=inputPosition/10;
int inputColumn=inputPosition%10;
//boolean flag=true;
if(inputRow<4&&inputRow>0&&inputColumn<4&&inputColumn>0)
{
if(testPosition(inputRow,inputColumn))
{
chessBoard[inputRow-1][inputColumn-1]='O';
return true;
}
}
//落子位置有误
i++;
JOptionPane.showMessageDialog(null,"第二个游戏者落子位置有误!\n","Game Warning",JOptionPane.INFORMATION_MESSAGE);
}
//落子失败
JOptionPane.showMessageDialog(null,"第二个游戏者多次落子位置有误!\n","Game Warning",JOptionPane.INFORMATION_MESSAGE);
return false;
}
//判断X是否赢得比赛.
private boolean testXWin()
{
//默认X还未赢得比赛
//boolean xWin=false;
//遍历数组,是否是X获胜
//检查每一行
for(int i=0;i<3;i++)
{
if(chessBoard[i][0]=='X'&&chessBoard[i][1]=='X'&&chessBoard[i][2]=='X')
{
//xWin==true;
return true;
}
}
//遍历每一列
for(int j=0;j<3;j++)
{
if(chessBoard[0][j]=='X'&&chessBoard[1][j]=='X'&&chessBoard[2][j]=='X')
{
//xWin=true;
return true;
}
}
//检测对角线
if((chessBoard[0][0]=='X'&&chessBoard[1][1]=='X'&&chessBoard[2][2]=='X')||(chessBoard[0][2]=='X'&&chessBoard[1][1]=='X'&&chessBoard[2][0]=='X'))
return true;
return false;
}
//判断O是否赢得比赛
private boolean testOWin()
{
//默认O还未赢得比赛
//boolean oWin=false;
//遍历数组,是否是O获胜
//检查每一行
for(int i=0;i<3;i++)
{
if(chessBoard[i][0]=='O'&&chessBoard[i][1]=='O'&&chessBoard[i][2]=='O')
{
//oWin==true;
return true;
}
}
//遍历每一列
for(int j=0;j<3;j++)
{
if(chessBoard[0][j]=='O'&&chessBoard[1][j]=='O'&&chessBoard[2][j]=='O')
{
//oWin=true;
return true;
}
}
//检测对角线
if((chessBoard[0][0]=='O'&&chessBoard[1][1]=='O'&&chessBoard[2][2]=='O')||(chessBoard[0][2]=='O'&&chessBoard[1][1]=='O'&&chessBoard[2][0]=='O'))
return true;
return false;
}
private boolean testFinished()
{
//boolean tie=false;
//检查是否用空的位置没有填棋子
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
if(chessBoard[i][j]=='*')
return false;
}
return true;
}
//测试给定位置是否已经填了棋子
private boolean testPosition(int i,int j)
{
//测试指定位置是否依然是一个星号标志
//注意数组下表是从0开始,用户习惯的行列是从1开始
if(chessBoard[i-1][j-1]=='*')
return true;
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -