本文实例为大家分享了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