好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

JavaSE实现三子棋游戏

本文实例为大家分享了JavaSE实现三子棋游戏的具体代码,供大家参考,具体内容如下

用面向对象的思维把实现三子棋划分为四个模块:

main函数

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

public class main {

    public static void main(String[] args) {

        player player1 = new player();

        game game1 = new game(player1);

 

        while ( true ){

 

            game1.initialize();

 

            game1.play();

 

            game1.destroy();

 

            boolean b = player1.queryContinue();

            if (!b) {

 

                System.out.println( "欢迎下次继续游戏" );

                break ;

            }

 

 

        }

    }

}

棋盘模块设计

棋盘初始化

接受玩家落子并返回当前棋盘状态

接受AI落子并返回当前棋盘状态

判断获胜方、平局或是继续游戏,新游戏重置棋盘。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

import java.util.Arrays;

 

public class chessboard {

    private static final int 空白 = 0 ;

    private static final int 画圈 = 1 ;

    private static final int 画叉 = 2 ;

 

    private int [][] array = {

            {空白,空白,空白},

            {空白,空白,空白},

            {空白,空白,空白},

    };

 

    public boolean moveCircleAt( int row, int column){

        if (array[row][column] != 空白){

            return false ;

        }

        array[row][column] = 画圈;

        return true ;

    }

    public boolean moveCrossAt( int row, int column){

        if (array[row][column] != 空白){

            return false ;

        }

        array[row][column] = 画叉;

        return true ;

    }

    public static final int CIRCLE_WIN = 0 ;

    public static final int CROSS_WIN = 1 ;

    public static final int DRAW = 2 ;

    public static final int CONTINUE = 3 ;

 

    private static String display( int i){

        switch (i){

            case 空白: return " " ;

            case 画圈: return "@" ;

            case 画叉: return "*" ;

            default : return " " ;

        }

    }

    @Override

    public String toString() {

        String s = "+-+-+-+-+-+\n" ;

        for ( int i = 0 ;i< 2 ;i++){

            s +=  String.format( "|%s|%s|%s|\n" ,display(array[i][ 0 ]),display(array[i][ 1 ]),display(array[i][ 2 ]));

//           s += "+-+-+-+-+-+\n";

        }

        s +=  String.format( "|%s|%s|%s|\n" ,display(array[ 2 ][ 0 ]),display(array[ 2 ][ 1 ]),display(array[ 2 ][ 2 ]));

        s += "+-+-+-+-+-+" ;

        return s;

    }

 

    public int getState(){

        //按行判断

        for ( int i = 0 ;i< 3 ;i++){

            if (array[i][ 0 ] == array[i][ 1 ] && array[i][ 1 ]== array[i][ 2 ]){

                if (array[i][ 0 ] == 画圈 ){

                    System.out.println( "玩家胜" );

                    return CIRCLE_WIN;

 

                }

                else if (array[i][ 0 ] == 画叉){

                    System.out.println( "机器赢" );

                    return CROSS_WIN;

                }

            }

        }

        //列判断

        for ( int i = 0 ;i< 3 ;i++){

            if (array[ 0 ][i] == array[ 1 ][i] && array[ 1 ][i]== array[ 2 ][i]){

                if (array[ 0 ][i] == 画圈 ){

                    System.out.println( "玩家胜" );

                    return CIRCLE_WIN;

                }

                else if (array[ 0 ][i] == 画叉){

                    System.out.println( "机器赢" );

                    return CROSS_WIN;

                }

            }

        }

        //斜线判断

        if (array[ 0 ][ 0 ] == array[ 1 ][ 1 ] && array[ 1 ][ 1 ]== array[ 2 ][ 1 ]){

            if (array[ 1 ][ 1 ] == 画圈 ){

                return CIRCLE_WIN;

            }

            else if (array[ 1 ][ 1 ] == 画叉){

                return CROSS_WIN;

            }

        }

        if (array[ 0 ][ 2 ] == array[ 1 ][ 1 ] && array[ 1 ][ 1 ]== array[ 2 ][ 0 ]){

            if (array[ 1 ][ 1 ] == 画圈 ){

                return CIRCLE_WIN;

            }

            else if (array[ 1 ][ 1 ] == 画叉){

                return CROSS_WIN;

            }

        }

        //没人赢

        for ( int i = 0 ;i< 3 ;i++){

            for ( int j = 0 ;j< 3 ;j++){

                if (array[i][j] == 空白){

                    return CONTINUE;

                }

            }

        }

        return DRAW;

    }

 

    public void reset() {

        for ( int i = 0 ;i< 3 ;i++){

            Arrays.fill(array[i],空白);

        }

    }

}

玩家模块设计

输入想要落子的位置,决定退出游戏还是再来一局。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

import java.util.Scanner;

 

public class player {

    private final Scanner scanner = new Scanner(System.in);

 

    public int [] getStation(){

        System.out.println( "请输入要落子的位置,行,列,有效输入是0,1,2" );

 

        int r,c;

        while ( true ) {

            System.out.print( ">>>" );

              r = scanner.nextInt();

              c = scanner.nextInt();

 

              if (r >= 0 && r <= 2 &&c >= 0 && c <= 2 ){

                  break ;

              }

            System.out.println( "有效范围是0,1,2,请重新输入。" );

        }

 

        return new int [] {r,c};

    }

 

    public boolean queryContinue(){

        System.out.println( "是否再来一把?,请输入true or false" );

        System.out.println( ">>>" );

        return scanner.nextBoolean();

 

    }

}

AI(电脑)模块设计

生成随机坐标

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import java.util.Random;

 

public class AI {

    //返回落子的位置

    //第几行,第几列都是从0开始

    //有效值0~2

 

    private final Random random = new Random();

    int r,c;

    public int [] getStation(){

        r = random.nextInt( 3 );

        c = random.nextInt( 3 );

        return new int [] {r,c};

    }

}

游戏模块设计

初始化工作:打印提示内容和分割线,加载棋盘

判断是玩家落子还是AI落子

玩家落子情况下:判断玩家输入的合法性,超出边界或是覆盖落子都是不合法行为

AI落子情况下:判断输入的合法性。

控制棋盘重置新棋局

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

package 三子棋;

 

public class game {

    private final chessboard chessboard1;

    private final player player1;

    private final AI ai;

    public game(player player1){

        this .chessboard1 = new chessboard();

        this .player1 = player1;

        this .ai = new AI();

    }

    //游戏开始之前,进行一些准备工作

    public void initialize(){

 

        System.out.println( "欢迎进入井字棋游戏" );

        System.out.println( "规则如下;省略" );

        System.out.println( "===========================" );

        System.out.println(chessboard1);

 

    }

    public void play(){ //cintinue会继续,玩家胜,AI胜和平局 都是break,退出循环。

        while ( true ){

            if (playerTurn()){

                break ;

            }

            if (aiTurn()) {

                break ;

            }

 

        }

    }

    //游戏结束之前,完成一些收尾工作

    public void destroy(){

//        ai.reset();

//        player1.reset();

        chessboard1.reset();

    }

    private boolean playerTurn(){

 

        System.out.println( "玩家回合" );

 

 

        while ( true ){

            int [] rc = player1.getStation();

            int row = rc[ 0 ];

            int column = rc[ 1 ];

            if (chessboard1.moveCircleAt(row,column))

            {

                break ;

            }

            System.out.println( "该位置已经有子,请重新选择位置" );

        }

 

        System.out.println(chessboard1);

 

        if (chessboard1.getState() == chessboard.CONTINUE){

            return false ;

        }

        return true ;

    }

    private boolean aiTurn(){

        System.out.println( "AI回合" );

 

 

        while ( true ){

            int [] rc = ai.getStation();

            int row = rc[ 0 ];

            int column = rc[ 1 ];

            if (chessboard1.moveCrossAt(row,column))

            {

                break ;

            }

            System.out.println( "该位置已经有子,请重新选择位置" );

        }

 

        System.out.println(chessboard1);

        if (chessboard1.getState() == chessboard.CONTINUE){

            return false ;

        }

        return true ;

    }

}

代码还有不完善的地方,希望大家多提意见啦

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://blog.csdn.net/yemaozi1501/article/details/113826706

查看更多关于JavaSE实现三子棋游戏的详细内容...

  阅读:26次