//Andy
//最后修改: 2008-11-19
//五子棋游戏1.0版本
//不足:1.没有处理超出边界输入和异常输入
  2.没有判断是否和棋(棋盘满,留了一个chesses可用于判断)
  3.没有实现悔棋等import java.util.*;
public class Chessboard{
//程序入口
public static void main(String args[]){
Chessboard a = new Chessboard();
a.startGame();
}
//棋盘构造器
public Chessboard(){
cb= new char[17][17];
currX=1;
currY=1;
chesses = 0;
initChessboard();
}
//开始游戏
public void startGame(){
System.out.println("=======Five In Row Game=======");
System.out.println("黑子(先手):@");
System.out.println("白子(后手):O");
//轮黑子走为1
int flag = 1;
do{
showChessboard();
if(flag == 1){
System.out.println("!现在轮到 [[黑子]] 走子!");
}
else{
System.out.println("!现在轮到 [[白子]] 走子!");
}
System.out.print("输入下子的行号:");
char x = new Scanner(System.in).nextLine().charAt(0); 
System.out.print("输入下子的列号:");
char y = new Scanner(System.in).nextLine().charAt(0);
String ans = moveChess((flag==1?'@':'O'),x,y);
System.out.println(ans);
//换手
if(ans.equals("====走子成功===="))
flag = -flag;
}while(!haveWinner()); //如果有人获胜,跳出循环
//显示获胜后的棋盘
showChessboard();
//显示谁获胜
if(flag == -1)
System.out.println("黑方胜");
else
System.out.println("白方胜");
}
//显示棋盘
public void showChessboard(){
for(int i=0;i<cb.length;i++){
for(int j=0;j<cb[i].length;j++)
System.out.print(cb[i][j]+"  ");
System.out.println();
}
}

//走子
private String moveChess(char chess,char charPosX,char charPosY){
int tmpX = currX;
int tmpY = currY;
setCurrX(charPosX);
setCurrY(charPosY);
//判断越界
//TODO:...
//判断越界
if(cb[currX][currY] != '*'){
currX=tmpX;
currY=tmpY;
return "====该位置已有子====";
}
cb[currX][currY] = chess;
return "====走子成功====";
} //判断是否有赢家
private boolean haveWinner(){
int x;
int y;
int sum;
  //判断左,右
sum=0;
y=currY;
while(y > 1 && cb[currX][--y] == cb[currX][currY])
{
++sum;
}
y=currY;
while(y < cb[0].length-1 && cb[currX][++y] == cb[currX][currY])
{
++sum;
}
if(sum>=4)
return true; //判断上下
x=currX;
sum=0;
while(x > 1 && cb[--x][currY] == cb[currX][currY])
{
++sum;
}
x=currX;
while(x < cb.length-1 && cb[++x][currY] == cb[currX][currY])
{
++sum;
}
if(sum>=4)
return true; //判断右下,左上
x=currX;
y=currY;
sum=0;
while(x > 1 && y > 1 && cb[--x][--y] == cb[currX][currY])
{
++sum;
}
x=currX;
y=currY;
while(x < cb.length-1 && y < cb[0].length-1 && cb[++x][++y] == cb[currX][currY])
{
++sum;
}
if(sum>=4)
return true; //判断右上,左下
x=currX;
y=currY;
sum=0;
while(x > 1 && y < cb[0].length-1 && cb[--x][++y] == cb[currX][currY])
{
++sum;
}
x=currX;
y=currY;
while(x < cb.length-1 && y > 1 && cb[++x][--y] == cb[currX][currY])
{
++sum;
}
if(sum>=4)
return true;
//没人赢
return false;
}

//初始化棋盘
private void initChessboard(){
cb[0][0] = ' ';
char alpha = 'a';
for(int i=1;i<cb.length;i++){
cb[0][i] = alpha;
cb[i][0] = alpha;
alpha++;
}
for(int i=1;i<cb.length;i++)
for(int j=1;j<cb[1].length;j++) cb[i][j] = '*';
}


//返回当前下子的行字符
private char getCurrX(){
return (char)(currX-1+'a');
}
//返回当前下子的行字符
private char getCurrY(){
return (char)(currY-1+'a');
}
//设置下子的行号
private void setCurrX(char charPos){
currX=charPos-'a'+1;
}
//设置下子的列号
private void setCurrY(char charPos){
currY=charPos-'a'+1;
}


//棋盘
private char[][] cb;
//当前步的坐标
private int currX;
private int currY; 
//下了多少步棋
private int chesses;
}

解决方案 »

  1.   

    ====走子成功====
       a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  
    a  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  @  
    b  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
    c  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
    d  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  @  
    e  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
    f  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
    g  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
    h  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
    i  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
    j  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
    k  O  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
    l  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
    m  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
    n  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
    o  *  *  O  *  *  *  *  *  *  *  *  *  *  *  *  *  
    p  *  *  *  *  *  *  *  *  *  *  *  *  @  *  *  *  
    !现在轮到 [[白子]] 走子!
    输入下子的行号:
      

  2.   

    呵呵 
    网吧 没 jvm
    回家慢慢 看不是说有2个啊
    怎么只有1个
      

  3.   

    事情的起因是源于下面这样的一则广告贴(目前幸运还没有被删除,可以链接成功): 
    http://topic.csdn.net/u/20081028/15/525f32df-6c53-4b46-b847-f04c6fc1faf4.html 事情的发展是在这个贴: 我在移动平台专区被封权限是为什么?这个要找谁? 
    http://topic.csdn.net/u/20081118/08/cf7d0af3-35cc-4fb7-9dc2-4567041b89e5.html?seed=1367941736 事情的最新进展是这样的: [抗议]对硬件/嵌入开发的某些版主武断,简单,粗暴的执法方式表示严重的抗议!  
    http://topic.csdn.net/u/20081119/11/bda8bc5d-98d0-45ee-a1c1-86209d7f121d.html?seed=1457200066 当小贩被野蛮城管打死后之CSDN版 
    http://topic.csdn.net/u/20081120/09/8af968cb-af00-4ddb-8604-dab1fb5421be.html?seed=613093649 我重申一下,我一直不是在为我发广告贴辩护,我是在为处理此事的过程中受到的不合理对待即wxf0204 武断,简单,粗暴加野蛮的方式执法的行为,就我看跟城官差不多,对残踏我作为CSDN网友尊严,无视我作为CSDN网友存在的言行进行回击,悍卫我作为CSDN网友所具有的最基本的权利,而且之前连一个申诉的地方都没有,也没有找到班主封ID,删除留言的规定!别人城管也不会第一次去执法看到有小贩就直接打死,也会先劝导,就第一次收了别人小贩的东西也会开个条说一下情况,开个清单,收了什么,什么时候来取,要受到何种处罚,你们这帮斑猪不通人性,看到小贩直接毙了,之前之后,不声不响,不闻不问,不通人性,比城管还城管...................
    而且还不知反省,以暴抑暴,导致事件恶性循环!大家注意抗议的主题,不是对删除贴子,封ID有异议,对此贴前已经说的很清楚,现在的问题是抗议某些斑猪或者大部分斑猪在处理此事时粗暴的方式,野蛮的态度,狭隘的思想,如果在封ID之前给予警告,封ID之后对被封ID用户说明情况如确认被封的具体原因,封的时间以及当前所犯事件的严重程度等,事情何以至此,现在某些斑主为撑面子,继续执迷不悟,一点服务意识都没有,只会摆淫威! 再者跟城管没得比,别人城管之前还有警告,收了东西之后还要开个单子,通知什么时候去取回,有什么处罚,你们的粗野方式就是直接毙了,一了百了,跟原始人一样,难不成CSDN都是这样,真没人性化,我看别的论坛都是有流程,有说明,有警告,有通知!而且应该还有申诉的渠道,不能一手遮天,一毙完事,一点服务意识都没有,只会摆淫威! 
    知会一下,举手之劳,别的论坛都这么做......你们不这么做就是不通人性.........你自己想下,你这样野蛮,我为何要惧怕你的淫威,你以为你是谁,做错事直接闷棍打死,真正怎么死的都不知,...........不给没有前科的人以任何机会,手段之残忍,心恨之至极...........令人发指........让人不服,还不让辩解.....................,一点服务意识都没有,只会摆淫威 
    一点服务意识都没有,只会摆淫威