五子棋算法

来源:互联网 发布:2018年中国经济知乎 编辑:程序博客网 时间:2024/04/30 16:27

1.PointBean.java

package com.ccc.chess;
/**
 * 
 * @author Carol
 * 保存一個已經走過的"點"的對象
 *
 */
public class pointBean {
 private double xPosition=-1;//x 橫坐標
 private double yPosition=-1;//y 縱坐標
 private String alreadyPass;//是否有子。有為1.沒有為0
 public String getAlreadyPass() {
  return alreadyPass;
 }
 public void setAlreadyPass(String alreadyPass) {
  this.alreadyPass = alreadyPass;
 }
 
 public double getXPosition() {
  return xPosition;
 }
 public void setXPosition(double position) {
  xPosition = position;
 }
 public double getYPosition() {
  return yPosition;
 }
 public void setYPosition(double position) {
  yPosition = position;
 }
 public void setYPosition(int position) {
  yPosition = position;
 }
 
 
 
}
2.CheckWin.java

package com.ccc.chess;
import com.ccc.chess.pointBean;
import com.ccc.chess.chessBean;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.ArrayList;
/**
 *
 * @author Carol
 *
 */
public class CheckWin {
 /**
  * 冒泡排序 使得點按照從左到右的順序
  * @param it
  * @return
  */
 public List makeXOrder(List it ){
  pointBean pbTemp1 = new pointBean();
  pointBean pbTemp2 = new pointBean();
  pointBean pbtemp=new pointBean();
  if(it!=null&&it.size()>0){
   for(int j=0;j<it.size();j++){
   for(int i=0;i<it.size();i++){
    if(i+1<it.size()){
     pbTemp1=(pointBean)it.get(i);
     pbTemp2=(pointBean)it.get(i+1); 
     if(pbTemp1.getXPosition()>pbTemp2.getXPosition()){
      pbtemp =(pointBean)it.get(i+1);
      it.set(i+1, it.get(i));
      it.set(i, pbtemp);
     }
    }
   }
   }
  }
  for(int i=0;i<it.size();i++){
   pbtemp=(pointBean)it.get(i);
   System.out.println(pbtemp.getXPosition());
  }
  return it;
 } 
 /**
  * 冒泡排序 使得點按照從上到下的順序
  * @param it
  * @return
  */
 public List makeYOrder(List it ){
  pointBean pbTemp1 = new pointBean();
  pointBean pbTemp2 = new pointBean();
  pointBean pbtemp=new pointBean();
  if(it!=null&&it.size()>0){
   for(int j=0;j<it.size();j++){
   for(int i=0;i<it.size();i++){
    if(i+1<it.size()){
     pbTemp1=(pointBean)it.get(i);
     pbTemp2=(pointBean)it.get(i+1);
     if(pbTemp1.getYPosition()>pbTemp2.getYPosition()){
      pbtemp =(pointBean)it.get(i+1);
      it.set(i+1, it.get(i));
      it.set(i, pbtemp);
     }
    }
   }
   }
  }
  return it;
 } 
 /**
  * 判斷 在list中的點 是否在X方向是否有連續5個點
  * @param it
  * @param pb
  * @return
  */
 public boolean isXContinue(List it){
  pointBean pbTemp1 = new pointBean();
  pointBean pbTemp2 = new pointBean();
  CheckWin CheckWin  = new CheckWin();
  int foot=0;
  int temp=0;
  boolean flag = false;
  it=CheckWin.makeXOrder(it);//將存儲的點按照X方向排序排列
  if(it!=null&&it.size()>=5){
   for(int i=temp;i<it.size();i++){
    System.out.println("i =="+i);
    if(i+1<it.size()){
    pbTemp1=(pointBean)it.get(i);
    pbTemp2=(pointBean)it.get(i+1);
    System.out.println("x1 is"+pbTemp2.getXPosition());
    System.out.println("x2 is"+pbTemp1.getXPosition());
    if(pbTemp2.getXPosition()-pbTemp1.getXPosition()==1){//說明步長為1
     foot++;
     System.out.println("foot is"+foot);
     if(foot==4){
      return true;
     }
     
    }
    else{
     if(i+1<it.size()){
     foot=0;
     }
    }
    }
   }
  }
  return flag;
 }
 /**
  *判斷 在list中的點 是否在Y方向是否有連續5個點
  * @param it
  * @return
  */
 public boolean isYContinue(List it){
  pointBean pbTemp1 = new pointBean();
  pointBean pbTemp2 = new pointBean();
  CheckWin CheckWin  = new CheckWin();
  int foot=0;
  int temp=0;
  boolean flag = false;
  it=CheckWin.makeYOrder(it);//將存儲的點按照X方向排序排列
  if(it!=null&&it.size()>=5){
   for(int i=temp;i<it.size();i++){
    //System.out.println("i =="+i);
    if(i+1<it.size()){
    pbTemp1=(pointBean)it.get(i);
    pbTemp2=(pointBean)it.get(i+1);
    //System.out.println("x1 is"+pbTemp2.getYPosition());
    //System.out.println("x2 is"+pbTemp1.getYPosition());
    if(pbTemp2.getYPosition()-pbTemp1.getYPosition()==1){//說明步長為1
     foot++;
     //System.out.println("foot is"+foot);
     if(foot==4){
      return true;
     }
     
    }
    else{
     if(i+1<it.size()){
     foot=0;
     }
    }
    }
   }
  }
  return flag;
 }
 /**
  * 獲得和點"pb"有共同縱坐標的點的集合。將和點"pb"有共同縱坐標的點存儲在LIST中返回
  * @param it  已經存在的點的集合
  * @param pb  當前點
  * @param n   棋盤的大小 面積為n*n
  * @return true:win false :fail
  */
 public boolean getWinOrFail(List it,pointBean pb,int n){
  boolean flag = false;
  if(n<5){
   return false;
  }
  else if(it.size()<4){
   return false;
  }
  else if(pb.getXPosition()<0||pb.getYPosition()<0){
   return false;
  }
  CheckWin CheckWin = new CheckWin();
  pointBean pbTemp = new pointBean();
  double xPosition=pb.getXPosition();//獲得已知點的橫坐標
  double yPosition=pb.getYPosition();//獲得已知點的縱坐標
  double x_position_min=xPosition-4;
  double x_position_max=xPosition+4;
  double y_position_min=yPosition-4;
  double y_position_max=yPosition+4;
  if(x_position_min<=0){//橫向范圍不能超過棋盤的邊界
   x_position_min=0;
  }
  if(x_position_max>=n){
   x_position_max=n;
  }
  
  if(y_position_min<=0){//縱向范圍不能超過棋盤的邊界
   y_position_min=0;
  }
  if(y_position_max>=n){
   y_position_max=n;
  }
  
  List xParallel = new ArrayList();//橫向點的集合
  List yParallel = new ArrayList();//縱向點的集合
  List slider = new ArrayList();//斜向點的集合  45度和135度
  xParallel.add(pb);
  yParallel.add(pb);
  slider.add(pb);
  if(it!=null&&it.size()>=4){
   for(int i=0;i<it.size();i++){
    pbTemp=(pointBean)it.get(i);//獲得鏈表中的點                                     例如當前點的坐標x=6 y=3
    if(yPosition==pbTemp.getYPosition()&&pbTemp.getXPosition()>=x_position_min&&pbTemp.getXPosition()<=x_position_max){//(橫向)
     xParallel.add(pbTemp);//那么就把it中所有y=3   x=between(2,10)的點全部取出來放在LIST中(橫向)
    }
    else if(xPosition==pbTemp.getXPosition()&&pbTemp.getYPosition()>=y_position_min&&pbTemp.getYPosition()<=y_position_max){//(縱向)
     yParallel.add(pbTemp);//那么就把it中所有x=6   y=between(0,7)的點全部取出來放在LIST中(縱向)
    }
    else if(Math.abs(xPosition-pbTemp.getXPosition())==Math.abs(yPosition-pbTemp.getYPosition())&&pbTemp.getXPosition()>=x_position_min&&pbTemp.getXPosition()<=x_position_max&&pbTemp.getYPosition()>=y_position_min&&pbTemp.getYPosition()<=y_position_max){//(斜向)
     slider.add(pbTemp);//那么就把it中所有   y=between(0,7) and x=between(2,10) and abs(xPosition-x)=abs(xPosition-y) 的點全部取出來放在LIST中(斜向)
    }
   } 
  }
  else{
   return false;//如果走過的點為的集合為空或者走過的點不大于4個,那么肯定FAIL
  }
  int pointCount=-1;//已經走過的棋子的個數
  int direct=1;//1橫 2縱向 3 斜
  switch(direct){
  case   1:
  {
  
   pointCount=xParallel.size();
   System.out.println(pointCount);
   if(pointCount>=5){//如果>5才有可能win
   if((pointCount==x_position_max-x_position_min+1)||isXContinue(xParallel))//如果布滿棋子或者連續5個。返回WIN
    {
    flag=true;
    break;
    }
   }
  }
  case 2:
  {
   pointCount=yParallel.size();
   if(pointCount>=5){//如果>5才有可能win
   if((pointCount==y_position_max-y_position_min+1)||isYContinue(yParallel)){
    flag = true;
    break;
   }
   }
  }
  case 3:
  {
   pointCount=slider.size();
   if(pointCount>=5){//如果>5才有可能win
    if((pointCount==Math.min(y_position_max-y_position_min+1, x_position_max-x_position_min+1)+1)||isYContinue(slider)){
     flag = true;
     break;
    }
   }
  }
  } 
  return flag;
 }
 /**
  * 判斷棋盤合法性 n>=5
  * @param position
  * @param n
  * @return
  */
 public boolean isMakeValid(String n){
  boolean flag =false;
  if(Double.parseDouble(n)>=5){
   return true;
  }
  else{
   System.out.println("棋盤的邊長必須大與四!!");
  }
  return flag;
 }
 
 /**
  * 判斷輸入是否合法  坐標>0 and <=邊長 為合法
  * @param position
  * @param n
  * @return
  */
 public boolean isPositionValid(String position,int n){
  boolean flag =false;
  if(Double.parseDouble(position)>=0&&Double.parseDouble(position)<=n){//位置在0
   return true;
  }
  else{
   System.out.println("輸入不合法﹐請重新輸入");
  }
  return flag;
 }
 public static void main(String[] args) {
  CheckWin CheckWin= new CheckWin();
  BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
  String param1="";
  String param2="";
  String n_area="";
  String alread_count="";
  pointBean currentPoint = new pointBean();
  String x_position="";
  String y_position="";
  List it = new ArrayList();
  int i=0;
  int k=0;
  try {
    if(n_area.length()==0){//如果面積還沒輸入﹐就先輸入面積
    while(true){
     System.out.println("棋盤的面積為n*n﹐請輸入棋盤的邊長n:");
     n_area=new String (bf.readLine());
     if(CheckWin.isMakeValid(n_area)){
      break;
     }
    }
    }
    
    if(n_area.length()>0){//輸入面積了后﹐開始輸入各個點的橫坐標和總坐標
     while(true){
     if(param1.length()==0){
      k++;
      while(true){
      System.out.println("請輸第"+k+"個點的橫坐標:");
      param1=new String (bf.readLine());
      if(CheckWin.isPositionValid(param1, Integer.parseInt(n_area))){
       break;
      }
      }
     }
     if(param1.length()>0&&param2.length()==0){
      while(true){
      System.out.println("請輸第"+k+"個點的縱坐標:");
      param2=new String (bf.readLine());
      if(CheckWin.isPositionValid(param2, Integer.parseInt(n_area))){
       break;
      }
      }
     }
     if(param1.length()>0&&param2.length()>0){//坐標都有了以后開始記錄點
      pointBean pb = new pointBean();
      pb.setXPosition(Double.parseDouble(param1));
      pb.setYPosition(Double.parseDouble(param2));
      if(CheckWin.getWinOrFail(it,pb,Integer.parseInt(n_area))){
       System.out.println("恭喜你,贏了");
       break;
      }
      else{
       it.add(pb);
       param1="";
       param2="";
      }
     }
     }
    }
    
  } catch (Exception e) {
   e.printStackTrace();
  }
  
 
 }
 
}
3.ChessBean.java

package com.ccc.chess;
import com.ccc.chess.pointBean;
/**
 * 保存一個棋盤的對象
 * @author Carol
 *
 */
public class chessBean {
 private pointBean pb;

 public pointBean getPb() {
  return pb;
 }

 public void setPb(pointBean pb) {
  this.pb = pb;
 }
}

原创粉丝点击