**題目要求:**實現一個控制檯下五子棋的程序。用一個二維數組模擬一個15*15路的五子棋棋盤,把每個元素賦值位“┼”可以畫出棋盤, “○”代表該交叉點下了一顆白棋子,“●”代表該交叉點下了一顆黑棋子。每次用戶輸入要下棋的座標,然後程序顯示出下完後的棋盤,默認黑子先行。
遇到問題:
不知道如何用代碼實現判斷哪一方先贏。
(內心os:在網上搜的結果給出的代碼完成的功能太多了,我這種渣渣的初學者根本看不懂。)
--------------------分割線------------------------------9.21號---------------------------
採用了最簡單的方法來完成,每輸入一個點的座標就進行遍歷,看是否有五子相連的;一開始想不明白的問題有:不知道怎末判斷是不是五子相連;把五子相連的判斷函數寫出來之後不知道main()函數怎末寫了,每輸入一個點座標就進行判斷,需要循環,循環條件是什莫呢?while(!judge(x,y))?當然不對,因爲這時候都沒有輸入座標怎末調用方法呢,一開始寫的時候把輸入黑子座標及白子座標分開來寫成兩個方法了,後來發現這樣不行,因爲main方法裏就沒有點的座標了,這樣judge方法也不能調用了,於是在main方法裏定義了x和Y,然後輸入點的座標,用了一個t值來控制循環。
代碼如下:
/**
* 五子棋遊戲,二維數組
* 五子相連判斷算法
* 每輸入一個點,就遍歷判斷一次輸贏
*/
package shiyan5;
import java.util.Scanner;
public class shiyan5 {
public static String [][]arr;//全局變量
public static final String BLACK_CHESS="●";
public static final String WHITE_CHESS="○";//棋子
public static void main(String [] args) {
int x;
int y;
int t=0;
init();
while(t==0) {
System.out.println("輸入黑子座標");
Scanner sc=new Scanner(System.in);
System.out.print("請輸入x:");
x=sc.nextInt();
System.out.print("請輸入y:");
y=sc.nextInt();
black(x,y);
if(!judge(x,y)) {
t=0;
}else {
t=1;
}
System.out.println("輸入白子座標");
System.out.print("請輸入x:");
x=sc.nextInt();
System.out.print("請輸入y:");
y=sc.nextInt();
white(x,y);
if(!judge(x,y)) {
t=0;
}else {
t=1;
}
}
}
/**
* 對棋盤進行初始化
*/
public static void init() {
arr=new String[15][15];
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
arr[i][j]="+";
}
}
}
public static void show() {
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
System.out.print(" "+arr[i][j]);
}
System.out.println();
}
}
/*
* 輸入黑子座標
*/
public static void black(int x,int y) {
arr[x][y]=BLACK_CHESS;
show();
}
/*
* 輸入白子的座標
*/
public static void white(int x,int y) {
arr[x][y]=WHITE_CHESS;
show();
}
/*
* 判斷輸贏
*/
public static boolean judge(int x,int y) {
int i;
int j;
int count=0;//計數
int winflag=1;
//垂直方向
//向上讀取
for(i=x-1,j=y;i>=0&&count++<5;i--) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
//向下讀取
count=0;
for(i=x+1,j=y;i<15&&count++<5;i++) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
if(winflag>=5) {
System.out.println(arr[x][y]+"勝利");
return true;
}else {
winflag=1;
}
//水平方向
//向右讀取
for(i=x,j=y+1;j<15&&count++<5;j++) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
//向左讀取
for(i=x,j=y-1;j>=0&&count++<5;j--) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
if(winflag>=5) {
System.out.println(arr[x][y]+"勝利");
return true;
}else {
winflag=1;
}
//主對角線方向
//右下
for(i=x+1,j=y+1;i<15&&j<3&&count++<5;i++,j++) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
//左上
for(i=x-1,j=y-1;i>=0&&j>=0&&count++<5;i--,j--) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
if(winflag>=5) {
System.out.println(arr[x][y]+"勝利");
return true;
}else {
winflag=1;
}
//斜對角線方向
//右上
for(i=x-1,j=y+1;i>=0&&j<15&&count++<5;i--,j--) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
for(i=x+1,j=y-1;i<15&&y>=0&&count++<5;i++,j--) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
if(winflag>=5) {
System.out.println(arr[x][y]+"勝利");
return true;
}else {
winflag=1;
}
return false;//所有方向讀取完,沒有
}
}
---------------------分割線------------------------------------------
學習java的路剛剛開始,要繼續加油呀,
2019.9.21