超萌新级的Java项目实践——五子棋(二)

这部分内容需要一定的数组之类的数据结构的基础,这一部分讲解一下五子棋的重绘和防止重复在一个位置下棋的思路和解决方案。

之前是实现了简易的界面的点一下绘制一个棋子以及棋子的换边。但是,我们在下棋的函数里没有任何的判断语句是用于判断点击的位置是否有棋子,所以导致可以在一个位置不断下棋。

于是,我们需要一个用于存储位置的二维数组(当然也可以使用一维数组,本文介绍二维数组的使用方法),本人命名为piece

 

int[][] piece = new int[RC][RC];
//RC是棋盘的范围,RC X RC 的棋盘。

 

然后在每次下棋的时候进行一次判断,如果当前的相对位置没有棋子,则下一个当前颜色的棋子,否则什么都不会发生

更改后的下棋的函数:

 

private void play(int x, int y) {
	if (x > 25 || y > 25) {
		x = x - X;
		y = y - Y;
		dx = x - x / SIZE * SIZE;
		dy = y - y / SIZE * SIZE;

		if (dx <= SIZE / 2)
			dx = x / SIZE;
		else
			dx = x / SIZE + 1;
		if (dy <= SIZE / 2)
			dy = y / SIZE;
		else
			dy = y / SIZE + 1;
	} else if (x < 25 || y < 25) {
		dx = x;
		dy = y;
	}
	//dx、dy用于保存棋子在棋盘上的相对位置,方便后续的绘制棋子等工作
	//x、y为当时鼠标点击的x、y坐标

	if (piece[dx][dy] == 0) {
		if (b)
			g.setColor(Color.BLACK);
		else
			g.setColor(Color.WHITE);
		g.fillOval(dx * SIZE - R + X, dy * SIZE - R + Y, 2 * R, 2 * R);
		//emptyPiece、blackPiece与whitePiece棋子的颜色参数
                if (piece[dx][dy] == emptyPiece) {
			if (b) {
				g.setColor(Color.BLACK);
				piece[dx][dy] = blackPiece;
			}
			else {
				g.setColor(Color.WHITE);
				piece[dx][dy] = whitePiece;
			}
			g.fillOval(dx * SIZE - R + X, dy * SIZE - R + Y, 2 * R, 2 * R);
			b = !b;
			//b为判断用的变量,true为下黑棋,false为下白棋
		}
		b = !b;
		//b为判断用的变量,true为下黑棋,false为下白棋
	}
}

 

然后,为了不影响用户体验,我们还是要重绘。原理是类似的,先创建一个棋子类Pieces。

 

import java.awt.Color;
import java.awt.Graphics;

public class Pieces implements Gobang_window{
	//Gobang_window,设置全局变量参数的接口,如RC,SIZE之类的值就在这里面,不是系统自带,为本人自己创建的
	private int x , y;
	private Color c;
	private Graphics g;
	
	/**
	 * 棋子类的构造方法
	 * @param g 传入要绘制棋子的绘图板
	 * @param x 传入棋子的x坐标
	 * @param y 传入棋子的y坐标
	 * @param c 传入棋子的颜色
	 */
	Pieces(Graphics g, int x, int y, Color c){
		this.g = g;
		this.x = x;
		this.y = y;
		this.c = c;
	}
	/**
	 * 绘制棋子的方法,重绘时使用,可以不写在这里,写在重绘的方法里
	 * @param g
	 */
	public void rePaint(Graphics g) {
		g.setColor(c);
		g.fillOval(x*SIZE-R+X, y*SIZE-R+Y, 2*R, 2*R);
	}
	
	public Color getC() {
		return c;
	}

	public void setC(Color c) {
		this.c = c;
	}

	
	public int getX() {
		return x;
	}
	
	public int getY() {
		return y;
	}
}

 

然后再在创建一个棋子类的数组Pi,并在下棋子成功时在数组内存储之前下的一个棋子信息。

 

if (piece[dx][dy] == emptyPiece) {
			if (b) {
				g.setColor(Color.BLACK);
				piece[dx][dy] = blackPiece;
				Pi[++len] = new Pieces(g, dx, dy, Color.BLACK);

			}
			else {
				g.setColor(Color.WHITE);
				piece[dx][dy] = whitePiece;
				Pi[++len] = new Pieces(g, dx, dy, Color.WHITE);
			}
			g.fillOval(dx * SIZE - R + X, dy * SIZE - R + Y, 2 * R, 2 * R);
			b = !b;
			//b为判断用的变量,true为下黑棋,false为下白棋
		}

 

 

此时,我们在我们熟悉的重绘方法里添加棋盘和棋子的重绘

 

	public void paint(Graphics g) {
		int x = 0, y = 0;
		super.paint(g);
		paintTable(g);
		for (int i = 0; Pi[i] != null; i++)
			Pi[i].rePaint(g);
	}

 

然后,我们便实现了重绘并解决了重复下棋的问题;但是,我们还没有完成五子棋的基本内容,因为我们还无法判断胜负,这个问题涉及到有关的算法,会在之后的文章不断完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值