用java编写五子棋游戏2之判断输赢
今天我们来写如何判断输赢
首先要判断一个格子是否在棋盘范围内 private boolean verify(int row,int col) { return (row>=0&&row<this.rows&&col>=0&&col<this.cols); }
然后我们要分三步查看是否满足胜利条件 第一步是查看一行当中有没有五个连起来的 这里的两个参数表示下的最后一步棋所在的行与列。 private boolean checkrow(int row,int col) { for(int i=row-4;i<=row;i++) { (往左推五个格子依次判断) if(verify(i,col)) { (先判断是否在棋盘范围内) if((labels[i][col].getBackground()).equals(colors[clickcount%2]) &&(labels[i+1][col].getBackground()).equals(colors[clickcount%2]) &&(labels[i+2][col].getBackground()).equals(colors[clickcount%2]) &&(labels[i+3][col].getBackground()).equals(colors[clickcount%2]) &&(labels[i+4][col].getBackground()).equals(colors[clickcount%2])){ return true; } } } return false; } 在这里红色的计数器是偶数,所以除以二的余数是0,在colors里面对应的就是红色。同样黄色的计数器是奇数,除以二的余数是1,在colors里面对应的就是黄色。通过这种方式我们就不需要写两遍代码了。
然后是判断一列当中有没有五个连起来的 private boolean checkcol(int row,int col) { for(int i=col-4;i<=col;i++) { if(verify(row,i)) { if((labels[row][i].getBackground()).equals(colors[clickcount%2]) &&(labels[row][i+1].getBackground()).equals(colors[clickcount%2]) &&(labels[row][i+2].getBackground()).equals(colors[clickcount%2]) &&(labels[row][i+3].getBackground()).equals(colors[clickcount%2]) &&(labels[row][i+4].getBackground()).equals(colors[clickcount%2])){ return true; } } } return false; }
这个方法的主题跟checkrow很类似,这里就不详细说明了。
最后是查看对角线 private boolean checkdiagonal(int row,int col) { //因为行与列同时在变,这里就要用到两个for循环 for(int i=row-4;i<=row;i++) { for(int j=col-4;j<col;j++) { if(verify(i,j)&&(row-i)==(col-j)) {(这里第二个判断标准是确保所查看的格子与下棋的格子处在同一对角线上,这样可以运算地快一些) if((labels[i][j].getBackground()).equals(colors[clickcount%2]) &&(labels[i+1][j+1].getBackground()).equals(colors[clickcount%2]) &&(labels[i+2][j+2].getBackground()).equals(colors[clickcount%2]) &&(labels[i+3][j+3].getBackground()).equals(colors[clickcount%2]) &&(labels[i+4][j+4].getBackground()).equals(colors[clickcount%2])){ return true; } } } }
return false; }
现在三步都已经完成了,我们就可以判断是否胜利了 private boolean isWin(int row,int col) { return (checkrow(row,col)||checkcol(row,col)||checkdiagonal(row,col)); } 这里用“||”因为只要满足其中任何一个条件就可以视为胜利
最后为了呈现出胜利的效果,我们可以单独创建一个JFrame,表示获胜的一方。 public JFrame congrats(Color color) {(这里的参数Color指的是对弈双方红色或黄色) JFrame answer=new JFrame(); answer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); answer.setSize(200,200); JLabel a=new JLabel(“Congratulations!”,JLabel.CENTER); a.setBorder(BorderFactory.createLineBorder(Color.GRAY)); a.setOpaque(true); a.setBackground(color); answer.add(a); answer.setVisible(true); return answer; }
然后我们就在监听器里面加上 if(isWin(m.row,m.col)) { congrats(colors[clickcount%2]); } 就可以了
现在我们已经完成了游戏的主体制作,我们只需要一个main函数来运行这个游戏。 public static void main(String[] args) { JFrame frame=new JFrame(); board game=new board(); int[] a=game.Returnsize(); frame.setSize(a[1], a[0]); frame.setTitle(“五子棋”); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c=frame.getContentPane(); c.add(game); frame.setVisible(true); }
大功告成了!!!希望大家能够提出你们宝贵的意见和建议。