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
对于左斜判断,首先规定int i=-map.length,i
综上所述,五子棋的四种 胜利方式都设定完毕。
重要算法
横向胜利相关代码
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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
