五子棋

今天终于是把五子棋之人人大战的基本功能实现了,本来是想把界面美化一下再写总结的。唉,后来发现还是算了吧。这个java搞界面真的不适合啊,于是乎先把总结写了再说,那些美化,以及功能的完善什么的等晚点在慢慢去弄吧。
那么,下面咱们进入正题,一起探讨一下其实现方法。

一、界面

界面这东西java真心不适合弄啊,方正我是觉得好费心的。我的棋盘界面很简单朴素,就是由rows根横线和columns根竖线组成。具体代码如下:

1.棋盘的绘制
public void paint(Graphics g){
//调用父类paint方法
super.paint(g);
//绘制棋盘
//划横线
for(int i=0;i<config.rows;i++){
g.drawLine(config.x0, config.y0+i*config.size,config.x0+ (config.columns-1)*config.size, config.y0+i*config.size);
//划竖线
for(int j=0;j<11;j++){
g.drawLine(config.x0+j*config.size,config.y0, config.x0+j*config.size, config.y0+(config.rows-1)*config.size);
}
}


我的棋盘绘制是放在paint方法里面的。大家也看到了我的棋盘是用一根根横线和竖线组成的。 当然,肯定会有同学问,这段代码中诸如config.x0、y0、size、rows、colmns等变量都是哪来的,为什么不直接用数值体现呢,写的那么抽象。 呵呵,别急,下面我大家介绍一下我的这些变量。 首先还是看一段代码。

2.变量的设置
/**
* 用于协定五子棋界面所需的一些数据常量 如线条个数 大小 直径。。。目的是便于今后修改
* @author Administrator
*
*/
public interface config{
public static final int x0=50;//表格左上角起点的X值
public static final int y0=50;//表格左上角起点的y值
public static final int rows=11;//横向线的条数
public static final int columns=11;//纵向线的条数
public static final int chess_size=40;//棋子直径
public static final int size=50;//单元格的大小

}


嗯,没错,这些变量的值都是我事先定义好的,我之所以这么做是为了便于以后程序的扩展和调整。比如哪天我希望我的棋盘是15*15的大小,在这里我就只需要改2个地方。rows和colums的值。是不是很方便呢。

二、鼠标监听

做好界面,接下来要做的事情就是为我们的界面添加一个鼠标监听器,当我们在棋盘网格上点击时,就会相应的放上一颗棋子。
1.添加鼠标监听器
//给画布添加鼠标监听
this.addMouseListener(new chesslistener(g,this));

这个不用多说了吧,相信大家也练了很多了。
2,改写鼠标监听中,鼠标释放的方法
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;


public class chesslistener extends MouseAdapter{

private chessBorad chessborad;
private Graphics g[color=red];// 绘制棋子的对象
public static int [][]array=new int [config.rows][config.columns];// 存储 棋子的对象

private boolean state = true;// 表示黑白棋的标识,true!@@@@@@@@@@@黑棋,false@@@@@@@@@@@@@@白棋
//构造函数
public chesslistener(Graphics g,chessBorad chessborad){
this.g=g;
this.chessborad=chessborad;
}
[/color]
public void mouseReleased(MouseEvent e) {

// 获取到鼠标释放的坐标值
int x = e.getX();
int y = e.getY();
// 计算当前棋子所在的行和列
int row = (y - config.y0) / config.size;
if[align=left][/align] ((y - config.y0) % config.size > config.size / 2) {
row += 1;
}
int column = (x - config.x0) / config.size;
if ((x - config.x0) % config.size > config.size / 2) {
column += 1;
}
// 计算坐标
int x1 = column * config.size + config.x0;
int y1 = row * config.size + config.y0;
if ((row < config.rows && row >= 0)
&& (column < config.columns && column >= 0))
// 如果等于0,则表示该位置没有下过棋子
if (array[row][column] == 0) {
if (state) {// 表示下黑棋
g.setColor(Color.BLACK);
//计算,棋子画在交叉点位置
g.fillOval(x1 - config.size / 2,
y1 - config.size / 2, config.chess_size,
config.chess_size);
state = false;
// 存储棋子
array[row][column] = -1;
} else {
// 表示下白棋
g.setColor(Color.WHITE);
g.fillOval(x1 - config.size / 2,
y1 - config.size / 2, config.chess_size,
config.chess_size);
state = true;
// 存储棋子
array[row][column] = 1;
}


//判断输赢
if(win.ISHwin(row, column,array,chessborad))
state=true; // 将状态再次改为黑棋先下
if(win.ISSwin(row, column,array,chessborad))
state=true; // 将状态再次改为黑棋先下
if(win.ISXwin(row, column,array,chessborad))
state=true; // 将状态再次改为黑棋先下

}

}

}


[/align][/color]

三、判断输赢
下五子棋,总有输赢,我们不可能不停地下下去,当一方获胜后(并告知用户谁获胜),本局就应该结束,重新开始新的一轮比赛。具体代码如下:
import java.awt.Component;

import javax.swing.JOptionPane;

/**
* 判断胜负
* @author 吴泽鑫
* ISHwin() 判断是否为横向五子连心
* ISSwin() 判断是否为竖向五子连心
* ISXwin() 判断是否为斜向五子连心
*
*/
public class win {

//判断横向
public static boolean ISHwin(int row,int column,int [][]array,chessBorad chessborad){

int count = 1;// 用于统计所连棋子个数,默认为一
// 遍历这一行的右边列
for (int i = column + 1; i < array[row].length; i++) {
// 判断是否是相同的棋子
if (array[row][column] == array[row][i]) {
count++;
} else {
break;
}
}
// 遍历这一行的左边列
for (int i = column - 1; i >= 0; i--) {
// 判断是否是相同的棋子
if (array[row][column] == array[row][i]) {
count++;
} else {
break;
}
}
// 如果count等于5,说明五子连心,胜负已定
if(count >= 5){
if(array[row][column]==1&&array[row][column]!=0)
//弹出一个消息框,告诉用户结果
JOptionPane.showMessageDialog(null, "白棋赢啦");
else
if(array[row][column]==-1)
//弹出一个消息框,告诉用户结果
JOptionPane.showMessageDialog(null, "黑棋赢啦");

//胜负已定,需重新初始化界面,即将arry数组全部赋0
for(int i=0;i<array.length;i++)
for(int j=0;j<array[i].length;j++)
array[i][j]=0;

//刷新界面repaint()
chessborad.repaint();

return true;
}
else
return false;
}

public static boolean ISSwin(int row,int column,int [][]array,chessBorad chessborad){
int count = 1;// 统计棋子个数的
// 遍历这一列的右边行
for (int i = row + 1; i < array.length; i++) {
// 判断是否是相同的棋子
if (array[row][column] == array[i][column]) {
count++;
} else {
break;
}
}
// 遍历这一列的左边行
for (int i = row - 1; i >= 0; i--) {
// 判断是否是相同的棋子
if (array[row][column] == array[i][column]) {
count++;
} else {
break;
}
}
if(count >= 5){
if(array[row][column]==1&&array[row][column]!=0)
//弹出一个消息框,告诉用户结果
JOptionPane.showMessageDialog(null, "白棋赢啦");
else
if(array[row][column]==-1)
//弹出一个消息框,告诉用户结果
JOptionPane.showMessageDialog(null, "黑棋赢啦");

//胜负已定,需重新初始化界面,即将arry数组全部赋0
for(int i=0;i<array.length;i++)
for(int j=0;j<array[i].length;j++)
array[i][j]=0;
//重新刷新界面repaint()
chessborad.repaint();
return true;
}
else
return false;
}

//判断斜线方向

public static boolean ISXwin(int row,int column,int [][]array,chessBorad chessborad){
int count = 1;// 统计棋子个数的
// 遍历左斜下部分
for (int i = row + 1,j=column+1; i < array.length&&j<array[i].length; i++,j++) {
// 判断是否是相同的棋子
if (array[row][column] == array[i][j]) {
count++;
} else {
break;
}
}
// 遍历左斜上部分
for (int i = row - 1,j=column-1; i >= 0&&j>=0; i--,j--) {
// 判断是否是相同的棋子
if (array[row][column] == array[i][j]) {
count++;
} else {
break;
}
}
遍历右斜下部分
for(int i=row+1,j=column-1;i<array.length&&j>=0;i++,j--){
if (array[row][column] == array[i][j]) {
count++;
} else {
break;
}

}
遍历右斜上部分
for(int i=row-1,j=column+1;i>=0&&j<array[i].length;i--,j++){
if (array[row][column] == array[i][j]) {
count++;
} else {
break;
}

}
if(count >= 5&&array[row][column]!=0){

if(array[row][column]==1)
//弹出一个消息框,告诉用户结果
JOptionPane.showMessageDialog(null, "白棋赢啦");
else
if(array[row][column]==-1)
//弹出一个消息框,告诉用户结果
JOptionPane.showMessageDialog(null, "黑棋赢啦");

//胜负已定,需重新初始化界面,即将arry数组全部赋0
for(int i=0;i<array.length;i++)
for(int j=0;j<array[i].length;j++)
array[i][j]=0;

//重新刷新界面repaint()
chessborad.repaint();
return true;

}
else
return false;
}


}



好啦,到这里,我的简单的五子棋之人人对战程序已经写好啦。。。当然在功能和界面上还有很多需要完善的,这都会在我今后慢慢进行改进的。。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值