人人五子棋的实现

五子棋之人人五子棋的实现也算是继画板之后的另外一大工程了吧,不过还好,过程没有想象中的难,接下来就来看看如何实现简单的五子棋吧!!这是五子棋的界面,虽然说很粗糙简单,可是基本功能还是很齐全的~~~
[img]http://dl.iteye.com/upload/attachment/0076/3569/3edfc848-e1bb-3ade-b0c2-bb2e2f2429d1.jpg[/img]

首先还是要创建一个五子棋的界面,同时在界面上实现棋盘的重绘和棋子的重绘,具体代码如下:

public class WZQui extends JFrame implements WZQ{
private static Graphics g;
private int[][] array=new int[row][column];
private static boolean state=true;

//程序入口
public static void main(String args[]){
WZQui wzq=new WZQui();
wzq.showUI();
}
//初始化界面的方法
public void showUI(){
this.setTitle("五子棋");
this.setSize(new Dimension(600,600));
this.setLocationRelativeTo(null);
this.setResizable(false);//界面不可改变大小
this.setDefaultCloseOperation(3);
this.setVisible(true);
g=this.getGraphics();
ChessListener cl=new ChessListener(g,array);
this.addMouseListener(cl);
}
//棋盘界面的重绘
public void paint(Graphics g){
super.paint(g);
//重绘窗体的同时绘制棋盘
chess_paint(g);
// 实现棋子重绘
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] == -1) {
g.setColor(Color.BLACK);
DrawChess(i, j, g);
}
if (array[i][j] == 1) {
g.setColor(Color.WHITE);
DrawChess(i, j, g);
}
}
}

}
//定义一个绘制棋盘的方法
public void chess_paint(Graphics g){
//画棋盘的横线
for(int i=0;i<WZQ.row;i++){
g.drawLine(WZQ.X, WZQ.Y+WZQ.size *i,
WZQ.X+(WZQ.column-1)*WZQ.size,WZQ.Y+i*WZQ.size);
}
//画棋盘的竖线
for(int j=0;j<WZQ.column;j++){
g.drawLine(WZQ.X+WZQ.size*j, WZQ.Y, WZQ.X+WZQ.size*j,
WZQ.Y+(WZQ.row-1)*WZQ.size);
}
}
/**
* 绘制棋子的方法
* @param i表示行
* @param j表示列
* @param g表示画布对象
*/
public void DrawChess(int i,int j,Graphics g){
g.fillOval(i * WZQ.size + WZQ.X - WZQ.size / 2,
j* WZQ.size + WZQ.Y - WZQ.size / 2,
chess_size, chess_size);
}
}


然后再创造一个接口,里面放一些五子棋的基本属性,如棋盘的大小,棋子的大小,棋盘的行数和列数等等,方便以后进行修改。

public interface WZQ {
//定义五子棋界面的行数为15
public static final int row=15;
//定义五子棋界面的列数为15
public static final int column=15;
//定义五子棋的单元格的大小
public static final int size=35;
//定义五子棋界面的初始横坐标50
public static final int X=50;
//定义五子棋界面的初始竖坐标50
public static final int Y=50;
//设置棋子的直径
public static final int chess_size=35;
}

然后就是建立一个监听器类,实现对棋子的监听

public class ChessListener extends MouseAdapter {
//画棋子的对象
private Graphics g;
private int x,y;
private int x1,y1;
private int m,n;
private boolean state=true;

//存储棋子的对象
private int array[][];
private Win win;
//构造函数
public ChessListener(Graphics g,int [][] array){
this.g=g;
this.array=array;
win=new Win(array);

}
public void mouseReleased(MouseEvent e){
//得到鼠标事件发生的时候光标的位置
x1=e.getX();
y1=e.getY();
//按行遍历棋盘,坐标(i,j)
for(int i=0;i<WZQ.row;i++){
for(int j=0;j<WZQ.column;j++){
//交叉点的坐标(x,y)
x=WZQ.X+WZQ.size*i; //横坐标
y=WZQ.Y+WZQ.size*j; //纵坐标
if(array[i][j]==0)
// 判断离谁更近
if(x1>x-WZQ.size/3&&x1<x+WZQ.size/3&&y1>y-WZQ.size/3
&&y1<y+WZQ.size/3)
//如果状态是true,就放黑棋
if(state){
g.setColor(Color.black);
g.fillOval(x-WZQ.chess_size/2, y-WZQ.chess_size/2,
WZQ.chess_size, WZQ.chess_size);
state=false;
array[i][j]=-1;
m=i;
n=j;
break;
}
//如果状态是false,就放白棋
else{
g.setColor(Color.white);
g.fillOval(x-WZQ.chess_size/2, y-WZQ.chess_size/2,
WZQ.chess_size, WZQ.chess_size);
state=true;
array[i][j]=1;
m=i;
n=j;

break;
}

}

}
win.win_or_not(m,n);


}

}


最后是判断输赢方法的类,由于判断输赢有四种可能,即横向,竖向,左斜方,又斜方,所以这个类里面应该有四个方法。

public class Win {
//存储棋子的数组
private int array[][]=new int[WZQ.X ][WZQ.Y ];
//构造函数
public Win(int[][] array){
this.array=array;
}
//判断棋子竖向赢的方法,x和y是棋子的坐标
public boolean winS(int x,int y){
int count=0;//统计棋子的个数
//遍历这一行的列
//开始找左相邻的颜色相同的棋子
for(int i=y;i>=0;i--){
if(array[x][y]==array[x][i]){
count++;
}
else
break;
}
//找右相邻的颜色相同的棋子
for(int i=y+1;i<WZQ.Y;i++){

if(array[x][y]==array[x][i])
count++;
else
break;
}

//如果有5个或者5个以上颜色相同的棋子,返回true
if(count>=5)
return true;

else
return false;

}
//判断棋子横向赢的方法
public boolean winH(int x,int y){
int count=0;
for(int i=x;i>=0;i--){
if(array[x][y]==array[i][y])
count++;
else break;
}
for(int i=x+1;i<WZQ.X;i++){
if(array[x][y]==array[i][y]){
count++;

}
else break;
}

if(count>=5)
return true;
else
return false;
}
//判断棋子左斜方赢得方法
public boolean winL(int x,int y){
int count=0;
for(int i=x,j=y;i>=0&&j>=0;i--,j--){
if(array[x][y]==array[i][j])
count++;
else break;
}

for(int i=x+1,j=y+1;i<WZQ.X&&j<WZQ.Y;i++,j++){
if(array[x][y]==array[i][j])
count++;
else break;
}
if(count>=5)
return true;
else
return false;

}
//判断五子棋右斜方赢得方法
public boolean winR(int x,int y){
int count=1;
for(int i=x-1,j=y+1;i>=0&&j<WZQ.Y;i--,j++){
if(array[x][y]==array[i][j])
count++;
else break;
}
for(int i=x+1,j=y-1;i<WZQ.X&&j>=0;i++,j--){
if(array[x][y]==array[i][j])
count++;
else break;
}
if(count>=5)
return true;
else return false;
}

/**
* 验证棋子输赢的方法
*/
public void win_or_not(int row,int column){
//判断是否五子相连
if(winS(row,column)||winH(row,column)||winL(row,column)
||winR(row,column)){
if(array[row][column]==1){
//调用服务方法
showMessage("oh yeah!!!白棋胜利");
}
else if(array[row][column]==-1){

showMessage("黑棋胜利");
}
}
}
/**
* 显示弹出框的方法
*/
public void showMessage(String message){
JOptionPane.showMessageDialog(null, message);
}
}

以上就是五子棋简单实现的全部代码,只要细心用心肯下功夫,总会成功的完成我们的目标,接下来的任务还是多多的,要更努力哦。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值