五子棋游戏
来源:互联网 发布:文章植入广告软件 编辑:程序博客网 时间:2024/05/02 18:50
五子棋游戏
关于画布
五子棋游戏中绘制棋盘时是需要用到画布,当然画布要从一个面板上得到,然后在画布上进行绘制横线和竖线得到画布用的方法是graphics=panel.getGraphics();那么接下来就可以绘制棋盘了。
这里以绘制十行十列棋盘为例
// 棋盘面板 JPanel panel_grid = new JPanel() { public void paint(Graphics g) { super.paint(g); for (int i = 0; i < 10; i++) { //水平直线 g.drawLine(10, 10 + 50 * i, 460, 10 + 50 * i); //垂直直线 g.drawLine(10 + 50 * i, 10, 10 + 50 * i, 460); } } }
关于paint和repaint
在窗口发生改变的时候,比如放大或缩小,就会自动调用paint()方法。而在下棋的过程中会发现如果没有将绘制棋子的方法写在paint()方法里,一旦将窗口关掉,那么棋盘上的棋子就会消失。
而repaint()方法是用来调用paint()方法的,在设计重新开始一局游戏的时候直接用repaint,就会将棋子抹掉,当然还要用到一点其他的方法。
关于监听和绘制棋子
绘制棋子的时候是通过对棋盘面板pannel_grid进行鼠标监听来绘制。在绘制的时候需要将所有的棋子都记录下来,这样在重绘的时候就能画出棋盘在窗口改变前棋盘的样子,那么就需要用到一个集合ArrayList,当鼠标点击的时候就向集合中添加一颗棋子,再用循环将集合重的元素遍历。为了将棋子画在交叉点上,需要调整绘制棋子的位置。
值得注意的是在实现鼠标监听的时候,要将监听里的所有方法实现,其中内容可以是空,但不可以没有这个方法。
panel_grid.addMouseListener(new MouseListener() {//匿名内部类 @Override public void mouseClicked(MouseEvent mouse) { int x1 = mouse.getX(); int y1 = mouse.getY(); int x0, y0; for (int i = 0; i <= 10; i++) { for (int j = 0; j <= 10; j++) { //x0,y0表示所有的交叉点 x0 = 50 * i; y0 = 50 * j; //flag数组用来记住棋盘上当前位置是否已有棋子 //0没有棋子,1为黑棋,2为白棋 if (flag[i][j] == 0) { if (x0 - 50 / 3 <= x1 && x1 < x0 + 50 / 3 && y0 - 50 / 3 <= y1 && y1 <= y0 + 50 / 3) { //flag_color是一个全局变量,用来判断是画白棋还是黑棋 if (flag_color == 0) { flag[i][j] = 1; //chess也是一个全局变量,用来创建当前要画的棋子 chess = new Chess(x0, y0, Color.black); // 黑棋 flag_color = 1; } else if (flag_color == 1) { chess = new Chess(x0, y0, Color.white); flag[i][j] = 2; // 白棋 flag_color = 0; } chess.draw(graphics); isWin(i, j); //list是一个棋子集合 list.add(chess) } } } } } @Override public void mouseEntered(MouseEvent arg0) { } @Override public void mouseExited(MouseEvent arg0) { } @Override public void mousePressed(MouseEvent arg0) { } @Override public void mouseReleased(MouseEvent arg0) { } });
遍历集合
for (int j = 0; j < list.size(); j++) { list.get(j).draw(g); }
由于在集合中放置的是棋子类的对象,所以就需要建立一个棋子类。而棋子其实就是一个圆盘,那么用fillOval(x, y, width, height)就可以绘制棋子了。
public class Chess { int x, y; Color color; public Chess(int x, int y, Color color) { this.color = color; this.x = x - 5; this.y = y - 5; } public void draw(Graphics g) { g.setColor(color); g.fillOval(x, y, 30, 30); } }
关于判断输赢
每下一颗棋子就需要判断四个方向是否有五颗连续相同颜色的棋子,四个方向分别是水平,垂直及对角线。那么就需要将棋盘的情况记录下来,而整个棋盘的交叉点就相当于是一个二维数组,因此在绘制一颗棋子的同时用二维数组记录下来,黑棋还是白棋。
这里给出水平方向的判断代码
public void isWin(int x, int y) { int count = 1; int a, b; a = x; b = y; while (a > 0 && flag[a][b] == flag[a - 1][b]) {// 向左 count++; a--; } a = x; b = y; while (flag[a][b] == flag[a + 1][b] && a < 10) {// 向右 count++; a++; } if (count >= 5) { colorWin(flag[a][b]); }
public void colorWin(int color) { if (color == 1) { JOptionPane.showMessageDialog(null, "黑棋赢了!"); } if (color == 2) { JOptionPane.showMessageDialog(null, "白棋赢了!"); } }
0 0
- 五子棋游戏
- 五子棋游戏
- 五子棋游戏
- 五子棋游戏
- 五子棋游戏
- 五子棋游戏
- 五子棋 游戏设计
- c#游戏------联机五子棋
- 五子棋游戏源代码
- java五子棋游戏 代码
- HTML5 canvas五子棋游戏
- windows8五子棋 游戏
- Js五子棋游戏
- 五子棋落子游戏
- java五子棋游戏
- 写五子棋游戏有感
- 五子棋游戏-java-jackfrued
- Qt网络五子棋游戏
- 工厂方法模式
- AppScript-批处理自动执行git push等操作
- POJ 3680 最小费用最大流
- 如何创建自己的SeetaFace Alignment工程
- Java的clone方法
- 五子棋游戏
- Android项目实践之菜鸟养成 (一)引言
- 企业高并发的成熟解决方案(一) ----负载均衡服务器
- 【寒江雪】DX11初始化讲解
- swift 3 函数
- 也许是面试的题目
- 关于printf()用法提示
- 如何创建自己的SeetaFace Identification工程
- 拉丁矩阵