用Java实现五子棋对弈
目錄
題目展示
題目分析
代碼實現(xiàn)
結(jié)果展示
題目展示
1.使用二維數(shù)組存儲五子棋棋盤
如下圖
?
2.在控制臺通過Scanner輸入黑白棋坐標(biāo)( 表示二維數(shù)組坐標(biāo)),使用實心五角星和空心五角星表示黑白棋子。
如下圖:
輸入后重新輸出棋盤如下圖:
?
白棋輸入后如下圖:
黑白棋依次重復(fù)輸入下棋。
3.每下一個棋子后需要判斷該棋子是否出界,此位置是否已經(jīng)有棋子,判斷是否有5個棋子連在一起,有則表示勝利,否則繼續(xù)下棋。
題目分析
1.輸出棋盤(重復(fù)使用)方法
(1)棋盤是15行15列的,先創(chuàng)建容量為[15][15]的二維數(shù)組,素材與數(shù)組的創(chuàng)建如下:
static String white = "☆";static String black = "★";static String[][] qp = new String[15][15];static String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖"};static String line = "十";(2)對數(shù)組進行初始化,將默認的null替換為"十",再將最后一行和最后一列進行替換;創(chuàng)建了initQP方法,用兩層循環(huán),取出二維數(shù)組里的每一個元素,判斷是否為最后一行和最后一列,如果是,則用num數(shù)組進行替換:
public static void initQP() {for (int i = 0; i < qp.length; i++) {for (int j = 0; j < qp[i].length; j++) {//取出每一個元素if (i == qp.length - 1) {//判斷是否為最后一行元素qp[i][j] = num[j];//令最后一行第一位為num數(shù)組里的第一位......} else if (j == qp.length - 1) {//判斷是否為最后一列元素qp[i][j] = num[i];//令最后一列第一位為num數(shù)組里的第一位......} else {//如果不是最后一列qp[i][j] = line;//將null替換為line中的"十"}}}}(3)初始化棋盤已經(jīng)完成,現(xiàn)在進行打印棋盤;注意:二維數(shù)組不能用Arrays.toString()輸出,不能輸出里層數(shù)組的值,只能通過數(shù)組的遍歷進行輸出,注意換行:
public static void printQP() {//二維數(shù)組不能用Arrays.toString()輸出,不能輸出里層數(shù)組的值,通過遍歷進行輸出;for (int i = 0; i < qp.length; i++) {for (int j = 0; j < qp[i].length; j++) {System.out.print(qp[i][j]);}System.out.println("");//一行輸出完了,進行換行;}}2.開始下棋,判斷黑白雙方誰下棋,進行交替下棋,基本判斷:棋子是否越界,棋子是否重復(fù)
(1)五子棋黑棋先落子,用戶輸入落子位置,判斷是否有效,無效則需重新落子,有效則判斷輸贏,未獲勝,則輪到白棋落子,進行循環(huán),直至一方獲勝;注:索引從0開始,故輸入值均減一,在這里創(chuàng)建了check方法,來檢查棋子是否有效,有效則返回true,替換上黑棋,打印棋盤,判斷輸贏,同樣,創(chuàng)建iswin方法,未獲勝,則令p=false,進入白棋落子,這里的y代表行數(shù),x代表列數(shù);
static boolean p = true; . . . while (true) {if (p) {System.out.println("請黑子下子:");int y = sc.nextInt() - 1;int x = sc.nextInt() - 1;Boolean t = Demo7.check(x, y);//檢查x,y是否有效if (t) {//有效qp[y][x] = black;printQP();//判斷輸贏Boolean w=iswin(y, x, black);if(w){System.out.println("黑棋獲勝!");break;}else{p = false;//進入白棋下子}} else {System.out.println("無效棋!請重新下子!");}}else {System.out.println("請白子下子:");int y = sc.nextInt() - 1;int x = sc.nextInt() - 1;Boolean t = Demo7.check(x, y);if (t) {qp[y][x] = white;printQP();//判斷輸贏Boolean w=iswin(y, x, white);if(w){System.out.println("白棋獲勝!");break;}else{p = true;//有效則進入下一輪}}else {System.out.println("無效棋!請重新下子!");}}}}(2)判斷棋子是否有效,主要從兩個方面:是否出界,是否下過棋子(判斷該點元素是否為"十"),equals判斷兩數(shù)組元素是否相同,相同返回true;
public static boolean check(int x, int y) {if (x < 0 || x > qp.length - 1 || y < 0 || y > qp.length - 1) {//判斷是否超出邊界return false;}if (!qp[y][x].equals(line)) {//判斷位置是否下過棋子return false;}return true;}3.判斷輸贏
?
(1)每下一個棋子都要判斷輸贏,以當(dāng)前下的棋子為中心,以水平為例,設(shè)定一個水平計數(shù)器,int spsum=1,先向左找,知道第0列,spsum>=5,如果不夠,則繼續(xù)向右找,直至<length-1
int spsum=1;//水平計數(shù)器for(int lx=x-1;lx>=0;lx--){//水平向左查找if(qp[y][lx].equals(qz)){spsum++;}else{break;}if(spsum>=5){return true;}}for(int rx=x+1;rx<qp.length-1;rx++){//水平向右查找if(qp[y][rx].equals(qz)){spsum++;}else{break;}if(spsum>=5){return true;}}(2)豎直找與水平找相似
int szsum=1;//豎直計數(shù)器for(int ny=y-1;ny>=0;ny--){//豎直向上查找if(qp[ny][x].equals(qz)){szsum++;}else{break;}if(szsum>=5){return true;}}for(int sy=y+1;sy<qp.length-1;sy++){//數(shù)值向下查找if(qp[sy][x].equals(qz)){szsum++;}else{break;}if(szsum>=5){return true;}}(3)斜著查找兩個都在變
int lsum=1;//左對角計數(shù)器for(int lnx=x-1,lny=y-1;lnx>=0&&lny>=0;lnx--,lny--){//左斜向上查找if(qp[lny][lnx].equals(qz)){lsum++;}else{break;}if(lsum>=5){return true;}}for(int lsx=x+1,lsy=y+1;lsx<qp.length-1&&lsy<qp.length-1;lsx++,lsy++){//左斜向下查找if(qp[lsy][lsx].equals(qz)){lsum++;}else{break;}if(lsum>=5){return true;}}int rsum=1;//右對角計數(shù)器for(int rnx=x+1,rny=y-1;rnx<qp.length-1&&rny>=0;rnx++,rny--){//右斜向上查找if(qp[rny][rnx].equals(qz)){rsum++;}else{break;}if(rsum>=5){return true;}}for(int rsx=x-1,rsy=y+1;rsy<qp.length-1&&rsx>=0;rsy++,rsx--){//右斜向下查找if(qp[rsy][rsx].equals(qz)){rsum++;}else{break;}if(rsum>=5){return true;}}return false;}代碼實現(xiàn)
在主函數(shù)里使用各個方法,最終代碼如下:
import java.util.Scanner; public class Demo7 {static String white = "☆";static String black = "★";static String[][] qp = new String[15][15];static String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖"};static String line = "十";static Scanner sc = new Scanner(System.in);static boolean p = true;//[0,14] ...[13,14]...[14][0]......[14][14]//14*14public static void main(String[] args) {Demo7.initQP();Demo7.printQP();Demo7.star();}//初始棋盤public static void initQP() {for (int i = 0; i < qp.length; i++) {for (int j = 0; j < qp[i].length; j++) {//取出每一個元素if (i == qp.length - 1) {//判斷是否為最后一行元素qp[i][j] = num[j];//令最后一行第一位為num數(shù)組里的第一位......} else if (j == qp.length - 1) {//判斷是否為最后一列元素qp[i][j] = num[i];//令最后一列第一位為num數(shù)組里的第一位......} else {//如果不是最后一列qp[i][j] = line;//將null替換為line中的"十"}}}}//打印棋盤public static void printQP() {//二維數(shù)組不能用Arrays.toString()輸出,不能輸出里層數(shù)組的值,通過遍歷進行輸出;for (int i = 0; i < qp.length; i++) {for (int j = 0; j < qp[i].length; j++) {System.out.print(qp[i][j]);}System.out.println("");//一行輸出完了,進行換行;}}//開始下棋public static void star() {while (true) {if (p) {System.out.println("請黑子下子:");int y = sc.nextInt() - 1;int x = sc.nextInt() - 1;Boolean t = Demo7.check(x, y);//檢查x,y是否有效if (t) {//有效qp[y][x] = black;printQP();//判斷輸贏Boolean w=iswin(y, x, black);if(w){System.out.println("黑棋獲勝!");break;}else{p = false;//進入白棋下子}} else {System.out.println("無效棋!請重新下子!");}}else {System.out.println("請白子下子:");int y = sc.nextInt() - 1;int x = sc.nextInt() - 1;Boolean t = Demo7.check(x, y);if (t) {qp[y][x] = white;printQP();//判斷輸贏Boolean w=iswin(y, x, white);if(w){System.out.println("白棋獲勝!");break;}else{p = true;//有效則進入下一輪}}else {System.out.println("無效棋!請重新下子!");}}}}//判斷是否為無效子public static boolean check(int x, int y) {if (x < 0 || x > qp.length - 1 || y < 0 || y > qp.length - 1) {//判斷是否超出邊界return false;}if (!qp[y][x].equals(line)) {//判斷位置是否下過棋子return false;}return true;}//判斷輸贏public static boolean iswin(int y, int x, String qz) {int spsum=1;//水平計數(shù)器for(int lx=x-1;lx>=0;lx--){//水平向左查找if(qp[y][lx].equals(qz)){spsum++;}else{break;}if(spsum>=5){return true;}}for(int rx=x+1;rx<qp.length-1;rx++){//水平向右查找if(qp[y][rx].equals(qz)){spsum++;}else{break;}if(spsum>=5){return true;}}int szsum=1;//豎直計數(shù)器for(int ny=y-1;ny>=0;ny--){//豎直向上查找if(qp[ny][x].equals(qz)){szsum++;}else{break;}if(szsum>=5){return true;}}for(int sy=y+1;sy<qp.length-1;sy++){//數(shù)值向下查找if(qp[sy][x].equals(qz)){szsum++;}else{break;}if(szsum>=5){return true;}}int lsum=1;//左對角計數(shù)器for(int lnx=x-1,lny=y-1;lnx>=0&&lny>=0;lnx--,lny--){//左斜向上查找if(qp[lny][lnx].equals(qz)){lsum++;}else{break;}if(lsum>=5){return true;}}for(int lsx=x+1,lsy=y+1;lsx<qp.length-1&&lsy<qp.length-1;lsx++,lsy++){//左斜向下查找if(qp[lsy][lsx].equals(qz)){lsum++;}else{break;}if(lsum>=5){return true;}}int rsum=1;//右對角計數(shù)器for(int rnx=x+1,rny=y-1;rnx<qp.length-1&&rny>=0;rnx++,rny--){//右斜向上查找if(qp[rny][rnx].equals(qz)){rsum++;}else{break;}if(rsum>=5){return true;}}for(int rsx=x-1,rsy=y+1;rsy<qp.length-1&&rsx>=0;rsy++,rsx--){//右斜向下查找if(qp[rsy][rsx].equals(qz)){rsum++;}else{break;}if(rsum>=5){return true;}}return false;} }結(jié)果展示
(1)打印棋盤,黑子先落子
(2)落子有效,白棋落子,進行循環(huán)
?
?(3)判斷出是無效子,重新落子
?
(4)判斷輸贏,結(jié)束對弈
總結(jié)
以上是生活随笔為你收集整理的用Java实现五子棋对弈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016中国VR行业预测研究报告
- 下一篇: 最简单/最详细/手把手/windows1