1. 程式人生 > >Java實驗—四子棋進階

Java實驗—四子棋進階

請參閱教材264頁8.20題敘述編寫一個“四子連”遊戲(注:每次不僅要指定棋子的行而且還要指定列,具體效果如下圖所示;此外,紅黃棋手誰先下應隨機生成)。

執行效果:

程式碼:

import java.util.Scanner;
public class JavaGame {
    int row,column;                       //行列
    String Graph[][];                       //二維棋盤
    String C[]={"紅","黃"};          //棋子顏色
    int empty;                            //棋盤剩餘空格
    public JavaGame(int r,int c){                  //初始化棋盤資料
        empty=r*c;
        row=r;column=c;
        Graph=new String[r][c];
        for(int i=0;i<r;i++)
            for(int j=0;j<c;j++)
                Graph[i][j]="  ";
    }
    public void show(){                            //展示棋盤
        for(int i=row-1;i>=0;i--){
            System.out.print("|");
            for(int j=0;j<column;j++)
                System.out.print(Graph[i][j]+"|");
            System.out.println();
        }
    }
    public  int Input(int x ,int y,int key){              //下棋
        System.out.println(y+" "+x);
        if(y>=column||y<0||x>=row||x<0||!Graph[x][y].equals("  ")){
            System.out.println("輸入有誤,請重新輸入");
            return 1;
        }
        Graph[x][y]=C[key%2];
        empty--;
        return 0;
    }
    public int judge(int x,int y) {                //判斷是否有人勝出
        if (search(Graph[x][y], x, y, 1,  0) + search(Graph[x][y], x, y, -1,  0) == 3|| //水平探測
                search(Graph[x][y], x, y, 1,  1) + search(Graph[x][y], x, y, -1, -1) == 3|| //對角探測
                search(Graph[x][y], x, y, 0,  1) + search(Graph[x][y], x, y,  0, -1) == 3|| //垂直探測
                search(Graph[x][y], x, y, 1, -1) + search(Graph[x][y], x, y, -1,  1) == 3)  //對角探測
            return 1;
        return 0;                          //未有人獲勝
    }
    public int search(String k, int a, int b, int z, int f) {    //單向探測函式
        a += z;	b += f;
        if (b >= column || a >= row || a < 0 || b < 0||!Graph[a][b].equals(k))
            return 0;
        return search(k, a , b , z, f)+1;
    }
    public static void main(String[] args) {
        JavaGame My=new JavaGame(6,7);
        Scanner input=new Scanner(System.in);
        int x,y,key;
        My.show();
        for(int i=(int)(Math.random()*2);;){    //隨機起手
            System.out.print("請在"+My.C[i%2]+"棋手輸入您的棋子所在行(1-6):");
            x=input.nextInt();
            System.out.print("所在列(1-7):");
            y=input.nextInt();
            if(My.Input(x-1,y-1,i)!=0)      //出錯後 執行下一迴圈(i沒有++)
                continue;
            My.show();
            if(My.judge(x-1,y-1)==1){	//判斷是否有人勝出
                System.out.println("恭喜,"+My.C[i%2]+"棋手贏!");
                break;
            }
            if(My.empty==0){					//平局
                System.out.println("Chess draw");
                break;
            }
            i++;
        }
    }
}