
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源码:
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年03月20日 16时32分13秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
判断移动端(手机)还是客户端(电脑)打开网页并跳转不同页面(首页)
2019-03-04
10分钟实现个人博客布置说说留言功能,Artitalk.js插件使用
2019-03-04
眼睛跟随鼠标转动的小黄人 html+css+js
2019-03-04
canvas贪吃蛇效果 html+css+js
2019-03-04
跟随鼠标移动的星星✩直接在页面引用✧✧✧
2019-03-04
poj 3660 (floyd)
2019-03-04
8086汇编语言21键电子琴
2019-03-04
找密码
2019-03-04
Python初级知识总结
2019-03-04
python|画图1(蛇)
2019-03-04
婚姻稳定匹配问题
2019-03-04
C++数据类型,运算符,注释
2019-03-04
C++语句,函数,标准输入输出
2019-03-04
平均年龄,,数字求和
2019-03-04
简单的字符串操作(注意要点)
2019-03-04
统计字符数
2019-03-04
C与C++区别
2019-03-04
原生 JS 封装的一些方法 【更新中...】
2019-03-04
Vue Element UI Upload 上传多张图片
2019-03-04