这是我在简书的第一篇博客,刚好最近用java开发了五子棋游戏,现将开发过程以及感想总结记录下来,如果真的有人看到了这篇文章,希望里面的内容能够帮到你。
首先是原型设计,先看图看图,见下图

设计图如下

解释一下我眼中的五子棋游戏。在开发之前,我一直再思考,现在传统的五子棋游戏还有没有改进玩法的可能性,从而让它变得更加有趣呢?我首先给了自己肯定的答案,然后每天开脑洞,终于想到了在本游戏中的核心玩法--“让子”。
所谓的“让子”操作就是当前玩家回合中,该玩家选择不下子而让对方玩家下子,即打破黑白子的数量平衡,这是我眼中的五子棋的核心玩法。
原型有了,设计图也ok了,接下来就是逻辑流程图+技术实现了。
部分逻辑图如下(流程太长,只截取部分)


相关类、实体如下


其中关键的棋盘数据采用二维数组进行建模,所有的逻辑操作的实现均转换成对二维数组的处理。
下面是关键代码的张贴,判定输赢的逻辑代码如下
/**
* 判断游戏是否结束
*/
public int isOver() {
int tmp = NONE;// 记录棋子
for (int i = 0; i < this.size; i++) {
for (int j = 0; j < this.size; j++) {
tmp = gobang[i][j];
if (tmp != NONE) {
// 判断斜上方
if (i >= 4 && j <= this.size - 5) {
for (int k = 1; k <= 4; k++) {
if (tmp != gobang[i - k][j + k]) {
break;
}
if (k == 4) {
// 判断是哪一方赢了
if (tmp == BLACK)
return BLACK_WIN;
if (tmp == WHITE)
return WHITE_WIN;
}
}
}
// 判断斜下方
if (i <= this.size - 5 && j <= this.size - 5) {
for (int k = 1; k <= 4; k++) {
if (tmp != gobang[i + k][j + k]) {
break;
}
if (k == 4) {
// 判断是哪一方赢了
if (tmp == BLACK)
return BLACK_WIN;
if (tmp == WHITE)
return WHITE_WIN;
}
}
}
// 判断横向
if (j <= this.size - 5) {
for (int k = 1; k <= 4; k++) {
if (tmp != gobang[i][j + k]) {
break;
}
if (k == 4) {
// 判断是哪一方赢了
if (tmp == BLACK)
return BLACK_WIN;
if (tmp == WHITE)
return WHITE_WIN;
}
}
}
// 判断纵向
if (i <= this.size - 5) {
for (int k = 1; k <= 4; k++) {
if (tmp != gobang[i + k][j]) {
break;
}
if (k == 4) {
// 判断是哪一方赢了
if (tmp == BLACK)
return BLACK_WIN;
if (tmp == WHITE)
return WHITE_WIN;
}
}
}
}
}
}
return NOT_OVER;
}
服务器和客户端的采用socket进行通信,服务器会和每个玩家建立专门的线程进行通信,客户端在正式进入游戏之前需要用户输入用户名进行登录,本程序中输入任意用户名即可(只要不与另外一个玩家重复),登录完成后等待另外一个玩家登录后即可进入游戏。
整个开发完成之后的效果如下图



源码点击下面的链接:
http://download.csdn.net/download/pulan_peng/9771289
PS:下载可能需要积分,我也实在不想搞需要积分下载这一套,但是CSDN不允许我编辑,所以将就一下。
网友评论