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&¶m2.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&¶m2.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;
}
}