Java小游戏——五子棋(简易版)

自学了一个简易版的五子棋,棋子是用Graphics中的fillOval画出来的,棋盘是重写JFrame中paint方法画的。

 

思路分析

1、棋盘类

创建一个棋盘类,继承JFrame,实现一个接口Config方便修改棋盘配置参数

首先设置窗口名称大小,以及界面不可改变大小。

再重写JFrame父类的paint方法绘制棋盘。在棋盘内画出横线和竖线。

我将棋盘每个点作为一个二维数组的元素,所以还要将二维数组初始化置零,避免判断是出现空指针异常。

package cn.itcast_qi;

import java.awt.Graphics;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

public class FiveChessUI extends JFrame implements Config{
public static void main(String[] args) {
	FiveChessUI fcUI = new FiveChessUI();
	fcUI.checkBoard();
	Graphics g =fcUI.getGraphics();
	ChessListener cl =new ChessListener(g,initChesses());
	fcUI.addMouseListener(cl);
}


private void checkBoard() {
this.setTitle("五子棋");
	this.setSize(600,600);
	this.setResizable(false);
	this.setDefaultCloseOperation(3);
	this.setVisible(true);
}

@Override
	public void paint(Graphics g) {		
		super.paint(g);
		//画窗体的同时绘制棋盘
		drawChessTable(g);
	}

public void drawChessTable(Graphics g) {
	for(int i = 0;i

 

2、下棋(事件)

下棋,那就要监听每次鼠标事件,我将鼠标单击事件进行判断。

首先创建一个鼠标监听类,继承MouseAdapter,再重写mouseClicked事件。

然后我们要知道每次鼠标点击的位置,我将每个格子分成三段,上1/3距离为长做一个正方形作为上方区域交叉点的有效范围,下1/3距离为长做正方形做下方区域的有效范围,这样就实现了鼠标点击区域实现下棋

每次下棋时,由于一黑一白交替着下棋,我加入一count参数,黑棋为0白棋为1,count的一加一减实现交替画出黑白棋子。画完点的同时,对二维数组进行赋值,画点之前判断这个点是否已经赋值,这样就不会重复落子

下完一粒棋子后我要判断输赢,所以需要一个判断是否出现5连子的方法。以棋子为中心,上下为一条直线判断,出现连续五个一样的棋子,就告诉我有人赢了,再通过判断这个中心点是什么颜色来知道是哪一方获胜。同理左右方向和左上右下和左下右上方向。

 

package cn.itcast_qi;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JOptionPane;

public class ChessListener extends MouseAdapter implements Config {
	private Graphics g;
	private int count = 0;
	boolean gameOver = false;

	private int[][] chesses;

	public ChessListener(Graphics g, int[][] chesses) {
		this.g = g;
		this.chesses = chesses;
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		int x1 = e.getX();
		int y1 = e.getY();

		for (int j = 0; j < ROWS; j++) {
			for (int i = 0; i < COLUMNS; i++) {
				int x = X0 + SIZE * i;// 横坐标
				int y = Y0 + SIZE * j;// 纵坐标

				if (x1 > x - SIZE / 3 && x1 < x + SIZE / 3 && y1 > y - SIZE / 3 && y1 < y + SIZE / 3) {
					if (chesses[i][j] == 0) {
						if (count == 0) {
							g.setColor(Color.black);
							chesses[i][j] = 1;
							count++;
						} else {
							g.setColor(Color.white);
							chesses[i][j] = -1;
							count--;
						}
						// 画棋子
						g.fillOval(x - CHESS_SIZE / 2, y - CHESS_SIZE / 2, CHESS_SIZE, CHESS_SIZE);
						// 判断是否胜利
						if (checkRow(i, j)) {
							if (chesses[i][j] == 1) {
								System.out.println("恭喜黑子获胜");
							} else if (chesses[i][j] == -1) {
								System.out.println("恭喜白子获胜");
							}
						}
						return;
					}
				}

			}
		}

	}

	// 判断是否5连子,是就返回true
	public boolean checkRow(int x, int y) {
		int win = 1;
		// 往右
		for (int i = x+1; i < ROWS; i++) {
			if (chesses[i][y] == chesses[x][y]) {
				win++;
			} else {
				break;
			}
		}
		// 往左
		for (int i = x-1; i >= 0; i--) {
			if (chesses[i][y] == chesses[x][y]) {
				win++;
			} else {
				break;
			}
		}
		if (win >= 5) {
			return true;
		} else {
			win = 1;
		}
		// 往上
		for (int j = y-1; j >= 0; j--) {
			if (chesses[x][j] == chesses[x][y]) {
				win++;
			} else {
				break;
			}
		}
		// 往下
		for (int j = y+1; j < COLUMNS; j++) {
			if (chesses[x][j] == chesses[x][y]) {
				win++;
			} else {
				break;
			}
		}

		if (win >= 5) {
			return true;
		} else {
			win = 1;
		}
		// 左上
		for (int i = x-1, j = y-1; i >= 0 && j >= 0; i--, j--) {
			if (chesses[i][j] == chesses[x][y]) {
				win++;
			} else {
				break;
			}
		}
		// 右下
		for (int i = x+1, j = y+1; i < ROWS && j < COLUMNS; i++, j++) {
			if (chesses[i][j] == chesses[x][y]) {
				win++;
			} else {
				break;
			}
		}

		if (win >= 5) {
			return true;
		} else {
			win = 1;
		}
		// 左下
		for (int i = x-1, j = y+1; i >= 0 && j < COLUMNS; i--, j++) {
			if (chesses[i][j] == chesses[x][y]) {
				win++;
			} else {
				break;
			}
		}
		// 右上
		for (int i = x + 1, j = y-1; i < ROWS && j >= 0; i++, j--) {
			if (chesses[i][j] == chesses[x][y]) {
				win++;
			} else {
				break;
			}
		}

		if (win >= 5) {
			return true;
		} else {
			win = 1;
		}

		return false;
	}

}

 

你可能感兴趣的:(learning)