Java实现简单井字棋(OX游戏)V1.0

简介

这是我们大学Java课程在学习了类,继承还有GUI后布置的一个作业,原要求是“使用Java的类库,设计圈叉游戏的图形用户界面,提交GUI界面的代码文件。”,虽然原题题意好像没有让我们写交互,但是我还是一并写了一下,感觉还是学到不少的。感谢狂神说Java关于GUI的课程,在看他的课之前我真的是一篇混乱。
学这个课程前最好得再看看接口回调的知识点
主要功能:进行、控制游戏,重置游戏,判断赢家。

效果

初始界面

初始界面

玩家取胜

玩家取胜

平局

平局

代码

我用的IDE是IDEA,蜜汁会把getLable() 加上一条删除线。
欢迎大家指出问题提出建议。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestOXGame {
    public static void main(String[] args) {
        MyOXGame myoxgame=new MyOXGame();
    }
}

class MyOXGame extends JFrame implements ActionListener {
    //主体部分,绘制GUI,编辑有关响应
    JButton[] button;//对象数组,表示棋盘上的九个格子
    JButton restart;//重置键
    JLabel judgement;//裁判,用来显示游戏的结果
    JPanel chessboard,basicPanel;//棋盘,棋盘下部区域
    int player=0;//显示当前玩家编号
    boolean gameOverFlag=false;//记录游戏是否结束,如果结束值为true,停止对事件的响应

    MyOXGame(){//生成函数,生成游戏
        setTitle("MY OXGAME");
        setBounds(500,500,300,300);//窗体基本设置

        button=new JButton[10];
        restart=new JButton("Restart");
        chessboard=new JPanel();
        basicPanel=new JPanel();
        judgement=new JLabel("");
        chessboard.setLayout(new GridLayout(3,3));
        basicPanel.setLayout(new FlowLayout());//组件初始化设置


        add(chessboard,BorderLayout.CENTER);
        add(basicPanel,BorderLayout.SOUTH);
        basicPanel.add(restart);
        basicPanel.add(judgement);//布局设置

        initChessboard();//初始化棋盘,使九个按钮按顺序加上1-9的标签,
        addChessToChessboard(chessboard);//将九个按钮添加至chessboard
        restart.addActionListener(this);//添加监听器

        buttonListener();//为按钮添加监听器

        setVisible(true);//设置可视化
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//使关闭键有用
    }

    private void addChessToChessboard(JPanel chessboard){
        //添加按钮至棋盘
        for(int i=1;i<=9;i++) {
            chessboard.add(button[i]);
        }
    }

    private void initChessboard(){
        //使棋子按钮初始化为1-9
        for(int i=1;i<=9;i++){
            button[i]=new JButton(""+i);
        }
    }

    private void buttonListener(){
        //为棋子按钮添加监听器
        for(int i=1;i<=9;i++)
        {
            button[i].addActionListener(this);
        }
    }

    private void restartTheGame(){
        //重置游戏
        chessboard.removeAll();//必须于repaint和updateUI一起用不然要不啥都没有,要不没有改动
        //必须注意removll会清空布局
        chessboard.setLayout(new GridLayout(3,3));
        initChessboard();
        addChessToChessboard(chessboard);
        buttonListener();
        chessboard.updateUI();
        chessboard.repaint();

        judgement.setText("");
        gameOverFlag=false;
    }
    private boolean checkDogfall(char[] chess){
        //检查是否被填满,填满即为平局
        for(int i=1;i<chess.length;i++){
            if (chess[i]>='1'&&chess[i]<='9')
                return false;
        }
        return true;
    }

    private int checkWinner(int playerNow) {
        //检查当前游戏状态,-2表示没有决出胜负,-1表示平局。0表示O玩家胜利,1表示X玩家胜利
        char[] chess=new char[10];
        for(int i=1;i<=9;i++){
            chess[i]=button[i].getLabel().charAt(0);
        }
        if(     (chess[1]==chess[2]&&chess[2]==chess[3])||
                (chess[4]==chess[5]&&chess[5]==chess[6])||
                (chess[7]==chess[8]&&chess[8]==chess[9])||
                (chess[1]==chess[5]&&chess[5]==chess[9])||
                (chess[7]==chess[5]&&chess[5]==chess[3])||
                (chess[1]==chess[4]&&chess[4]==chess[7])||
                (chess[2]==chess[5]&&chess[5]==chess[8])||
                (chess[3]==chess[6]&&chess[6]==chess[9])){
            //判断当前玩家是否为赢家
            return playerNow;
        }
        else if(checkDogfall(chess))
            return -1;
        return -2;
    }

    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        //对监听的事件进行响应
        int statueCode;
        JButton buttonSource=(JButton)actionEvent.getSource();
        if(buttonSource==restart){
            //判断是否使restart键,如果是,重置游戏
            restartTheGame();
        }
        if (gameOverFlag==true) return;
        String buttonMark=buttonSource.getLabel();
        if(buttonMark.matches("[0-9]")){
            if(player==0) buttonSource.setLabel("O");
            else buttonSource.setLabel("X");
            statueCode=checkWinner(player);
            if(statueCode==0){
                judgement.setText("Player O wins the game! ");
                gameOverFlag=true;
            }
            else if(statueCode==1){
                judgement.setText("Player X wins the game!");
                gameOverFlag=true;
            }
            else if(statueCode==-1){
                judgement.setText("The game a draw!");
            }
            player=(player+1)%2;
        }
    }

}
  • 16
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单Java井字棋游戏实现: ```java import java.util.Scanner; public class TicTacToe { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); char[][] board = new char[3][3]; boolean player1 = true; int row, col; char symbol; // 初始化游戏面板 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { board[i][j] = '-'; } } // 游戏循环 while (true) { // 打印游戏面板 printBoard(board); // 确定当前玩家和他的符号 if (player1) { symbol = 'X'; } else { symbol = 'O'; } // 玩家输入坐标 System.out.print("Player " + symbol + ", enter row (0-2): "); row = scanner.nextInt(); System.out.print("Player " + symbol + ", enter column (0-2): "); col = scanner.nextInt(); // 检查坐标是否有效 if (row < 0 || row > 2 || col < 0 || col > 2) { System.out.println("Invalid input, try again."); continue; } // 检查坐标是否已经被占用 if (board[row][col] != '-') { System.out.println("This cell is already occupied, try again."); continue; } // 将玩家的符号放入游戏面板 board[row][col] = symbol; // 检查是否有玩家获胜 if (checkWin(board)) { printBoard(board); System.out.println("Player " + symbol + " wins!"); break; } // 检查是否平局 if (checkTie(board)) { printBoard(board); System.out.println("It's a tie!"); break; } // 切换玩家 player1 = !player1; } scanner.close(); } // 打印游戏面板 private static void printBoard(char[][] board) { System.out.println(" 0 1 2"); for (int i = 0; i < 3; i++) { System.out.print(i + " "); for (int j = 0; j < 3; j++) { System.out.print(board[i][j] + " "); } System.out.println(); } } // 检查是否有玩家获胜 private static boolean checkWin(char[][] board) { // 检查行 for (int i = 0; i < 3; i++) { if (board[i][0] != '-' && board[i][0] == board[i][1] && board[i][0] == board[i][2]) { return true; } } // 检查列 for (int i = 0; i < 3; i++) { if (board[0][i] != '-' && board[0][i] == board[1][i] && board[0][i] == board[2][i]) { return true; } } // 检查对角线 if (board[0][0] != '-' && board[0][0] == board[1][1] && board[0][0] == board[2][2]) { return true; } if (board[0][2] != '-' && board[0][2] == board[1][1] && board[0][2] == board[2][0]) { return true; } // 没有获胜 return false; } // 检查是否平局 private static boolean checkTie(char[][] board) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (board[i][j] == '-') { return false; } } } return true; } } ``` 以上代码实现了一个简单井字棋游戏,玩家可以通过控制台输入坐标来下棋,程序会检查输入的坐标是否合法,并且检查是否有玩家获胜或者平局。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值