当前位置: 首页 > news >正文

【从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){}}

玩家落子逻辑

  1. 实现A玩家和B玩家交替落子
    使用i记录次数,通过i的奇偶来判断当前回合到哪个玩家
  2. 定位棋盘中的落子位置
    行位置:int row = position / chessboard.length;
    列位置: int col = position % chessboard[0].length;
  3. 特殊情况判断
    棋盘已经全部落子完毕,但仍未分出胜负,则为平局
  4. 音效播放
    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();}

五子棋落子后棋盘突出不对齐问题

修改字体即可:
在这里插入图片描述


如果我的内容对你有帮助,请 点赞 评论 收藏 。创作不易,大家的支持就是我坚持下去的动力!
在这里插入图片描述

http://www.dtcms.com/a/296176.html

相关文章:

  • 「OC」源码学习——属性关键字
  • 基于深度学习的胸部 X 光图像肺炎分类系统(一)
  • STL学习(?map容器)
  • C++性能优化实战‘从毫秒到微秒的底层突围‘
  • C++ 性能优化
  • WPF 控制动画开关
  • 一键修复ipynb,Jupyter Notebook损坏文件
  • redis前期工作:环境搭建-在ubuntu安装redis
  • 基于xxl-job的分片实现分库分表后的扫表
  • Qt WebEngine Widgets的使用
  • MCNN-BiLSTM-Attention分类预测模型等!
  • ChemDraw23软件下载及安装教程|附带软件下载文件|ChemDraw20-23pro版本
  • <<P4116 Qtree3>>
  • 胡良兵Nature Chem Eng:孔隙门控焦耳热精准升级聚乙烯为航油前驱物
  • 中央广播电视总台联合阿里云研究院权威发布《中国人工智能应用发展报告(2025)》:我国依旧需要大力注重人工智能人才的培养
  • Coze工作流-更多图像插件
  • 数据集成难在哪?制造企业该怎么做?
  • Docker多主机网络连接:实现跨主机通信
  • 主流摄像头协议及其开源情况,GB/T 28181协议介绍
  • 配电自动化终端中电源模块的设计
  • uniapp中flex布局gap属性兼容处理
  • PH73211L_VC1/PH73211LQ_VC1:低功耗USB HiFi音频解码器固件技术解析
  • QML WorkerScript
  • 【Spring Boot】热部署终极指南:IDEA高效配置与JRebel替代方案深度解析
  • 第4章唯一ID生成器——4.1 分布式唯一ID
  • Vimba相机二次开发教程,基于Python
  • R 语言科研配色 --- 第 81 期 (附免费下载的配色绘图PPT)
  • 【性能测试】Jmeter+Grafana+InfluxDB+Prometheus Windows安装部署教程
  • 重生学AI第二十集(大结局):完善模型以及学习总结
  • 【STM32】FreeRTOS 任务的删除(三)