Java实现单机五子棋,含完整代码

五子棋!!

实现功能

基本的棋盘绘制,重绘,输赢判断,悔棋,重新开始

改进方向

添加背景音乐,背景图片美化,用棋子图片代替原棋子(这里只是画不同颜色的圆代表棋子)

主体思路

用一个二维数组代表棋盘状态,数组中不同的值表示空或者红方或者蓝方。鼠标点击时判断点的格子是哪个并修改相应值、画出棋子。

遇到的困难

点击边缘的格子,判断输赢时会超出数组边界,所以要检查一下某一方向是否到达边界

完整代码

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);
		}
		
	}

}


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值