五子棋的游戏规则说明
轮流下子是双方的权利,但允许任何一方放弃下子权,先形成5子连线者获胜。五子棋有两种玩法。玩法一:双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。玩法二:自己形成五子连线就替换对方任意一枚棋子。被替换的棋子可以和对方交换棋子。最后以先出完所有棋子的一方为胜。五子棋的棋具与围棋通用,是一种传统的棋种。棋盘:棋盘可用木料、硬纸、塑料、布料、石料或环保材料等制成。棋盘由横纵各15条等距离,垂直交叉的平行线构成,在棋盘上,横纵线交叉形成了225个交叉点为对弈时的落子点。邻近两个交叉点的距离要略大于棋子的直径,纵线距离约为2.5厘米,横线约为2.4厘米。以对局开始时的黑方为准,棋盘上的纵行线从近到远用阿拉伯数字1—15标记,横行线从左到右用英文字母A—O按字母顺序标记。由于每个英文字母都对应着一条纵线,每个阿拉伯数字都对应着一条横线,所以,棋盘上的每一个交叉点都可用英文字母和阿拉伯数字的组合来标示出来。
五子棋的游戏规则是什么?
五子棋有两种玩法:玩法一:双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。玩法二:自己形成五子连线就替换对方任意一枚棋子。被替换的棋子可以和对方交换棋子。最后以先出完所有棋子的一方为胜。棋子棋子分黑白两色。棋子形状为扁圆形,有一面凸起或两面凸起均可。棋子厚度一般不超过0.8厘米,直径应比棋盘上邻近点间的距离略小些,以免影响在棋盘上的行棋。以2.0—2.3厘米为宜。平时下棋,棋子数量不限,以下棋时够用为准。正规的标准数一般定为黑子113枚,白子112枚。棋子材质,重量不限。但以硬质,不易磨损,且放在棋盘上具有一定稳定性为好。
谁有五子棋的高级算法?100分
//五子棋算法类,
public class Check{
private int arraySize; //棋盘大小
private int[][] array; //棋盘大小,用二维数组表示,0表无棋,1表黑棋,2表白棋
private int[][] arrayWhiteChess; //白棋的数组
private int[][] arrayBlackChess; //
Check(int arraySize){
this.arraySize=arraySize;
this.array= new int[this.arraySize][this.arraySize];
this.arrayBlackChess=new int[this.arraySize][this.arraySize];
this.arrayWhiteChess=new int[this.arraySize][this.arraySize];
this.array[6][0]=1;
this.array[6][1]=1;
this.array[6][2]=1;
this.array[6][3]=1;
this.array[6][4]=1;
this.array[1][4]=1;
this.array[2][4]=1;
this.array[3][4]=1;
this.array[4][4]=1;
this.array[5][4]=1;
this.array[0][0]=1;
this.array[1][1]=1;
this.array[2][2]=1;
this.array[3][3]=1;
this.array[4][4]=1;
this.array[1][8]=1;
this.array[2][7]=1;
this.array[3][6]=1;
this.array[4][5]=1;
this.array[5][4]=1;
}
/*
* 棋子放置,由canMove方法保证能否放置到当前位置
*/
public void move(int x,int y,int chessType){
this.array[x][y]=chessType;
if(chessType==1){
this.arrayBlackChess[x][y]=1;
}
else{
this.arrayWhiteChess[x][y]=2;
}
}
/*
* 如果能放置返回true,不能放置返回false,
*/
public boolean canMove(int x,int y){
//如果x,y 小于0,x,y大于等于arraySize不能放
if(x=this.arraySize||y=this.arraySize){
return false;
};
//当前位置有棋子了也不能放
if(this.array[x][y]!=0){
return false;
}
return true;
}
public void clean(){ //清空棋盘
int i,j;
for(i=0;i<this.arraySize;i++){
for(j=0;j<this.arraySize;j++){
this.array[i][j]=0;
}
}
}
public boolean finish(int x,int y,int chessType){
if(chessType==1){ //black
this.array=this.arrayBlackChess;
if(finish(x,y)==true)return true;
}
else{
this.array=this.arrayWhiteChess;
if(finish(x,y)==true)return true;
}
return false;
}
private boolean finish(int x,int y ){ //给一个点,在此点分析是否游戏是否有人胜利
/* 看了一下QQ上面五子棋,直到有五子连珠才给出谁胜
* 俺也这么做
* 开始分析,先只考虑实现,不考虑效益,然后再对算法进行优化
* =====================================================
* 对于一个位置(x,y),下一个连着的棋可以有八个方向
* 2 3 4
* 1 (x,y) 5
* 8 7 6
*
* 最左上角为(0,0)坐标
* 现在只分析如果都有棋子谁胜,而没有分开是白还是黑胜
*/
int times=1; //计数器,记录已经有多少个连着的棋,当times是5时代码return true
int next=1; //开始查找的方向为8时return flase
int temX=x-1;
int temY=y;
//while
//检查15方向
while(true){
if(checkNext(temX,temY,1)==true){ //1的1方向
times++;
temX-=1;
continue;
}
else{
break;
}
}
temX=x+1;
while(true){ //5方向
if(checkNext(temX,y,5)==true){
times++;
temX+=1;
continue;
}
else{
break;
}
}
if(times>=5) return true;
////////////////////////////////////end of check 15 //////////////////////
////////////////////////////////////检查26方向////////////////////////////
times=1;
temX=x-1;
temY=y-1;
while(true){ //检查2方向
if(checkNext(temX,temY,2)==true){
times++;
temX-=1;
temY-=1;
continue;
}
else
{
break;
}
}
temX=x+1;
temY=y+1;
while(true){ //检查6方向
if(checkNext(temX,temY,6)){
times++;
temX+=1;
temY+=1;
continue;
}
else
{
break;
}
}
if(times>=5)return true;
////////////////////////////////////////end o check 26/////////////////////////
////////////////////////////////检查37方向/////////////////////////////////////
temX=x;
temY=y-1;
times=1;
while(true){ //看3方向
if(checkNext(temX,temY,3)==true){
times++;
temY-=1;
continue;
}
else
{
break;
}
}
temY=temY+1;
while(true){ //看6方向
if(checkNext(temX,temY,7)==true){
times++;
temY+=1;
continue;
}
else
{
break;
}
}
if(times>=5)return true;
/////////////////////////////////end of check 5//////////////////////////////
////////////////////////看4 8方向////////////////////////////////////////
temX=x+1;
temY=y-1;
times=1;
while(true){ //看4方向
if(checkNext(temX,temY,4)==true){
times++;
temX=temX+1;
temY=temY-1;
continue;
}
else
{
break;
}
}
temX=x-1;
temY=y+1;
while(true){ //看8方向
if(checkNext(temX,temY,8)==true){
times++;
temX=temX-1;
temY=temY+1;
continue;
}
else
{
break;
}
}
if(times>=5)return true;
////////////////////////////////end of check 4 8 ///////////////////////////
/////////////////////////////////////////////////////
/////////全部完成////////////////////////////////////
///////////////////////////////////////////////////
return false;
}
private boolean checkNext(int x,int y,int next ){ //next表方向,检查下一个方向是否有棋子
switch(next)
{
case 1:
if(x<0) return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 2:
if(x<0||y<0)return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 3:
if(y<0)return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 4:
if(x>=this.arraySize||y<0)return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 5:
if(x>=this.arraySize)return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 6:
if(x>=this.arraySize||y>=this.arraySize) return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 7:
if(y>=this.arraySize)return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 8:
if(x=this.arraySize)return false;
if(this.array[x][y]!=0)
return true;
else
return false;
default:
return false;
}
}
public void test(){ //测试类方法
if(this.finish(3,6)==true){
System.out.println("OK");
}
else
{
System.out.println("false");
}
if(this.finish(3,3)==true){
System.out.println("OK");
}
else
{
System.out.println("false");
}
if(this.finish(3,4)==true){
System.out.println("OK");
}
else
{
System.out.println("false");
}
if(this.finish(6,1)==true){
System.out.println("OK");
}
else
{
System.out.println("false");
}
}
}