五子棋!!
实现功能
基本的棋盘绘制,重绘,输赢判断,悔棋,重新开始
改进方向
添加背景音乐,背景图片美化,用棋子图片代替原棋子(这里只是画不同颜色的圆代表棋子)
主体思路
用一个二维数组代表棋盘状态,数组中不同的值表示空或者红方或者蓝方。鼠标点击时判断点的格子是哪个并修改相应值、画出棋子。
遇到的困难
点击边缘的格子,判断输赢时会超出数组边界,所以要检查一下某一方向是否到达边界
完整代码
package gobang;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
public class myUI extends JFrame implements MouseListener,ActionListener{
//棋盘数组,-1为红,1为蓝
public int[][] chess=new int[21][17];
//画笔
Graphics g;
//记录落子数
private int count=0;
//纪录当前落子位置
public int i,j;
//主函数
public static void main(String[] args) {
myUI ui=new myUI();
ui.showui();
new Runnable() {
public void run() {
//此处留着添加背景音乐
}
}.run();
}
public void showui() {
//设置
this.setTitle("单机五子棋");
this.setSize(1250,850);
this.setLocation(20, 15);
this.setDefaultCloseOperation(3);
this.setVisible(true);
//画笔
g=this.getGraphics();
//鼠标监听
this.addMouseListener(this);
//流式布局
java.awt.FlowLayout flow=new FlowLayout();
this.setLayout(flow);
//空白
javax.swing.JLabel kb1=new javax.swing.JLabel("");
java.awt.Dimension dm1 = new java.awt.Dimension(1250, 720);
kb1.setPreferredSize(dm1);
this.add(kb1);
//空白
javax.swing.JLabel kb2=new javax.swing.JLabel("");
java.awt.Dimension dm2 = new java.awt.Dimension(950, 50);
kb2.setPreferredSize(dm2);
this.add(kb2);
//悔棋
javax.swing.JButton jb1=new javax.swing.JButton("悔棋");
this.add(jb1);
jb1.addActionListener(this);
//重新开始
javax.swing.JButton jb2=new javax.swing.JButton("重新开始");
this.add(jb2);
jb2.addActionListener(this);
}
public void paint(Graphics g) {
super.paint(g);
//背景
g.setColor(Color.white);
g.drawRect(0, 0, 1300, 900);
g.setColor(Color.GRAY);
//竖线
for(int i=0;i<21;i++) {
g.drawLine(50*i,50,50*i, 800);
}
//横线
for(int i=0;i<17;i++) {
g.drawLine(50,50*i,1000,50*i );
}
//旗子
for(int i=0;i<21;i++) {
for(int j=0;j<17;j++) {
if(chess[i][j]==-1)//红
{
g.setColor(Color.red);
g.fillOval(50*i-20, 50*j-20, 40, 40);
}
if(chess[i][j]==1)//蓝
{
g.setColor(Color.blue);
g.fillOval(50*i-20, 50*j-20, 40, 40);
}
}
}
}
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
//画一次旗子,存入数组
public void drawchess(int i,int j) {
this.i=i;
this.j=j;
if(chess[i][j]==0) {
if(count%2==0) {
chess[i][j]=-1;
g.setColor(Color.red);
g.fillOval(50*i-20, 50*j-20, 40, 40);
count++;
System.out.println("red");
checkchess(i,j);
return;
}
if(count%2==1) {
chess[i][j]=1;
g.setColor(Color.blue);
g.fillOval(50*i-20, 50*j-20, 40, 40);
count++;
System.out.println("blue");
checkchess(i,j);
return;
}
}
}
//判断输赢
private void checkchess(int i, int j) {
if(chesscount(i,j,1,1)>4)
System.out.println(chesscount(i,j,1,1)+"xie1");
if(chesscount(i,j,0,1)>4)
System.out.println(chesscount(i,j,0,1)+"s");
if(chesscount(i,j,1,0)>4)
System.out.println(chesscount(i,j,1,0)+"h");
if(chesscount(i,j,1,-1)>4)
System.out.println(chesscount(i,j,1,-1)+"xie2");
}
//判断有多少连子
private int chesscount(int i,int j,int x,int y) {
int counts=0;
for(int n=0;n<5;n++) {
if(i+x*n>=0&&j+y*n>=0&&i+x*n<21&&j+y*n<17&&chess[i+x*n][j+y*n]==chess[i][j])
counts++;
else
break;
}
for(int n=0;n<5;n++) {
if(i+x*n>=0&&j+y*n>=0&&i-x*n<21&&j-y*n<17&&chess[i-x*n][j-y*n]==chess[i][j])
counts++;
else
break;
}
return counts-1;
}
//判断点击哪个格子
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
if((e.getX()-e.getX()/50*50)<10&&(e.getY()-e.getY()/50*50)<10) {
drawchess(e.getX()/50,e.getY()/50);
}
if((e.getX()-e.getX()/50*50)>40&&(e.getY()-e.getY()/50*50)<10) {
drawchess(1+e.getX()/50,e.getY()/50);
}
if((e.getX()-e.getX()/50*50)<10&&(e.getY()-e.getY()/50*50)>40) {
drawchess(e.getX()/50,1+e.getY()/50);
}
if((e.getX()-e.getX()/50*50)>40&&(e.getY()-e.getY()/50*50)>40) {
drawchess(1+e.getX()/50,1+e.getY()/50);
}
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("悔棋")) {
if (chess[i][j]!=0) {
chess[i][j]=0;
--count;
paint(g);
System.out.println("悔棋一次");
}else {
System.out.println("当前不能悔棋");
}
}
if(e.getActionCommand().equals("重新开始")) {
count=0;
chess=new int[21][17];
paint(g);
}
}
}