java五子棋基础(二)
发布日期:2021-05-07 13:14:41 浏览次数:15 分类:原创文章

本文共 3419 字,大约阅读时间需要 11 分钟。

五子棋



功能实现


1、实现棋子在棋盘范围内
2、实现棋子落在交点上
3、存储棋子,重绘


1、落棋子的范围


x坐标范围: X < x < X+列数间隔
y坐标范围:Y < y < Y+行数
间隔


至此发现,在GobangMain类和GobangListener类中都需要用到棋盘的左上角左边、行列数
在这里插入图片描述
在这里插入图片描述
而且这些值是一样的,因此考虑把这些属性作为常量定义在一个接口中,让这两个类都实现这个接口


public interface GobangConfig {
public int X = 50; //棋盘左上角点在窗体中初始X坐标 public int Y = 50; //初始Y坐标 public int ROW = 15; //列数 public int COL = 15; //行数 public int SIZE = 30;//间隔大小 public int SIZE_CHESS = SIZE; //棋子大小}

GobangMain 类实现GobangConfig接口后可修改棋盘绘制的变量为常量


for (int i = 0; i < ROW; i++) {
// 绘制直线,参数分别是直线的起点(x,y)和终点的(x,y) g.drawLine(X, Y + i * SIZE, X + (ROW - 1) * SIZE, Y + i * SIZE); // 画横线}for (int j = 0; j < COL; j++) {
g.drawLine(X + j * SIZE, Y + (ROW - 1) * SIZE, X + j * SIZE, Y); // 画竖线}

限制落子范围
X < x < X+列数间隔 , Y < y < Y+行数数间隔


if((x>X-SIZE_CHESS/2&&x<X+(ROW-1)*SIZE+SIZE_CHESS/2)&&                (y>Y-SIZE_CHESS/2&&y<Y+(COL-1)*SIZE+SIZE_CHESS/2)){
g.fillOval(x,y,30,30); if(flag == 1){
flag = -1; g.setColor(Color.white); }else {
flag = 1; g.setColor(Color.black); } }

2、实现棋子落在交点上


在这里插入图片描述
此时棋盘内任意位置都能下棋,这是根据点击的位置下棋的,要实现在交点上,那就计算好交点行列坐标,根据行列坐标计算在窗体中对应的坐标。


//根据鼠标点击位置交替画黑白棋    public void mouseClicked(MouseEvent e) {
int x = e.getX(); int y = e.getY(); //确定棋子对应的行列, SIZE_CHESS/2 其作用是让点击位置超过行列间隔一半时 向上取整 int r = (x-X+SIZE_CHESS/2)/SIZE; int c = (y-Y+SIZE_CHESS/2)/SIZE; // 棋盘的范围 X < x < X+列数*间隔 , Y < y < Y+行数数*间隔 if((x>X-SIZE_CHESS/2&&x<X+(ROW-1)*SIZE+SIZE_CHESS/2)&& (y>Y-SIZE_CHESS/2&&y<Y+(COL-1)*SIZE+SIZE_CHESS/2)){
//绘制椭圆时为了让圆心和交点重合,起点坐标需要在左上角 g.fillOval(r*SIZE+X-SIZE_CHESS/2, c*SIZE+Y-SIZE_CHESS/2, SIZE_CHESS,SIZE_CHESS); if(flag == 1){
flag = -1; g.setColor(Color.white); }else {
flag = 1; g.setColor(Color.black); } } }

3、存储棋子


到这个时候,实现了在点击位置交替下黑白棋。这个时候如果把窗体最小化,再重新打开,会发现棋子全都不见了


因为窗体重新打开的时候会执行paint方法重绘,而重绘方法中并没有绘制棋子的方法,因此需要存储并重绘棋子


存储棋子思路
棋盘正好对应二维数组,绘制棋子时修改对应二维数组的值即可,用1代表黑棋,-1代表白棋,0掉代表没有。同时在重绘的时候遍历二维数组,并绘制棋子


由于二维数组在界面绘制类和监听类中都需要使用到,所以将其定义在接口中


if(chessArray[r][c] == 0){
//表示该点无棋子 //绘制椭圆时为了让圆心和交点重合,起点坐标需要在左上角 g.fillOval(r*SIZE+X-SIZE_CHESS/2, c*SIZE+Y-SIZE_CHESS/2, SIZE_CHESS,SIZE_CHESS); chessArray[r][c] = flag; if(flag == 1){
flag = -1; g.setColor(Color.white); }else {
flag = 1; g.setColor(Color.black); }}

重绘
在GobangMain类中添加方法,在paint方法中调用即可


遍历棋子并绘制


public void drawChess(Graphics g) {
for (int a = 0; a < chessArray.length; a++) for (int c = 0; c < chessArray.length; c++) if (chessArray[a][c] != 0) // 用二维数组对应棋子位置,无子为0,黑子为1,白子为-1 if (chessArray[a][c] == 1) {
g.setColor(Color.black); //设置画笔为黑色 /* fillOval方法四个参数:分别是椭圆的x、y坐标和两个半轴的长度 思考:如果(4,5) 这个坐标上有一个黑色的棋子,怎么计算出棋盘上对应位置的x,y值 x = 左上角点X + 4 * 棋盘间隔 - 棋子的半径(为了让棋子的中心落在棋盘的交点上 ) */ g.fillOval(X + a * SIZE - SIZE_CHESS / 2, c * SIZE + Y - SIZE_CHESS / 2, SIZE_CHESS, SIZE_CHESS); } else {
g.setColor(Color.white); g.fillOval(a * SIZE + X - SIZE_CHESS / 2, c * SIZE + Y - SIZE_CHESS / 2, SIZE_CHESS, SIZE_CHESS); }}


github源码:

上一篇:剑指offer JZ34第一个只出现一次的字符
下一篇:剑指offer JZ31 整数中1出现的次数

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年03月20日 16时32分13秒