五子棋总结

      五子棋的开发,也是很早以前的一个项目,这里简单的讲一下思路和实现过程。

      首先,我们要一个可视化窗体,然后是在窗体上画棋盘,方法其实就是画板中画直线的方法。画完棋盘,我们要能往上面放棋子,简单的棋子就是画实心圆。放子的时候,我们要的是能放在棋盘的交叉线上。而画实心圆的方法g.fillOval(x, y, width, height)中的x、y是圆的外切矩形的左上角的点,因此,我们还要在减去圆的半径,就能圆心在交点上了。定义一个棋盘数组,每个位置都赋值为0,放了黑子为1,白子为-1。放点的位置要允许一定的误差,还要先判断那点上是不是已经有放子了,放一颗子判断一次输赢。

// 1.得到鼠标的位置
int x1 = e.getX();
int y1 = e.getY();

// 2.判断选中的点是不是交叉点(允许合理的误差:单元格大小的1/3)
for (int i = 0; i < Config.COLUMNS; i++) {
	for (int j = 0; j < Config.ROWS; j++) {
		// 得到每个交叉点的坐标
		int x2 = Config.X0 + j * Config.SIZE;
		int y2 = Config.Y0 + i * Config.SIZE;
		// 循环比较,如果是在误差范围内
		if (Math.abs(x1 - x2) <= Config.SIZE / 3
					&& Math.abs(y1 - y2) <= Config.SIZE / 3) {

			// 判断是否有棋子
			if (chess[i][j] == 0) {
				if (count == 0) {
					g.setColor(java.awt.Color.BLACK);
					count++;
					chess[i][j] = 1;
				} else {
					g.setColor(java.awt.Color.WHITE);
					count--;
					chess[i][j] = -1;
				}
				// 以当前的交叉点为圆心画圆
				g.fillOval(x2 - Config.CHESS_SIZE / 2, y2
						- Config.CHESS_SIZE / 2, Config.CHESS_SIZE,
						Config.CHESS_SIZE);
						
				//放一颗棋子,判断一次输赢
				if(sf.checkRow(i, j)>=5 || sf.checkColumn(i, j)>=5
					|| sf.checkLeft(i, j)>=5 || sf.checkRight(i, j)>=5){
				//弹出对话框
				javax.swing.JOptionPane.showMessageDialog(null, "GAME OVER!!!");
				}
						
				return;//省去后面多余的循环
			}
		}
	}
}

      判断输赢的算法思路是从所放的子开始,上下左右斜对角的找和所放棋子颜色一致的棋子,如果在某一条线路中找到了一排五个,就弹出游戏结束的对话框。

      这样,五子棋的人机对战算是完成了。

      为了使其更加美观,我们给它贴上棋盘,棋子的图片。

      然后是人机对战,创建一个机器人的类,其中写机器放子的算法。机器放子的时候,我们要定义一个记录棋子位置的一维数组,长度为二,以此传机器放子的位置。我的人机算法还不具有智商,就是只能人放一颗子机器放一颗子,不过机器放的是随机的。

      然后也可以像画板那样做文件保存。这就是简单五子棋的实现过程了。

 


五子棋总结
 

你可能感兴趣的:(游戏,算法,swing,J#)