当前位置: 首页 > 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.lryc.cn/news/598465.html

相关文章:

  • 奇异值分解(Singular Value Decomposition, SVD)
  • 光通信从入门到精通:PDH→DWDM→OTN 的超详细演进笔记
  • day62-可观测性建设-全链路监控zabbix+grafana
  • 深度分析Java内存结构
  • 排序查找算法,Map集合,集合的嵌套,Collections工具类
  • SSM之表现层数据封装-统一响应格式全局异常处理
  • Spring AI 系列之二十四 - ModerationModel
  • 从0到1学习c++ 命名空间
  • 【Linux】linux基础开发工具(一) 软件包管理器yum、编辑器vim使用与相关命令
  • 【YOLOv8改进 - 特征融合】FCM:特征互补映射模块 ,通过融合丰富语义信息与精确空间位置信息,增强深度网络中小目标特征匹配能力
  • Springboot儿童医院问诊导诊系统aqy75(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 免费生成文献综述的网站推荐,助力高效学术写作
  • 408——数据结构(第二章 线性表)
  • 线段树学习笔记 - 练习题(2)
  • Flowable + Spring Boot 自定义审批流实战教程
  • 「iOS」黑魔法——方法交换
  • 词嵌入维度与多头注意力关系解析
  • 51c视觉~3D~合集4
  • 【C语言进阶】柔性数组
  • 11款Scrum看板软件评测:功能、价格、优缺点
  • C++标准库算法实战指南
  • Java基础day16-Vector类-Stack类-Collection子接口Set接口
  • 基础NLP | 02 深度学习基本原理
  • EasyExcel 模板导出数据 + 自定义策略(合并单元格)
  • 亚马逊云科技 EC2 部署 Dify,集成 Amazon Bedrock 构建生成式 AI 应用
  • 货车手机远程启动的扩展功能有哪些
  • QML 模型
  • java如何声明函数
  • Vulnhub Matrix-Breakout-2-Morpheus靶机攻略
  • jd h5st参数纯算