五子棋怎么算赢样才算赢

3745人阅读
这篇文章只是简单的绘制了一个棋盘,通过输入坐标(格式举例:3,4)来下棋,然后就是胜利判定算法。我最刚开始的算法会出现数组越界问题,也就是说当棋子下在棋盘最靠边的一圈时就会出现数组越界异常,后来大改了一遍,解决了这个问题。下面是正确的代码:
import java.io.BufferedR
import java.io.InputStreamR
public class five {
//定义棋盘的大小
private static int BOARD_SIZE=15;
//定义一个二维数组用于显示棋盘
private String[][]
//定义一个二维数组用于记录坐标
private int[][]xy=new int[225][2];
//判断是否已胜利
private int[][]idx=new int[15][15];
//count为胜利的步数,每种胜利类型应重置count
int count=0;
//x,y为坐标,q为胜利类型,id来判定已经经历过的点,每种胜利切换时也应该重置count
boolean win=
public void isSuccess(int x,int y,int q,int id)
//以下整个条件判断是为了判断水平方向五子胜利
//判断是否越界
if(x&0||x&=14||y&0||y&=14)
//不是棋子或已访问的格子
if(idx[x][y]!=0||board[x][y]!=&●&)
idx[x][y]=
//System.out.println(&count&+count);
if(count==5)
System.out.println(&您已胜利!&);
//横向胜利判断
for(int i=-1;i&2;i++)
isSuccess(x+i,y,0,id);
//纵向胜利判断
for(int i=-1;i&2;i++)
isSuccess(x,y+i,1,id);
//从左上到右下
for(int i=-1;i&2;i++)
isSuccess(x+i,y+i,2,id);
//以下用于判断从右上到左下的胜利
for(int i=-1;i&2;i++)
isSuccess(x-i,y+i,3,id);
//初始化棋盘
public void initBoard()
board=new String[BOARD_SIZE][BOARD_SIZE];
for(int i=0;i&BOARD_SIZE;i++)
for(int j=0;j&BOARD_SIZE;j++)
board[i][j]=&+&;
//board[i][j]=&?&;
//控制台输出棋盘的方法
public void printBoard(){
for(int i=0;i&BOARD_SIZE;i++)
for(int j=0;j&BOARD_SIZE;j++)
System.out.print(board[i][j]);
System.out.println();
public static void main(String [] args)throws Exception
five gb=new five();
gb.initBoard();
gb.printBoard();
int step=0;
//用于获得键盘输入的方法
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String inputStr=
while((inputStr=br.readLine())!=null)
String[] posStrArr=inputStr.split(&,&);
int xPos=Integer.parseInt(posStrArr[0]);
int yPos=Integer.parseInt(posStrArr[1]);
if(gb.board[xPos-1][yPos-1]==&●&)
System.out.println(&该点已有棋子,请选择其它落点&);
gb.printBoard();
gb.xy[step][0]=xPos-1;
gb.xy[step][1]=yPos-1;
gb.board[xPos-1][yPos-1]=&●&;
gb.printBoard();
for(int i=0;i&i++)
for(int j=0;j&4;j++)
{if(gb.win)
gb.isSuccess(gb.xy[i][0], gb.xy[i][1], j, id++);
// System.out.println(&i=&+i+&;
for(int a=0;a&15;a++)
for(int b=0;b&15;b++)
gb.idx[a][b]=0;
gb.count=0;
System.out.println(&请输入您下棋的坐标,应以x,y的形式&);
下面是之前会出现数组越界错误的代码,虽然存在问题,但思路是对的,也放上来吧。
import java.io.BufferedR
import java.io.InputStreamR
public class Gobang {
//定义棋盘的大小
private static int BOARD_SIZE=15;
//定义一个二维数组用于显示棋盘
private String[][]
//初始化棋盘
public void initBoard()
board=new String[BOARD_SIZE][BOARD_SIZE];
for(int i=0;i&BOARD_SIZE;i++)
for(int j=0;j&BOARD_SIZE;j++)
board[i][j]=&+&;
//board[i][j]=&?&;
//控制台输出棋盘的方法
public void printBoard(){
for(int i=0;i&BOARD_SIZE;i++)
for(int j=0;j&BOARD_SIZE;j++)
System.out.print(board[i][j]);
System.out.println();
public static void main(String [] args)throws Exception
Gobang gb=new Gobang();
gb.initBoard();
gb.printBoard();
int [] px=new int[225];
int [] py=new int [225];
int count=0;
//用于获得键盘输入的方法
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String inputStr=
while((inputStr=br.readLine())!=null)
String[] posStrArr=inputStr.split(&,&);
int xPos=Integer.parseInt(posStrArr[0]);
int yPos=Integer.parseInt(posStrArr[1]);
if(gb.board[xPos-1][yPos-1]==&●&)
System.out.println(&该点已有棋子,请选择其它落点&);
gb.printBoard();
px[count]=xPos-1;
py[count]=yPos-1;
gb.board[xPos-1][yPos-1]=&●&;
gb.printBoard();
if(count&=5)
for(int i=0;i&i++)
int x=px[i];
int y=py[i];
//以下整个条件判断是为了判断水平方向五子胜利
if(x!=0&&x!=14&&y!=0&&y!=14)
if(gb.board[x-1][y]==&●&||gb.board[x+1][y]==&●&)
//用于记录已有几个点相连
//这个条件判断为了避免数组越界
while(gb.board[a][y]==&●&)
System.out.println(&您已获胜&);
//同样为了避免数组越界
while(gb.board[b][y]==&●&)
System.out.println(&您已获胜&);
//以下判断为了判断纵向胜利
if(gb.board[x][y-1]==&●&||gb.board[x][y+1]==&●&)
{//用于记录已有几个点相连
int a=y-1;
int b=y+1;
while(gb.board[x][a]==&●&)
System.out.println(&您已获胜&);
while(gb.board[x][b]==&●&)
System.out.println(&您已获胜&);
//以下用于判断从左上到右下的胜利
if(gb.board[x-1][y-1]==&●&||gb.board[x+1][y+1]==&●&)
{//用于记录已有几个点相连
int a=x-1;
int b=y-1;
if(a!=0&&b!=0)
while(gb.board[a][b]==&●&)
if(a==0||b==0)
System.out.println(&您已获胜&);
if(b!=14&&a!=14)
while(gb.board[x][b]==&●&)
if(a==14||b==14)
System.out.println(&您已获胜&);
//以下用于判断从右上到左下的胜利
if(gb.board[x-1][y+1]==&●&||gb.board[x+1][y-1]==&●&)
{//用于记录已有几个点相连
int a=x-1;
int b=y+1;
if(a!=0&&b!=14)
while(gb.board[a][b]==&●&)
if(a==0||b==14)
System.out.println(&您已获胜&);
if(b!=14&&a!=14)
while(gb.board[x][b]==&●&)
if(a==14||b==0)
System.out.println(&您已获胜&);
}else if(x==0)
System.out.println(&请输入您下棋的坐标,应以x,y的形式&);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:28553次
排名:千里之外
原创:61篇
(4)(7)(1)(6)(15)(23)(5)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'五子棋是先落子的人赢的概率大,还是后落子的人赢的概率大?统计结论是怎样的? - 知乎10被浏览2545分享邀请回答1010 条评论分享收藏感谢收起

我要回帖

更多关于 五子棋赢了要拿棋吗 的文章

 

随机推荐