【从0开始学习Java | 第3篇】阶段综合练习 - 五子棋制作
文章目录
- 目的
- 需求🤔
- 额外技术实现
- 静态变量
- 静态方法
- 开始制作
- 制作棋盘
- 胜利判断
- 锦上添花 --- 音效
- 玩家落子逻辑
- 主函数
- 五子棋落子后棋盘突出不对齐问题
目的
串联当前所学的知识,从而找出自己的不足之处,弥补自己的不足
需求🤔
五子棋棋盘为一个10 x 10的棋盘,五子棋玩家共2个(这里分别称为A和B),A在棋盘上落子后,B再落子,依次往复,直到一方胜利或者棋盘空间用完为止。判断胜利的条件是一条直线或者任意斜线上同时存在A或者B的连续5颗棋子(见下图):
额外技术实现
静态变量
语法
public static 数据类型 变量名 = 变量值;
解释说明
静态变量只能定义类中,不能定义在方法中。静态变量可以在static修饰的方法中使用,也可以在非静态的方法中访问。主要解决在静态方法中不能访问非静态的变量,实现某个变量可以在全局中访问。
静态方法
语法
public static 返回类型 方法名 (有无参数){}
解释说明
静态方法就相当于一个箱子,只是这个箱子中装的是代码,需要使用这些代码的时候,就把这个箱子放在指定的位置即可。引入这个是因为有一些代码重复使用性非常大,把它封装成一个静态方法,可以使得代码更加简洁。
开始制作
制作棋盘
利用二维数组制作棋盘,因为在使用过程中会反复打印棋盘,所以封装成一个静态方法:
public static char[][] chessboard = {{'┌','┬','┬','┬','┬','┬','┬','┬','┬','┐'},{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},{'└','┴','┴','┴','┴','┴','┴','┴','┴','┘'}};public static void showChessBoard(){for(int i=0;i<=9;i++)System.out.print(" "+i);System.out.println();for(int i=0;i<chessboard.length;i++){System.out.print(i+" ");for(int j=0;j<chessboard[i].length;j++){System.out.print(chessboard[i][j]);if(j!=chessboard[i].length-1)System.out.print("────");}if(i!=chessboard[i].length-1) {System.out.println();System.out.print(" ");for (int j = 0; j < chessboard[i].length-1; j++) {System.out.print("│ ");}System.out.print("│");}System.out.println();}}
胜利判断
注意:总共有四个方向需要判断,水平方向、竖直方向、从西北到东南方向(135度方向)、从东北到西南的方向(45度角方向)
public static boolean vinJudge(char currentChess) {for (int i = 0; i < chessboard.length; i++) {for (int j = 0; j < chessboard[i].length; j++) {//水平方向上存在同一玩家的连续5颗棋子boolean case1 = (j < chessboard[i].length - 4) && chessboard[i][j] == currentChess && chessboard[i][j + 1] == currentChess&& chessboard[i][j + 2] == currentChess && chessboard[i][j + 3] == currentChess&& chessboard[i][j + 4] == currentChess;//垂直方向boolean case2 = (i < chessboard.length - 4) && chessboard[i][j] == currentChess && chessboard[i + 1][j] == currentChess&& chessboard[i + 2][j] == currentChess && chessboard[i + 3][j] == currentChess&& chessboard[i + 4][j] == currentChess;// 135度角boolean case3 = (i < chessboard.length - 4) && (j < chessboard[i].length - 4) && chessboard[i][j] == currentChess && chessboard[i + 1][j + 1] == currentChess&& chessboard[i + 2][j + 2] == currentChess && chessboard[i + 3][j + 3] == currentChess&& chessboard[i + 4][j + 4] == currentChess;// 45度角boolean case4 = (i > 4) && (j < chessboard[i].length - 4) && chessboard[i][j] == currentChess && chessboard[i - 1][j + 1] == currentChess&& chessboard[i - 2][j + 2] == currentChess && chessboard[i - 3][j + 3] == currentChess&& chessboard[i - 4][j + 4] == currentChess ;if (case1 || case2 || case3 || case4) {System.out.println(currentChess == whiteChess ? "玩家A获得胜利" : "玩家B获得胜利");return true;}}}return false;}
锦上添花 — 音效
public static void playAudio(String fileName){URL url = Gobang.class.getResource(fileName);AudioClip clip = Applet.newAudioClip(url);clip.play();try{Tread.sleep(800L);}catch(InterruptedException e){}}
玩家落子逻辑
- 实现A玩家和B玩家交替落子
使用i记录次数,通过i的奇偶来判断当前回合到哪个玩家 - 定位棋盘中的落子位置
行位置:int row = position / chessboard.length;
列位置: int col = position % chessboard[0].length; - 特殊情况判断
棋盘已经全部落子完毕,但仍未分出胜负,则为平局 - 音效播放
playAudio(“音效文件名”);
public static char whiteChess = '○';public static char blackChess = '■';public static int times = 0;public static void errorPrint(){System.out.println("非法落子,请重新选择落子位置");}public static void start(){int totalPosition = chessboard.length*chessboard[0].length;for(int i=0;i<totalPosition;i++) {times++;System.out.println(i%2==0 ? "请玩家A落子":"请玩家B落子");while(true){Scanner sc = new Scanner(System.in);if(sc.hasNextInt()){int position = sc.nextInt();if(position>=0 && position < totalPosition ){char currentChess = (i % 2 ==0)?whiteChess:blackChess;int row = position / chessboard.length; //落子行位置int col = position % chessboard[0].length; //落子列位置if(chessboard[row][col]==blackChess || chessboard[row][col]==whiteChess){errorPrint();playAudio("illegal.wav");continue;}else {chessboard[row][col]=currentChess;playAudio("fill.wav");if( vinJudge(currentChess) ) {playAudio("win.wav");return;}break;}}}else{errorPrint();playAudio("illegal.wav");sc.next();}}showChessBoard();}if(times==totalPosition){System.out.println("平局");}}
主函数
public static void main(String[] args){showChessBoard();start();}
五子棋落子后棋盘突出不对齐问题
修改字体即可:
如果我的内容对你有帮助,请 点赞 , 评论 , 收藏 。创作不易,大家的支持就是我坚持下去的动力!