【问题标题】:Tic Tac Toe Java Game井字游戏 Java 游戏
【发布时间】:2015-06-12 18:11:36
【问题描述】:

我用java做了一个井字游戏。我已经完成了代码,但我不确定如何检查对角线上是否有赢家。我试图输入的是:

win[x] += (board[0][2] + board[1][1] + board[2][0]);
x++;
win[x] += (board[0][0] + board[1][1] + board[2][2]);

但它似乎不起作用。非常感谢您对解决此问题的任何帮助!

井字游戏

import java.util.Scanner;
import java.util.Random;

public class TicTac
{
    public static void main(String[]args)
    {
        Scanner reader = new Scanner(System.in);
        TTTBoard board = new TTTBoard();

        System.out.println(board);

        Random gen = new Random();
        char player;
        if(gen.nextInt(2) == 1)
        {
            player = 'O';
        }
        else
        {
            player = 'X';
        }
        System.out.println("Would you like to play against the computer?");
        String computer = reader.nextLine();

        while(board.getWinner() == '-' && !board.full())
        {
            int row = 0;
            int column = 0;
            boolean success = false;
            System.out.println(player + "'s turn.");

            if(computer.equals("No")||player=='X')
            {
                System.out.print("Enter the row and column[1-3, space, 1-3]");

                row = reader.nextInt();
                column = reader.nextInt();
                success = board.placeXorO(player, row, column);
            }
            else
            {
                while(!success)
                {
                    row = gen.nextInt(3) +1;
                    column = gen.nextInt(3) +1;
                    success = board.placeXorO(player, row, column);
                }
            }
            if(!success)
            {
                System.out.println("Error: cell already occupied");
            }
            else
            {
                System.out.println(board);
                if(player == 'X')
                {
                    player = 'O';
                }
                else
                {
                    player = 'X';
                }
            }
        }
        char winner = board.getWinner();
        if(winner != '-')
        {
            System.out.println(winner + "'s wins!");
        }
        else
        {
            System.out.println("It's a draw!");
        }

    }
}

TTTBoard 类

public class TTTBoard{
    private char[][]board;

    public TTTBoard()
    {
        board = new char[3][3];
        reset();
    }

    public void reset()
    {
        for(int row = 0; row < 3; row++)
        {
            for(int col = 0; col < 3; col++)
            {
                board[row][col]= '-';
            }
        }
    }

    public String toString()
    {
        String result = "\n";
        for(int row = 0; row < 3; row++)
        {
            for (int col = 0; col < 3; col++)
            {
                result += board[row][col] + " ";
            }
            result += "\n";
        }
        return result;
    }

    public boolean placeXorO(char player, int row, int col)
    {
        if(board[row-1][col-1]=='-')
        {
            board[row-1][col-1] = player;
            return true;
        }
        else
        {
            return false;
        }
    }

    public boolean full()
    {
        for(int row = 0; row < 3; row++)
        {
            for(int col = 0; col < 3; col++)
            {
                if(board[row][col] == '-')
                {
                    return false;
                }
            }
        }
        return true;
    }

    public char getWinner()
    {
        String[]win = new String[8];
        int x =0;
        for(int y =0; y < 8; y++)
        {
            win[y] = "";
        }

        for(int row = 0; row <3; row++)
        {
            for (int col = 0; col < 3; col++)
            {
                win[x] += board[row][col];
            }
            x++;
        }

        for(int col = 0; col <3; col++)
        {
            for (int row = 0; row < 3; row++)
            {
                win[x] += board[row][col];
            }
            x++;
        }

        win[x] += (board[0][2] + board[1][1] + board[2][0]);
        x++;
        win[x] += (board[0][0] + board[1][1] + board[2][2]);

        char winner = '-';
        for(int i = 0; i < 8; i++)
        {
            if (win[i].equals("XXX"))
            {
                winner = 'X';
            }
            if(win[i].equals("OOO"))
            {
                winner = 'O';
            }
        }
        return winner;
    }
}

【问题讨论】:

    标签: java tic-tac-toe


    【解决方案1】:

    在Java 中,由于char 是一个原始类型,因此它在幕后存储为一个数字。因此,当您执行 ('O' + 'O' + 'O') 时,您实际上最终会将 O 的 ascii 值加在一起 ​​3 次,结果只有一个字符。要解决此问题,您可以强制 Java 将 + 运算符视为连接而不是加法:("" + 'O' + 'O' + 'O')

    【讨论】:

    • 这就是为什么我有 win[y] = "";和 win += 的值,以便它添加到已经存在的值。那么我不是已经按照您的建议做了吗,还是应该在两个语句的开头添加“”?
    • 括号是什么让你搞砸了。如果在括号内将 3 个字符加在一起,然后将该值赋给一个字符串,则在所有字符加在一起之前,不会发生从字符到字符串的转换。
    • 赋值运算符的右边会在赋值给左边的变量之前完整计算。
    【解决方案2】:

    这个代码是最简单的! 这有赢逻辑、输逻辑、平局逻辑以及得分、重置和新游戏!

    package com.pervacio.ex;
    
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    
    
    class TicTacToe implements ActionListener {
    
        JCheckBox cb1= new JCheckBox("vs friend");
        JFrame jf= new JFrame("TicTacToe by Anand");
        JButton jb[][]= new JButton[3][3];
        JButton reset= new JButton();
        JLabel xjl= new JLabel();
        JLabel ojl= new JLabel();
        JLabel xwin= new JLabel();
        JLabel owin= new JLabel();
        JMenu menu1, menu2;
        JMenuBar bar;
        JMenuItem i1,i2,i3;
        JTextArea tf;
        int corX=0, corY=0;
        int flag=0;
        int xScore=0;
        int oScore=0;
        int comp=0;
        public void selectGame() {
            jf.setLayout(null);
            jf.add(cb1);
            cb1.setBounds(100,50,100,100);
            jf.add(cb1);
            cb1.setBounds(100, 150, 100, 100);
            cb1.addItemListener(new ItemListener() {
    
                @Override
                public void itemStateChanged(ItemEvent e) {
                    jf.remove(cb1);
                    setUpFrame();
    
                }
            });
    
            jf.setSize(318, 510);
            jf.setVisible(true);
    
        }
    
    
    
        public void setUpFrame() {
            jf.setSize(500, 500);
            for(int i=0; i< 3; i++) {
                for(int j=0; j<3 ;j++) {
                    jb[i][j]= new JButton(" ");
                    jb[i][j].setSize(100, 100);
                    jb[i][j].setBounds(corX, corY, 100, 100);
                    jf.add(jb[i][j]);
                    jb[i][j].addActionListener(this);
    
    
                    corX=corX+100;
                }
    
                corX=0;
                corY=corY+100;
            }
            reset.setBounds(100, 350, 100, 50);
            xjl.setBounds(0,400,80,80);
            ojl.setBounds(200,400,80,80);
            xwin.setBounds(80,400,200,80);
            owin.setBounds(280,400, 200, 80);
            jf.setLayout(null);
            jf.setSize(318, 510);
            jf.setVisible(true);
            jf.add(ojl);
            jf.add(xjl);
            jf.add(xwin);
            jf.add(owin);
            reset.setText("Reset");
            reset.setBackground(Color.GREEN);
            bar= new JMenuBar();
            menu1= new JMenu("Game");
            menu2= new JMenu("Help");
            i1= new JMenuItem("New Game");
            i1.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(e.getSource()==i1) {
                        for(int i=0; i<3 ;i++) {
                            for(int j=0;j<3;j++) {
                                jb[i][j].setText(" ");
                            }
                        }
                        xwin.setText(" ");
                        owin.setText(" ");
                        xScore=0; oScore=0;
                        flag=0;
                    }
    
                }
            });
            i2=new JMenuItem("Exit");
            i2.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(e.getSource()==i2) {
                        jf.dispose();
                    }
    
    
                }
            });
            i3=new JMenuItem("Help");
            i3.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                if(e.getSource()==i3) {
                    help();
                }
    
                }
            });
            menu1.add(i1);
            menu1.add(i2);
            menu2.add(i3);
    
            bar.add(menu1);
            bar.add(menu2);
            jf.setJMenuBar(bar);
    
            reset.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
    
                    if(e.getSource()==reset) {
                        for(int i=0; i<3 ;i++) {
                            for(int j=0;j<3;j++) {
                                jb[i][j].setText(" ");
                            }
                        }
                        flag=0;
                    }
                }
            });
            jf.add(reset);
            xjl.setText("XWINS: ");
            ojl.setText("O WINS:");
            String str= "THIS GAME IS DEVELOPED BY ANAND, THIS IS SIMPLE TIC TAC TOE \n 1)THERE ARE TWO PLAYERS X AND O"
                    + "\n 2)IF WE PRESS THE BUTTON, WE GET X OR O DEPENDING ON PREVIOUS ACTION"
                    + "\n 3) IF X IS PRINTED 3 TIMES IN A ROW IN ANY DIRECTION, X IS WINNER, SAME FOR 0";
            tf= new JTextArea();
            tf.setText(str);
            tf.setEditable(false);
            jf.add(tf);
            jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
        }
    
        public static void main(String args[]) {
            TicTacToe tt= new TicTacToe();
            tt.selectGame();
    
    
        }
    
        public void help() {
            JOptionPane.showMessageDialog(jf, tf);
        }
        public void winLogic() {
    
    
            boolean xwc1= jb[0][0].getText().equals("X")&&jb[1][1].getText().equals("X")&&jb[2][2].getText().equals("X")
                    ?true:false;
            boolean xwc2=jb[0][2].getText().equals("X")&&jb[1][1].getText().equals("X")&&jb[2][0].getText().equals("X")
                    ?true:false;
            boolean xwc3=jb[0][0].getText().equals("X")&&jb[1][0].getText().equals("X")&&jb[2][0].getText().equals("X")
                    ?true:false;
            boolean xwc4=jb[0][0].getText().equals("X")&&jb[0][1].getText().equals("X")&&jb[0][2].getText().equals("X")
                    ?true:false;
            boolean xwc5=jb[0][1].getText().equals("X")&&jb[1][1].getText().equals("X")&&jb[2][1].getText().equals("X")
                    ?true:false;
            boolean xwc6=jb[0][2].getText().equals("X")&&jb[1][2].getText().equals("X")&&jb[2][2].getText().equals("X")
                    ?true:false;
            boolean xwc7= jb[1][0].getText().equals("X")&&jb[1][1].getText().equals("X")&&jb[1][2].getText().equals("X")
                    ?true:false;
            boolean xwc8=jb[2][0].getText().equals("X")&&jb[2][1].getText().equals("X")&&jb[2][2].getText().equals("X")
                    ?true:false;
    
    
            boolean owc1= jb[0][0].getText().equals("O")&&jb[1][1].getText().equals("O")&&jb[2][2].getText().equals("O")
                    ?true:false;
            boolean owc2=jb[0][2].getText().equals("O")&&jb[1][1].getText().equals("O")&&jb[2][0].getText().equals("O")
                    ?true:false;
            boolean owc3=jb[0][0].getText().equals("O")&&jb[1][0].getText().equals("O")&&jb[2][0].getText().equals("O")
                    ?true:false;
            boolean owc4=jb[0][0].getText().equals("O")&&jb[0][1].getText().equals("O")&&jb[0][2].getText().equals("O")
                    ?true:false;
            boolean owc5=jb[0][1].getText().equals("O")&&jb[1][1].getText().equals("O")&&jb[2][1].getText().equals("O")
                    ?true:false;
            boolean owc6=jb[0][2].getText().equals("O")&&jb[1][2].getText().equals("O")&&jb[2][2].getText().equals("O")
                    ?true:false;
            boolean owc7= jb[1][0].getText().equals("O")&&jb[1][1].getText().equals("O")&&jb[1][2].getText().equals("O")
                    ?true:false;
            boolean owc8=jb[2][0].getText().equals("O")&&jb[2][1].getText().equals("O")&&jb[2][2].getText().equals("O")
                    ?true:false;
             boolean xw=xwc1||xwc2||xwc3||xwc4||xwc5||xwc6||xwc7||xwc8;
             boolean ow=owc1||owc2||owc3||owc4||owc5||owc6||owc7||owc8;
            if(flag!=2) {
             if(xwc1||xwc2||xwc3||xwc4||xwc5||xwc6||xwc7||xwc8) {
                JOptionPane.showMessageDialog(jf, "X WON...");
                xScore++;
                xwin.setText(""+xScore);
                flag=2;
    
            }
            else if(owc1||owc2||owc3||owc4||owc5||owc6||owc7||owc8) {
                JOptionPane.showMessageDialog(jf, "O WON...");
                oScore++;
                owin.setText(""+oScore);
                flag=2;
            } 
            }
            int num=0; 
            int X= xw?0:1;
            int O= ow?0:1;
            for(int i=0; i<3;i ++) {
                for(int j=0;j<3;j++) {
                    if(!jb[i][j].getText().equals(" "))
                        num++;
                }
            }
            if((num==9)&&((X==1)&&(O==1))) {
                JOptionPane.showMessageDialog(jf, "DRAW");
                flag=2;
    
            }
        }
        @Override
        public void actionPerformed(ActionEvent e) {
    
    
                for(int i=0; i<3; i++) {
                    for(int j=0 ;j<3; j++) {
    
    
                        if(e.getSource()==jb[i][j]) {
                            if(jb[i][j].getText().equals(" ")) {
                                if(flag==0) {
                                    jb[i][j].setText("X");
                                    flag=1;
    
                                }
                                else if(flag==1){
                                    jb[i][j].setText("O");
                                    flag=0;
                                }
                                else if(flag==2) {
                                    JOptionPane.showMessageDialog(jf, "This game is already over, please click reset!");
                                }
                            } else {
                                ;
                            }
                        }
                    }
    
                }
                winLogic(); 
            }
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多