🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### **1.1 项目目标** **1.1.1 知识目标** (1)Java基础语法 (2)字符串和数组 (3)类和对象 **1.1.2 能力目标** (1)熟练使用Java基础语言进行编码 (2)熟练对字符串和数组进行操作 (3)熟练掌握类的定义和对象的创建 **1.1.3 素养目标** (1)养成良好的类设计规范,类命名规范,属性命名规范,方法命名规范等习惯 (2)培养编程的计算思维,可以使用基础数据知识解决项目中的计算问题 (3)掌握类的抽象,对象的创建过程。 ### **1.2 案例描述** &emsp;&emsp;通过Java控制台程序完成一个五子棋游戏,能够实现黑白子交互下棋,程序自动判断输赢(需要完成判断输赢的算法),主要运用控制台输入坐标来实现。本系统采用数组进行数据管理(随着技术学习的深入,后续可以使用集合、文件或数据库进行数据管理)。 &emsp;&emsp;系统主要实现功能: (1)程序在设计初就定义黑棋先行,白棋随后。从第一个棋子开始交互顺序落子。 (2)通过坐标索引算出最先在棋盘的横向、竖向、斜向形成连续的相同色五棋子的一方为胜利。 (3)为保持界面洁净设为游戏界面设为固定。黑白交互下完棋子刷新界面。 (4)在游戏过程中或下完时可选择重新开始。 (5)赢家对话输出信息提示,选择游戏结束还是重新开始。 (6)游戏实现了基本的单机双人对战功能。 ### **1.3 实现效果** &emsp;&emsp;五子棋游戏的实现效果如下所示: ![](http://h.yiniuedu.com/9cb7f8d4b72ede7297b9e9b6f8994575) 图1 开始界面 ![](http://h.yiniuedu.com/c503689e498ec83cdaa4b9a896ee51a6) 图2退出界面 ![](http://h.yiniuedu.com/3029511ae9dfe4a9acbf5d9ac1c0106d) 图3 帮助界面 ![](http://h.yiniuedu.com/1c9f1d2734333e27153104b04cbe03c3) 图4 选择开始界面 ![](http://h.yiniuedu.com/36a4ea0b56dc5b2be0b7e19545b66de6) 图5 下棋界面 ![](http://h.yiniuedu.com/7bd5e345feb113538d4cdd0c13c04f18) 图6 获胜界面 ### **1.4 知识点** &emsp;&emsp;本实训节点涉及到的知识点如下: (1)Java基础语法 (2)字符串数组 (3)类和对象 ### **1.5 案例分析** #### **1.5.****1****功能划分** <table> <tr> <td>功能点</td> <td>难度</td> <td>备注</td> </tr> <tr> <td>选择游戏功能</td> <td> ★★</td> <td> </td> </tr> <tr> <td>下棋功能</td> <td>★★★★★</td> <td> </td> </tr> <tr> <td>判断获胜功能</td> <td>★★★★</td> <td> </td> </tr> <tr> <td>退出游戏功能</td> <td>★★</td> <td> </td> </tr> </table> #### **1.5.****2****概要设计** 1.设计五子棋类FiveChess 2.设计坐标点类Point 3.设计业务类游戏类Game 4.设计界面类MainView 5.设计输入工具类InputUtil #### **1.5.****3****详细设计** ![](http://h.yiniuedu.com/8912f3fdfed40dbfe2175ac104560fef) 类图 ### **1.6 实现要点** &emsp;&emsp;五子棋游戏设计与实现,请参照编码命名规范进行设计与实现。 项目名称:FiveChessGame 包名称:com.yiniuedu.cms.fivechessgame 1.定义五子棋类FiveChess,包含行、列、方向和存放数据的数组属性,然后分辨实现初始化方法、打印下棋过程界面、获取用户输入的方法、下棋位置方法、获胜方法、有效性验证方法、数据转化方法和是否胜利方法。 2.定义坐标点类Point,包含x坐标和y坐标两个属性。 3.定义业务类游戏类Game,包含FiveChess类型属性,包含帮助方法、开始游戏方法和下棋方法。 4.定义界面类MainClass,实现在控制台终端界面上打印输出五子棋棋盘和下棋位置。 5.定义输入工具类InputUtil,使用Scanner类,实现获取int类型和获取字符串类型数据的两个方法。 ### **1.7 重难点解析** &emsp;&emsp;本项目的重点是熟练使用Java基础语法,尤其是把基础教育中数学知识运用到项目中解决问题,掌握Java的数据类型和运算,熟练使用流程控制语句,把数据暂存到数组中,然后对数组中的数据进行增删改查操作。类的抽象和类的定义。对象的创建。 &emsp;&emsp;本项目的难点是如何实现把不同颜色的棋子存放到二维数组指定位置,然后把二维数组的数据按照指定格式输出。其次是如何实现判断8个方向上有连续5个颜色相同棋子,从而判断出获胜一方。理解面向过程编程向面向对象编程的转变。 ### **1.8 关键代码** ``` //五子棋类的方法 //下棋的方法 public void playChess() { init(); while (true) { printBord(); Point p = null; if (turn) { System.out.println("请白棋下,"); p = getInput(); bord[p.getX()][p.getY()] = 1; } else { System.out.println("请黑棋下,"); p = getInput(); bord[p.getX()][p.getY()] = -1; } if (isWin(p.getX(), p.getY(), bord[p.getX()][p.getY()])) { printBord(); announceWinner(); init(); break; } turn = !turn; } } // 8个方向判断是否同一颜色 public boolean isWin(int x, int y, int type) { // 八个方向搜索 // 往 1 8方向 int count = 0; int k = 0; int l = 0; // 往 1 方向算 k = x; l = y; for (int i = 0; i < 5; i++) { if (validation(k, l, type)) { count++; } else { break; } k--; l--; } // 往8方向算 k = x; l = y; for (int i = 0; i < 5; i++) { if (validation(k, l, type)) { count++; } else { break; } k++; l++; } if (count >= 6 || count <= -6) { return true; } // 往 2 方向算 count = 0; k = x; l = y; for (int i = 0; i < 5; i++) { if (validation(k, l, type)) { count++; } else { break; } k--; } // 往7方向算 k = x; l = y; for (int i = 0; i < 5; i++) { if (validation(k, l, type)) { count++; } else { break; } k++; } if (count >= 6 || count <= -6) { return true; } // 往3 方向算 count = 0; k = x; l = y; for (int i = 0; i < 5; i++) { if (validation(k, l, type)) { count++; } else { break; } k--; l++; } // 往6方向算 k = x; l = y; for (int i = 0; i < 5; i++) { if (validation(k, l, type)) { count++; } else { break; } k--; l++; } if (count >= 6 || count <= -6) { return true; } // 往 4方向算 count = 0; k = x; l = y; for (int i = 0; i < 5; i++) { if (validation(k, l, type)) { count++; } else { break; } l++; } // 往5方向算 k = x; l = y; for (int i = 0; i < 5; i++) { if (validation(k, l, type)) { count++; } else { break; } l--; } if (count >= 6 || count <= -6) { return true; } return false; } ``` ### **1.9 案例总结** &emsp;&emsp;本项目可以在面向过程编程思想的基础上实现,结合面向对象思想的编程中类和对象的概念,用来区分两种编程思想的不同之处,同时也可以很好的体现出面向对象编程的优势。 代码获取请加微信:yiniujiaoyu