Java用awt编写井字棋(新手编写)
结果演示:
public class Player {
private int x;
private int y;
public Player(int x, int y) {
super();
this.x = x;
this.y = y;
}//存入棋子的x,y的位置
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
public class ChessBoard extends Frame {
public TextField txt;//提示文本(显示当前应下棋的玩家)
public int flag=1,p1=0,p2=0;//判断轮到哪名玩家,记录该玩家的下棋次数
public int[][] board= new int[3][3];//对应棋盘的二维数组
public Button[] btn=new Button[9];//棋盘
public ArrayList<Player> player1=new ArrayList<>();
public ArrayList<Player> player2=new ArrayList<>();//建立对应玩家的集合
public ChessBoard(String title) {
super(title);
init();
}
private void init() {
this.setBounds(100,100,300,340);
txt=new TextField();
Button restart=new Button("重新开始");
this.add(txt, BorderLayout.SOUTH);
this.add(restart, BorderLayout.EAST);
txt.setText("当前玩家:Player1");
TextField name=new TextField();
this.add(name, BorderLayout.NORTH);
name.setText("Player1:O; Player2:X;");
Panel panel=new Panel();
GridLayout gl=new GridLayout(3,3,1,1);
panel.setLayout(gl);
this.add(panel);
for(int i=0;i<btn.length;i++) {
btn[i]=new Button();
panel.add(btn[i]);
}//建立棋盘
for(int i=0;i<btn.length;i++) {
btn[i].addMouseListener(new ChessButtonListener(this,i));
}//将棋子在棋盘上打印出来
new Result1(this);
new Result2(this);//启动线程
restart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for(int i=0;i<btn.length;i++)
btn[i].setLabel(null);
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++)
board[i][j]=0;
}
for(int i=0;i<p1;i++)
player1.remove(0);
for(int i=0;i<p2;i++)
player2.remove(0);
p1=0;
p2=0;
if(flag==1) {
flag=1;
txt.setText("当前玩家:Player1");
}else if(flag==2) {
flag=2;
txt.setText("当前玩家:Player2");
}
}
});//判断是否重新开始并清空棋盘和清空集合
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
ChessBoard.this.dispose();
}
});//关闭游戏
}
}
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class ChessButtonListener extends MouseAdapter {
private ChessBoard frame;
private int i;
public ChessButtonListener(ChessBoard frame,int i) {
this.frame =frame;
this.i=i;
}//引入数据
public void mouseClicked(MouseEvent e) {
if(frame.board[i/3][i%3]==0) {//判断是否为空棋盘
if(frame.flag==1) {//判断轮到哪名玩家
frame.board[i/3][i%3]=1;//改变对应二维数组的值
frame.btn[i].setLabel("O");//输出棋子
frame.flag=2;
frame.p1++;//记录次数
frame.txt.setText("当前玩家:Player2");//输出提示
frame.player1.add(new Player(i/3,i%3));//将棋子位置存入集合
}else if(frame.flag==2) {
frame.board[i/3][i%3]=2;//改变对应二维数组的值
frame.btn[i].setLabel("X");//输出棋子
frame.flag=1;
frame.p2++;//记录次数
frame.txt.setText("当前玩家:Player1");//输出提示
frame.player2.add(new Player(i/3,i%3));//将棋子位置存入集合
}
}
super.mouseClicked(e);
}
}
public class Result1 extends Thread {
private ChessBoard frame;
private boolean result=false;//判断输赢
private int[] count=new int[4];
public Result1(ChessBoard frame) {
this.frame = frame;
start();
}//引入数据并启动线程
public void run() {
while(true) {//判断是否赢了
synchronized("") {
for(int i=0;i<3;i++) {
for(Player p:frame.player1) {
if(p.getX()==p.getY()) //左斜
count[0]++;
if(p.getX()+p.getY()==2)//右斜
count[1]++;
if(p.getX()==i)//横行
count[2]++;
if(p.getY()==i)//纵列
count[3]++;
}
for(int j=0;j<4;j++) {
if(count[j]==3) {
result=true;
}
count[j]=0;
}
}
if(result) {
frame.txt.setText("Player1获胜!");//输出结果
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++)
frame.board[i][j]=1;//停止落棋
}
result=false;
}
}
try {
this.sleep(1000);//上锁并休眠节约内存
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Result2 extends Thread {
private ChessBoard frame;
private boolean result=false;//判断输赢
private int[] count=new int[4];
public Result2(ChessBoard frame) {
this.frame = frame;
start();
}//引入数据并启动线程
public void run() {
while(true) {//判断是否赢了
synchronized("") {
for(int i=0;i<3;i++) {
for(Player p:frame.player2) {
if(p.getX()==p.getY()) //左斜
count[0]++;
if(p.getX()+p.getY()==2)//右斜
count[1]++;
if(p.getX()==i)//横行
count[2]++;
if(p.getY()==i)//纵列
count[3]++;
}
for(int j=0;j<4;j++) {
if(count[j]==3) {
result=true;
}
count[j]=0;
}
}
if(result) {
frame.txt.setText("Player2获胜!");//输出结果
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++)
frame.board[i][j]=2;//停止落棋
}
result=false;
}
}
try {
this.sleep(1000);//上锁并休眠节约内存
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Game {
public static void main(String[] args) {
new ChessBoard("井字棋");//启动游戏
}
}