java五子棋
一、大致类
- 主类
- 建立UI(棋盘(1818/间距50则12001000)+开始/重新开始按钮)
- 下棋(确定位置、画出棋子、记录所下位置)
- 判断胜负、游戏结束、再来一局
二、实现思路
- 主类:Practice
- 建立UI:利用Swing 疑问:在创建界面、设置边界及位置、画线时如何快捷地确定坐标,毕竟屏幕坐标不容易获得
- 建立二维数组position[][]保存位置信息,0为默认(没有棋子),1为黑棋,2为白棋
- 画棋子方法:改变颜色、在指定位置画圆
- 设置监听器,在鼠标所点击位置放置棋子并改变位置信息 问题:在g=getGraphics时得到的为空指针 ##解决:在监听器外新增一个Panel并添加到主界面中,然后在监听器中利用Panel.getGraphics再传入响应函数中
- 判断胜利方法:横、纵、左上右下、右下左上,利用循环比较
- 一方获胜后重启游戏 // 待完成,暂时用new来代替
代码:
package p;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
public class UI extends JFrame{
public final int length=900,width=900,interval=50;
public int colorSwitch=1;//1为黑,2为白
public UI() {
JPanel panel = new JPanel();
this.setTitle("五子棋");//总框架
JLabel l=new JLabel();//按钮区
// this.setSize(1200, 1200);
// this.setLocation(10, 10);
this.setBounds(40,50,1200,1200);
Graphics g=this.getGraphics();
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.add(panel);
this.setVisible(true);
this.setResizable(false);
//初始化位置信息
int position[][]=new int[18][18];
for(int i=0;i<18;i++){
for(int j=0;j<18;j++){
//点(i,j)对应位置信息position[i-1][j-1]
position[i][j]=0;//初始化各点值为0,黑棋为1,白棋为2
}
}
//点击放棋子
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int x=e.getX(),y=e.getY();
int dx=(x-40)/interval,dy=(y-40)/interval;
int newx=dx*interval+25,newy=dy*interval;
// System.out.println(dx+" "+dy);
Graphics g1 = panel.getGraphics();
if(position[dx][dy]==0) {
if(colorSwitch==1) position[dx][dy]=1;
else position[dx][dy]=2;
paintChess(g1,newx,newy);
int result= check(position,dx,dy);
if(result==1) {
JOptionPane.showMessageDialog(null,
"黑棋获胜!","消息提示",JOptionPane.INFORMATION_MESSAGE);
new UI();
return;
}
if(result==2) {
JOptionPane.showMessageDialog(null,
"白棋获胜!","消息提示",JOptionPane.INFORMATION_MESSAGE);
new UI();
return;
}
return;
}
}});
}
public void paintBoard(Graphics g) {//画棋盘
for(int i=1;i<19;i++) {
g.drawLine(i*interval, 50, i*interval, width);//横线
g.drawLine(50, i*interval, length, i*interval);//竖线
}
}
public void paintChess(Graphics g,int x,int y) {
if(colorSwitch==1) {
g.fillOval(x, y, 40, 40);
colorSwitch=2;
}
else {
g.drawOval(x, y, 40, 40);
colorSwitch=1;
}
}
public void paint(Graphics g) {
paintBoard(g);
}
public int check(int a[][],int x,int y) {
// int flag=0;0正常,1黑赢,2白赢
int bcount=0;//5个连续范围内的计数,到5则赢
int wcount=0;
//横判断
for( int i=x-4;i<x+5;i++) {
if (i<0||i>17) continue;
else {
if(a[i][y]==1) bcount++;
else if(a[i][y]==2) wcount++;
}
if (bcount==5) return 1;
if (wcount==5) return 2;
}
bcount=0;wcount=0;
//纵判断
for( int i=y-4;i<y+5;i++) {
if (i<0||i>17) continue;
else {
if(a[x][i]==1) bcount++;
else if(a[x][i]==2) wcount++;
}
if (bcount==5) return 1;
if (wcount==5) return 2;
}
bcount=0;wcount=0;
//左上右下判断
for( int i=-4;i<5;i++) {
int j=x+i;
int k=y+i;
if (j<0||j>17||k<0||k>17) continue;
else {
if(a[j][k]==1) bcount++;
else if(a[j][k]==2) wcount++;
}
if (bcount==5) return 1;
if (wcount==5) return 2;
}
bcount=0;wcount=0;
//左下右上判断
for( int i=-4;i<5;i++) {
int j=x+i;
int k=y-i;
if (j<0||j>17||k<0||k>17) continue;
else {
if(a[j][k]==1) bcount++;
else if(a[j][k]==2) wcount++;
}
if (bcount==5) return 1;
if (wcount==5) return 2;
}
bcount=0;wcount=0;
return 0;
}
}