目录
一、项目简介
功能描述:这个项目实现了一个简单的单机五子棋游戏,包括图形用户界面、棋盘绘制、下棋、悔棋、重新开始等功能,玩家可通过按钮或鼠标与系统交互。
二、功能架构图或主要功能流程图
三、个人任务简述
1. 完成的任务与功能
序号 | 完成功能与任务 | 描述 |
1 | 实现了鼠标点击棋盘的监听功能 | 在ChessBoard 类中添加了 MouseListener 接口,实现了鼠标点击事件的监听,确保能够捕捉用户在棋盘上的点击动作。 |
2 | 处理用户点击事件 | 在 mousePressed 方法中,根据用户点击的像素坐标计算出对应的棋盘坐标(xIndex 和 yIndex),确保落子位置的准确性。 |
3 | 判断是否在 合法位置落子 | 在 mousePressed 方法中,通过判断游戏是否结束,以及点击位置是否合法,决定是否在该位置落子。 |
4 | 悔棋功能 | 编写了 undoMove 方法,使玩家能够在游戏进行中撤销上一步的落子操作。 |
5 | 判断游戏是否结束 | 在 mousePressed 方法中,通过调用 checkWin 方法判断当前玩家在落子后是否取得胜利,以及检查是否达到平局条件。在满足这些条件时,触发游戏结束,弹出相应的提示框。 |
2.Git提交记录截图:
四、本人负责功能详解
1. *判断游戏是否结束功能
简述: 实现了判断游戏是否结束的功能,通过 checkWin 方法检查当前局面是否有一方胜利或平局。这是整个游戏逻辑的核心,决定了游戏何时结束以及如何结束。
关键代码截图:
2.绘制棋盘和棋子功能
简述: 实现了绘制游戏棋盘和棋子的功能,通过 ChessBoard 类完成,包括棋盘的绘制、鼠标事件监听和相应的处理。此功能为整个系统的基础,为后续游戏进行提供了可视化界面。
关键代码截图:
3. 悔棋和重新开始功能
简述: 实现了悔棋和重新开始游戏的功能,通过 undoMove 和 restartGame 方法完成。这两个功能提供了更好的用户体验,使得玩家在错误操作或游戏结束后能够方便地进行下一步。
关键代码截图:
五、课程设计总结及展望
5.1 总结:
课程设计包括以下主要功能:
绘制游戏棋盘: 利用Java的Swing库,实现了一个可视化的游戏界面,包括五子棋的棋盘和棋子。
实现下棋功能: 通过鼠标事件监听,玩家可以在棋盘上点击空白位置,落子,并在棋盘上绘制相应颜色的棋子。
悔棋功能: 提供了悔棋的功能,玩家可以撤销上一步的操作,回到上一个游戏状态。
重新开始游戏: 提供了重新开始游戏的按钮,使玩家可以在游戏进行中或结束后重新开始一局。
判断胜负: 实现了简单的胜负判断算法,当任意一方在横、竖、斜方向上连成五子时,游戏判定为结束。
界面友好提示: 在特定情况下,如游戏结束或无法落子的位置,提供了友好的弹窗提示信息。
5.2 展望:
不足之处及改进方法
算法优化: 尽管已经完成了五子棋的基本功能,但在判断胜负的算法上可能存在一些性能瓶颈。在后续,我想进一步优化算法,提高判断胜负的效率,特别是对于大规模的棋盘。
界面交互: 目前的界面较为简单,缺乏一些用户友好的交互设计。我想学习更多关于用户界面设计的知识,以改进游戏的用户体验,增加一些动画效果和提示信息。
代码结构: 随着功能的增加,代码可能变得更加复杂,难以维护。我想引入更合理的代码结构和设计模式,以提高代码的可读性和可维护性。
六、课程设计感想
1. 描述课设中碰到的困难及自己为了解决困难的所思所想(分点列出)。
我在测试程序的过程中发现,如果五子棋的位置在四个角的对角线上,那么是无法判断输赢的,例如下面这种情况:
我在检查代码过程中发现问题出在问题出在对角线上的判断上。在检查斜向(撇和捺)的时候,我发现对角线上的棋子可能越界。因此我针对这个问题,专门重写了win方法。在原本的win方法中,对于撇(左上到右下的对角线)和捺(左下到右上的对角线)的判断,需要分别考虑不同的情况。这样的实现较为繁琐,容易出错。于是我将对角线的判断逻辑进行简化,并且保持一致性。
private boolean checkWin(int x, int y, boolean isBlackTurn) {
String pieceColorName = isBlackTurn ? "黑棋" : "白棋";
return checkLine(x, y, 1, 0, pieceColorName) || // 横向
checkLine(x, y, 0, 1, pieceColorName) || // 纵向
checkLine(x, y, 1, 1, pieceColorName) || // 撇
checkLine(x, y, 1, -1, pieceColorName); // 捺
}
private boolean checkLine(int x, int y, int dx, int dy, String pieceColorName) {
int count = 1;
int nx, ny;
// 检查正方向
nx = x + dx;
ny = y + dy;
while (nx >= 0 && nx < ROWS && ny >= 0 && ny < COLS && board[nx][ny].equals(pieceColorName)) {
count++;
nx += dx;
ny += dy;
}
// 检查反方向
nx = x - dx;
ny = y - dy;
while (nx >= 0 && nx < ROWS && ny >= 0 && ny < COLS && board[nx][ny].equals(pieceColorName)) {
count++;
nx -= dx;
ny -= dy;
}
return count >= 5;
}
修改后程序成功,我也收获了解决问题带来的成就感。
2. 进一步计划:
学习更高级的图形库: 虽然Swing是一个强大的库,但我希望在未来能够学习使用JavaFX等更为现代的图形库,以提升图形界面的设计水平。
引入网络对战功能: 目前的五子棋是单机版的,未来我计划研究并添加网络对战的功能,让玩家能够与其他玩家进行实时对弈。
持续学习新技术: 在完成课程设计的过程中,我发现自己对某些领域的了解还不够深入,比如多线程处理、数据库存储等。未来我希望能够深入学习这些知识,为项目的改进和扩展提供更多可能性。
七、参考文献
http://t.csdnimg.cn/tAgGr
http://t.csdnimg.cn/ZrHD0