Java小游戏-五子棋

摘 要

五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。五子棋的棋具与围棋通用,是一种传统的棋种。

规则为双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。五子棋容易上手,老少皆宜,而且趣味横生,引人入胜:它不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

许多国家的人对五子棋都有不同的爱称,例如,韩国人把五子棋称为“情侣棋”,表示情人之间下五子棋有利于增加情感的交流;欧洲人称其为“绅士棋”,代表下五子棋的君子风度胜似绅士;日本人则称其为“中老年棋”,说明五子棋适合中老年人的生理特点和思维方式。

本文采用JAVA语言,应用鼠标监视器,用窗体结构绘制了一个五子棋棋盘,用函数的方式,计算了五子棋黑白棋的胜利方式,用JAVA语言还原了传统五子棋的游戏方式,看似这个游戏很简单,但对于刚接触JAVA的新手来说是个挑战,由于水平有限不能做成和电脑对战,故退而改为单机版双人对战,做成一个自己和自己对战的五子棋来考验。

关键词 JAVA 监视器 窗体结构 五子棋

游戏规则:

棋子分为黑白两色,采用15×15棋盘。

自己和自己对战,白子和黑子交替下,直到白子或黑子一方有五粒子连成一线,最先完成一方获胜(可以横、竖、左斜、右斜)。

有棋子的地方不允许再下棋子。

胜利后,棋局重新开始。

棋盘如下:

  • 程序所需基础

1.1 实现五子棋界面所需要的类

JFrame  顶级容器类

BorderLayout  框架布局类——把容器分为上北下南左西右东中间五个部分,每个部分只能添加一个组件。在这里我们需要把整个界面分为左右两部分。选择在框架布局的中间和右边两个部分。这里我们还需要另一个容器类——JPanel  面板容器类。主要用来实现右边的部分,因为原本框架布局的右边部分只能添加一个组件,但是我们需要添加的组件不只一个,因此就先这个部分加上一个JPanel,然后再在JPanel上加我们需要的组件,包括按钮等等。JFrame和JPanel的区别:JFrame是最底层的容器,JPanel放在它上面,同一个界面只有一个JFrame,但是一个JFrame上面可以有多个JPanel。相当于JFrame是一个大餐桌,JPanel是盘子,如果我们要对餐桌JFrame上的东西进行管理分类等,我们就需要使用这些JPanel盘子。FlowLayout   流式布局类。因为我们右边的JPanel部分需要将按钮等组件由上到下进行排列。

JButton  按钮组件类

JComboBox   下拉列表框类——实现那个人人对战和人机对战的选择

Dimension  封装组件宽度和高度的类——组件类不能直接用setSize方法来设置

1.2 事件监听机制的类

ActionListener  状态监听处理类

ActionEvent   状态监听事件,监听某个组件的状态是否有改变

MouseListener  鼠标监听处理类

MouseEvent  鼠标监听事件,里面包含鼠标被点击等事件的处理方法。当界面被点击时就放下一个棋子。

需要重写GoBangframe的重绘方法,使其在界面刚生成时就产生一个15*15的棋盘。(重绘方法会在每次页面大小被改变时执行,因此当你改变大小时,棋盘不会消失)。这里我们可以通过两个for循环画出15条行线和15条列线。

  • 各个功能实现的思路

2.1 一个15×15的五子棋界面

首先定义变量int map[][]=new int[16][16],构建一个大小适宜的棋盘界面,定义黑白棋子变量,1为白,2为黑,然后定义胜利者。

其次划定窗口设置,规定窗体大小、窗体关闭时主线程自动关闭,为了美观,设置窗体出现在显示器中中间,设置窗体固定大小,并设定窗体的标题。

我们还需要画组件,使之与五子棋更加契合,更加相似。为了确保不会出现异常情况,我在这里添加了一个try-catch语句,如果发现问题可以抛出异常。

2.2 能够在界面上下黑白棋子

实现这个功能需要定义一个变量turn表名当前轮到哪方下棋。如果turn=1表明轮到黑方,turn=2表明轮到白方。每次黑方下完棋之后turn+1,白方下完棋之后turn-1。

为了能够在窗体上实现下棋这一动作,便需要给面板添加一个鼠标监听事件,即在面板pj上,pj.addMouseListener(new MyMouse(this))。

下五子棋首先要设定五子棋的两种棋子,为了保证棋盘的美观,同样也是为了更加的贴合实际,我设定棋子的大小是方格中最大圆的大小,规定如果map[i][j]==1,则该棋子颜色为白,如果map[i][j]==2,则该棋子颜色为黑。当然,一局结束决出胜者之后,要开始下一轮的角逐,如果出现胜者,点击鼠标,将返回最开始的初始状态,便可开始下一轮的战斗。

2.3 相同位置不能下多个棋子

判断isArray[i][j]是不是等于0,如果是0就可以下,如果不是则提示玩家下在其它地方。

2.4 判定游戏胜利

五子棋的游戏胜利分为几种情况,横向、纵向、右斜、左斜五子连成一线,那么如何对胜负进行判断呢?根据五子连成一线的规则,那便是对一个棋子的一个方向的10颗棋子进行判断,是否满足五子连续。

首先是左右判断,如果map[x][i]==map[x][i+1],那么进行一个num的累加,如果当num>=5时,判定游戏结束,某方胜利。同理,对上下判断时,将目光放在map[i][y]==map[i+1][y]上,当num>=5时,判定游戏结束,某方胜利。

对右斜和左斜判断游戏胜利来说比左右、上下判断要麻烦一些。对于右斜判断,首先要规定,int i=0,i=0并且(i-j)=5时,判定游戏结束,某方胜利。

对于左斜判断,首先规定int i=-map.length,i=0并且(i+j)=5时,游戏结束,判定某方胜利。

综上所述,五子棋的四种 胜利方式都设定完毕。

重要算法

 横向胜利相关代码

int num = 1;

for (int i = 0; i < 14; i++) {

if (map[x][i] != 0) {

if (map[x][i] == map[x][i + 1]) { num++;

if (num >= 5) {

System.out.println("win");

return true;

}

} else {

num = 1;

}

}

}

3.3.4 竖向胜利相关代码

num = 1;

for (int i = 0; i < 14; i++) {

if (map[i][y] != 0) {

if (map[i][y] == map[i + 1][y]) {

num++;

if (num >= 5) {

System.out.println("win");

return true;

}

} else {

num = 1;

}

}

}

3.3.5 右斜胜利相关代码

for (int i = 0; i < map.length*2-1; i++) {

for (int j = 1; j < map.length ; j++) {

if (((i - j) >= 0) && ((i - j) < map.length)) {

if(map[j][i-j]!=0){

if(map[j][i-j]==map[j-1][i-j+1]){

num++;

if (num >= 5) {

System.out.println("win");

return true;

}

}else{

num=1;

}

}

}

}

}

3.3.6 左斜胜利相关代码

for (int i = -map.length; i < map.length; i++) {

for (int j = 1; j < map.length; j++) {

if(((i+j)>=0)&&((i+j)

if(map[j][j+i]!=0){

if(map[j][i+j]==map[j+1][i+j+1]){

num++;

if (num >= 5) {

System.out.println("win");

return true;

}

}else{

num=1;

}

}

}

}

}

 程序源码

https://download.csdn.net/download/m0_54570435/87715045


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部