这是一个简单的五子棋游戏,目前只实现了简单的人人对战,就是自己跟自己下。。。具体效果如下:
实现这个效果也很简单,主要功能是:
1、点击棋盘能下棋子、棋子位置在棋盘点、点击点和下子点近似判断、黑白棋子交替出现
2、某个棋盘点下了棋子后不能被覆盖
3、判断输赢条件
4、分胜负之后不能再下
一般来说做这个棋盘应该用十几条直线交替画出来,我是用一张图片代替,所以省去了画直线的方法,然后主要的是计算图片中的棋盘点了
所以选用图片一定要选棋盘隔是均匀的矩形,这样方便我们计算每个交点的坐标。计算坐标时当然要考虑到这个图片的规格了,有个经验是用QQ的截图功能(ctrl+alt+A),去选取那个区域,上面会显示区域的长和宽,就可以得到坐标了,像这样:
这样我就知道棋盘左上角的第一个点坐标是(38,25),棋盘每个格的边长都是32。
接下来是画棋子,因为不可能让玩家鼠标点击的点总要刚好等于棋盘交线处的点才能下棋子,这样太费劲了,所以应该还做一个近似判断,就是当点击处离某一个交线点很近的时候,就视为在那个棋盘点下棋了。我的画棋子方法是在棋子类里面(每画一个棋子就创建一个棋子类,再调用棋子类里面的画棋子方法),棋子大小为24(所以画的时候要注意fillOval方法给的参数不是圆心而是左上角的坐标,这样就要减12)。
下棋分黑棋和白棋,黑白棋交替下这个用奇偶数判断就行了,即设置一个int型变量count,判断它%2的值为0还是1,0画白子,1画黑子,然后每下一次棋这个数加一即可。
然后还需判断这个点有没有下过棋子,这个地方我用的是一个18*18 的二维数组,就是涵盖所有棋盘点的数组,数组内的每个元素对应元素角标的棋盘点,这样给没下过棋子的棋盘点对应的元素赋值0,给下过的赋值1,这样当玩家下棋时判断这个点的值是不是0,是0才能下棋,也就不能覆盖了
代码如下:
//遍历所有棋盘点
for(int i=0;i<18;i++)
{
for(int j=0;j<18;j++)
{
//近似判断
if(Math.abs(38+32*i-x)<12&&Math.abs(25+32*j-y)<12)
{
//这个点没有下过棋子且游戏没有结束
if(point[i][j]==0&&winner==null)
{
//创建新的棋子
pieces[i][j] = new Pieces(38+32*i-12, 25+32*j-12,count);
//画出此棋子
pieces[i][j].drawPieces(g);
game_panel.setPieces(pieces);
//步数加一
count++;
//此点已占
point[i][j]=1;
if(count>=9)
{
//判断游戏胜负的方法
win();
//有一方获胜
if(winner!=null)
{
//调用提示框的类
new Message(winner,pieces,game_panel);
}
}
}
}
}
}
接下来就要实现判断输赢的功能了,这应该是在每下一个棋子时就判断一次,判断的原理就是遍历棋子的四个方向,如果棋子的颜色和某一方向的连续四个相邻棋子都相同,则这个颜色的玩家就赢了
//胜负判断
public void win()
{
for(int i=0;i<18;i++)
{
for(int j=0;j<18;j++)
{
//右斜的棋子判断
if(i<14&&j<14&point[i][j]==1)
{
int flag=0;
//连续四个棋子是否都一样
for(int k=1;k<5;k++)
{
if(pieces[i+k][j+k]!=null)
{
//kind是存储这个棋子的颜色的属性
if(!pieces[i+k][j+k].kind.equals(pieces[i][j].kind))
break;
}
flag++;
}
if(flag==4)
{
winner = pieces[i][j].kind+" win!";
}
}
//左斜的棋子判断
if(i<14&&j>3&point[i][j]==1)
{
int flag=0;
for(int k=1;k<5;k++)
{
if(!pieces[i+k][j-k].kind.equals(pieces[i][j].kind))
break;
flag++;
}
if(flag==4)
{
winner = pieces[i][j].kind+" win!";
}
}
//横着的棋子判断
if(i<14&&point[i][j]==1)
{
int flag=0;
for(int k=1;k<5;k++)
{
if(!pieces[i+k][j].kind.equals(pieces[i][j].kind))
break;
flag++;
}
if(flag==4)
{
winner = pieces[i][j].kind+" win!";
}
}
//竖着的棋子判断
if(j<14&&point[i][j]==1)
{
int flag=0;
for(int k=1;k<5;k++)
{
if(!pieces[i][j+k].kind.equals(pieces[i][j].kind))
break;
flag++;
}
if(flag==4)
{
winner = pieces[i][j].kind+" win!";
}
}
}
}
}