前言
本篇主要记录自己做完五子棋后的代码分享和问题回顾
一、创建棋盘
五子棋由15*15共125个单元,可以通过二维数组创建,
然后通过for循环嵌套if语句赋值
package javaBase.javase.gobang;
import java.util.HashMap;
import java.util.Map;
/**
* @author liwei
* @title: ChessBoard
* @projectName JavaTest
* @description: TODO
* @date 2022/6/1415:12
*/
//棋盘类(Chessboard ):Piece[15][15] pieceArr. 初始化棋盘(给pieceArr赋初始值), 打印棋盘,落子方法
public class ChessBoard {
//不要直接为棋盘二维数组定义大小,可以先定义两个final类型的常量为其赋值
public static final int ROW_MAX = 15;
public static final int COLUMN_MAX = 15;
private Pieces[][] pieceArr = new Pieces[ROW_MAX][COLUMN_MAX];
ChessBoard(){}
public Pieces[][] getPieceArr(){
return pieceArr;
}
//初始化棋盘
public void init(){
for (int i = 0; i < ROW_MAX; i++) {
for (int j = 0; j < COLUMN_MAX; j++) {
Pieces p = null;
if(i == 0){
if(j==0){
p = new Pieces(i,j,"┌");
pieceArr[i][j] = p;
}else if(j == COLUMN_MAX-1){
p = new Pieces(i,j,"┐");
}else {
p = new Pieces(i,j,"┬");
}
}else if(i == ROW_MAX-1){
if (j == 0){
p = new Pieces(i,j,"└");
}else if(j == COLUMN_MAX-1){
p = new Pieces(i,j,"┘");
}else{
p = new Pieces(i,j,"┴");
}
}else{
if (j == 0){
p = new Pieces(i,j,"├");
}else if(j == COLUMN_MAX-1){
p = new Pieces(i,j,"┤");
}else{
p = new Pieces(i,j,"┼");
}
}
pieceArr[i][j] = p;
}
}
}
//打印棋盘
public void printChessBoard(){
String[] arr = {"1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
System.out.print(" ");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
for (int i = 0; i < pieceArr.length; i++) {
System.out.print(arr[i]);
for (int j = 0; j < pieceArr.length; j++) {
if (j < COLUMN_MAX-1){
System.out.print(pieceArr[i][j].getSymbol()+"──");
}else {
System.out.print(pieceArr[i][j].getSymbol());
}
}
System.out.println();
}
}
//判断有没有棋子,没有则赋值
public boolean moveLater(Pieces pieces){
//判断该位置是否存在棋子
boolean flag = false;
if(Rule.isMoveLater(pieces,pieceArr)){
pieceArr[pieces.getRow()][pieces.getColumn()] = pieces;
flag = true;
}else{
System.out.println("此处已存在棋子,请重新落位");
}
return flag;
}
}
棋盘的效果如下图所示:
二、创建棋子
package javaBase.javase.gobang;
/**
* @author liwei
* @title: Pieces
* @projectName JavaTest
* @description: TODO
* @date 2022/6/1415:06
*/
//棋子由横坐标,纵坐标和特殊符号构成
public class Pieces {
private Integer row;
private Integer column;
private String symbol;
public Pieces(){}
public Pieces(Integer row, Integer column, String symbol) {
this.row = row;
this.column = column;
this.symbol = symbol;
}
public Integer getRow() {
return row;
}
public void setRow(Integer row) {
this.row = row;
}
public Integer getColumn() {
return column;
}
public void setColumn(Integer column) {
this.column = column;
}
public String getSymbol() {
return symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
@Override
public String toString() {
return "Pieces{" +
"row=" + row +
", column=" + column +
", symbol=" + symbol +
'}';
}
}
三、定义五子棋规则
package javaBase.javase.gobang;
import java.util.HashMap;
import java.util.Map;
/**
* @author liwei
* @title: Rule
* @projectName JavaTest
* @description: TODO
* @date 2022/6/1415:57
*/
public class Rule {
Rule() {
}
//判断下标,通过map来存储每个字符的值,这样输入大小写都可判断
public static Pieces judgeIndex(String x,String y){
Map<String,Integer> map = new HashMap() {{
put("A",10);
put("a",10);
put("B",11);
put("b",11);
put("C",12);
put("c",12);
put("D",13);
put("d",13);
put("E",14);
put("e",14);
put("F",15);
put("f",15);
}};
Pieces pieces = new Pieces(0,0,"");
//横坐标
int row = 0;
//纵坐标
int column = 0;
for (int i = 1; i < 10; i++) {
if(Integer.toString(i).equals(x)){
row = Integer.parseInt(x)-1;
break;
}
}
if(map.get(x) != null){
row = map.get(x)-1;
}
for (int i = 1; i < 10; i++) {
if(Integer.toString(i).equals(y)){
column = Integer.parseInt(y)-1;
break;
}
}
if(map.get(y) != null){
column = map.get(y)-1;
}
pieces.setRow(row);
pieces.setColumn(column);
return pieces;
}
public static boolean isMoveLater(Pieces pieces, Pieces[][] array) {
if (array[pieces.getRow()][pieces.getColumn()].getSymbol().equals("o") ||
array[pieces.getRow()][pieces.getColumn()].getSymbol().equals("●")) {
return false;
} else {
return true;
}
}
//判断五子相连
public static boolean isSuccess(Pieces pieces, Pieces[][] array) {
Integer row = pieces.getRow();
Integer column = pieces.getColumn();
String symbol = pieces.getSymbol();
//判断有没有5个一样的
int index = 1;
//水平向左
int x = 0;
int y = row-1;
while(y>=0){
if (array[y][column].getSymbol() == symbol) {
index++;
y--;
}else {
break;
}
}
y = row + 1;
//水平向右
while (y <= ChessBoard.COLUMN_MAX-1){
if (array[y][column].getSymbol() == symbol) {
index++;
y++;
}else {
break;
}
}
if (index >= 5){
return true;
}
index = 1;
/* 垂直向下
*/
x = column - 1;
while(x>=0){
if (array[row][x].getSymbol() == symbol) {
index++;
x--;
}else {
break;
}
}
x = column + 1;
//垂直向上
while (x <= ChessBoard.COLUMN_MAX-1){
if (array[row][x].getSymbol() == symbol) {
index++;
x++;
}else {
break;
}
}
if (index >= 5){
return true;
}
index = 1;
/**判断左上右下方向上的胜负
* 先判断左边的
*/
x = row-1;
y = column+1;
while (x >= 0 && y <= ChessBoard.COLUMN_MAX){
if (array[x][y].getSymbol() == symbol) {
index++;
x--;
y++;
}else {
break;
}
}
//判断右边的
x = row + 1;
y = column - 1;
while (x <= ChessBoard.ROW_MAX-1 && y >= 0){
if (array[x][y].getSymbol() == symbol) {
index++;
x++;
y--;
}else {
break;
}
}
if (index >= 5) {
return true;
}
index = 1;
/**判断左下右上方向上的胜负
* 判断左边的
*/
x = row -1;
y = column -1;
while (x >= 0 && y >= 0){
if (array[x][y].getSymbol() == symbol) {
index++;
x--;
y--;
}else {
break;
}
}
x = row +1;
y = column+1;
//判断右边的
while (x <= ChessBoard.ROW_MAX-1 && y <= ChessBoard.COLUMN_MAX-1){
if (array[x][y].getSymbol() == symbol) {
index++;
x++;
y++;
}else {
break;
}
}
if (index >= 5) {
return true;
}
return false;
}
}
四、编写测试语句
package javaBase.javase.gobang;
import java.util.Scanner;
/**
* @author liwei
* @title: GoBang
* @projectName JavaTest
* @description: TODO
* @date 2022/6/1414:37
*/
//通过index是奇数还是偶数来判断黑棋和白棋
public class GoBang {
public static void main(String[] args) {
ChessBoard chessBoard = new ChessBoard();
chessBoard.init();
Pieces[][] pieceArr = chessBoard.getPieceArr();
//黑白棋子
String symbol1 = "●";
String symbol2 = "o";
//落子次数
int index = 0;
Scanner sc = new Scanner(System.in);
//判断该位置是否存在棋子
boolean flag1 = false;
//判断游戏胜利
boolean flag2 = false;
while (true) {
Pieces pieces = new Pieces(0, 0, "");
chessBoard.printChessBoard();
System.out.print("请输入落点位置(例如5,A):");
String s = sc.nextLine();
while (s.length() != 3 || (s.charAt(0) < '1' && s.charAt(0) > '9')
|| s.charAt(1) != ',' || (s.charAt(1) < 'A' && s.charAt(1) > 'F')) {
System.out.print("位置输入有误,请重新输入(例如A,9):");
s = sc.nextLine();
}
String[] split = s.split(",");
String x = split[0];
String y = split[1];
pieces = Rule.judgeIndex(x, y);
if (index % 2 == 0) {
pieces.setSymbol(symbol1);
} else {
pieces.setSymbol(symbol2);
}
flag1 = chessBoard.moveLater(pieces);
if (flag1) {
index++;
}
flag2 = Rule.isSuccess(pieces, pieceArr);
if (flag2) {
chessBoard.printChessBoard();
System.out.println(pieces.getSymbol() + "游戏胜利,比赛结束!");
break;
}
}
}
}
最终效果如图所示:
我声明的是黑棋先行,所以说黑棋胜利,如有需要,也可以自己变更
总结
五子棋只是一个小小的磨练,百炼成钢,如果你看到了这里,告诉你一个关于idea的好的操作,按ctrl+alt+L为代码规范位置,ctrl+alt+O清理无用的引入包