文章目录
- 一、内容简介:
- 二、基本流程
- 三、具体步骤
- 1.菜单栏
- 2.创建棋盘并初始化为空格
- (1)定义行数、列数为常量
- (2)定义棋盘
- (3)给棋盘添加坐标并初始化棋盘为空格
- 3.打印棋盘
- 4.玩家落子
- 5.判断输赢
- 四、代码实现
- 五、效果展示
一、内容简介:
五子棋小游戏是我们日常生活中经常玩的小游戏,游戏规则也很简单。下面就让我们使用Java来实现五子棋的编写吧!
二、基本流程
1.通过菜单选择开始游戏和退出游戏
2.创建并初始化棋盘为空格
3.打印棋盘
4.玩家以坐标的形式落子
5.判断输赢
三、具体步骤
1.菜单栏
public static void menu() {
System.out.println("-------------------------------------------------------");
System.out.println("---------------1.开始游戏 2.退出游戏----------------");
System.out.println("-------------------------------------------------------");
}
2.创建棋盘并初始化为空格
(1)定义行数、列数为常量
public static final int ROW = 10;//行数
public static final int COL = 10;//列数
public static final String BlackChess = "#";//黑方
public static final String WhiteChess = "*";//白方
(2)定义棋盘
String[][] board = new String[ROW + 1][COL + 1];
多的一行、一列为了添加坐标使用。
(3)给棋盘添加坐标并初始化棋盘为空格
/**
* 给棋盘添加坐标并初始化棋盘为空格
*
* @param board 棋盘
* @param row 行数
* @param col 列数
*/
private static void InitBoard(String[][] board, int row, int col) {
String[] arr = {"1 ", "2 ", "3 ", "4 ", "5 ", "6 ", "7 ", "8 ", "9 ", "10"};
board[row] = arr;
for (int i = 0; i < arr.length; i++) {
board[i][col] = arr[i];
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
board[i][j] = " ";
}
}
System.out.println();
}
}
3.打印棋盘
/**
* 打印棋盘
* @param board 棋盘
* @param row 行数
* @param col 列数
*/
private static void PrintBoard(String[][] board, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col + 1; j++) {
System.out.printf(" %s ", board[i][j]);
if (j < col)
System.out.print("|");
}
System.out.println();
if (i < row - 1) {
for (int j = 0; j < col + 1; j++) {
System.out.print("---");
if (j < col)
System.out.print("|");
}
System.out.println();
}
}
for (int j = 0; j < col; j++) {
System.out.printf(" %s", board[row][j]);
if (j < col - 1)
System.out.print("|");
}
}
4.玩家落子
/**
* 玩家落子
*
* @param board //棋盘
* @param x //横坐标
* @param y //纵坐标
* @param Chess //棋子
* @param row // 行数
* @param col // 列数
*/
private static boolean PlayerMove(String[][] board, int x, int y, String Chess, int row, int col) {
while (true) {
if (x >= 0 && x < row && y >= 0 && y < col) {
if (board[x][y].equals(" ")) {
board[x][y] = Chess;
return false;
} else {
System.out.println("该坐标已被占用!");
return true;
}
} else {
System.out.println("坐标非法,请您重新输入!");
return true;
}
}
}
如果落子成功,返回false,不进入外面的循环;如果落子失败,返回true,进入外面的循环,重新落子。
5.判断输赢
1.判断横着或竖着是否有连续的相同的5颗棋子,这个比较容易实现。
2.判断斜着是否有连续的相同的5颗棋子。
将下的这颗棋子为中心,分别判断它的左上、右下和左下、右上是否有连续的相同的5颗棋子。
/**
* @param board //棋盘
* @param x //横坐标
* @param y //纵坐标
* @param Chess//棋子
* @param row //行数
* @param col //列数
* @return //true或false
*/
private static boolean IsWin(String[][] board, int x, int y, String Chess, int row, int col) {
//判断横或竖是否有相同的五颗棋
for (int i = 0; i < row - 5; i++) {
if (board[x][i].equals(Chess) && board[x][i + 1].equals(Chess) && board[x][i + 2].equals(Chess)
&& board[x][i + 3].equals(Chess)
&& board[x][i + 4].equals(Chess))
return true;
if (board[i][y].equals(Chess) && board[i + 1][y].equals(Chess) && board[i + 2][y].equals(Chess)
&& board[i + 3][y].equals(Chess)
&& board[i + 4][y].equals(Chess))
return true;
}
//判断该棋子的左上、右下和左下、右上是否有连续的相同的五颗棋子
int count1 = 1;
int count2 = 1;
int lx, ly;
//左上
for (lx = x - 1, ly = y + 1; lx >= 0 && ly >= 0; lx--, ly--) {
if (board[lx][ly].equals(Chess)) {
count1++;
if (count1 >= 5)
return true;
} else {
break;
}
}
//右下
for (lx = x + 1, ly = y - 1; lx >= 0 && ly >= 0; lx--, ly--) {
if (board[lx][ly].equals(Chess)) {
count1++;
if (count1 >= 5)
return true;
} else {
break;
}
}
//左下
for (lx = x - 1, ly = y - 1; lx >= 0 && ly >= 0; lx--, ly--) {
if (board[lx][ly].equals(Chess)) {
count2++;
if (count2 >= 5)
return true;
} else {
break;
}
}
//右上
for (lx = x + 1, ly = y + 1; lx >= 0 && ly >= 0; lx--, ly--) {
if (board[lx][ly].equals(Chess)) {
count2++;
if (count2 >= 5)
return true;
} else {
break;
}
}
return false;//没有人赢
}
四、代码实现
import java.util.Scanner;
public class Main {
public static final int ROW = 10;//行数
public static final int COL = 10;//列数
public static final String BlackChess = "#";
public static final String WhiteChess = "*";
public static void main(String[] args) {
Scanner sca = new Scanner(System.in);
menu();
System.out.println("请您输入选择:");
int input = sca.nextInt();
while (true) {
switch (input) {
case 1:
//开始游戏
beginGame(sca);
break;
case 2:
//退出游戏
endGame();
break;
default:
System.out.println("非法输入!");
System.out.println("请您重新输入!");
}
break;
}
}
/**
* 退出游戏
*/
private static void endGame() {
System.out.println("您已退出游戏!");
return;
}
public static void menu() {
System.out.println("-------------------------------------------------------");
System.out.println("---------------1.开始游戏 2.退出游戏----------------");
System.out.println("-------------------------------------------------------");
}
public static void beginGame(Scanner sca) {
//1.定义棋盘
String[][] board = new String[ROW + 1][COL + 1];
//2.给棋盘添加坐标并初始化棋盘为空格
InitBoard(board, ROW, COL);
//3.打印棋盘
PrintBoard(board, ROW, COL);
/**
* 开始下棋
*/
while (true) {
boolean flag = true;
//4.黑方落子
System.out.println();
int x = 0, y = 0;
System.out.println("请黑方落子:");
x = sca.nextInt() - 1;
y = sca.nextInt() - 1;
while (PlayerMove(board, x, y, BlackChess, ROW, COL)) {
System.out.println("请重新输入!");
x = sca.nextInt() - 1;
y = sca.nextInt() - 1;
}
PrintBoard(board, ROW, COL);//打印棋盘
//5.判断输赢
boolean winer = IsWin(board, x, y, BlackChess, ROW, COL);
if (winer) {
System.out.println();
System.out.println("黑方胜!");
System.out.println("游戏结束!");
break;
}
//6.白方落子
System.out.println();
System.out.println("请白方落子");
x = sca.nextInt() - 1;
y = sca.nextInt() - 1;
while (PlayerMove(board, x, y, WhiteChess, ROW, COL)) {
System.out.println("请重新输入!");
x = sca.nextInt() - 1;
y = sca.nextInt() - 1;
}
PrintBoard(board, ROW, COL);//打印棋盘
//判断输赢
if (IsWin(board, x, y, WhiteChess, ROW, COL)) {
System.out.println();
System.out.println("白方胜!");
System.out.println("游戏结束!");
break;
}
}
return;
}
/**
* 玩家落子
*
* @param board //棋盘
* @param x //横坐标
* @param y //纵坐标
* @param Chess //棋子
* @param row // 行数
* @param col // 列数
*/
private static boolean PlayerMove(String[][] board, int x, int y, String Chess, int row, int col) {
while (true) {
if (x >= 0 && x < row && y >= 0 && y < col) {
if (board[x][y].equals(" ")) {
board[x][y] = Chess;
return false;
} else {
System.out.println("该坐标已被占用!");
return true;
}
} else {
System.out.println("坐标非法,请您重新输入!");
return true;
}
}
}
/**
* @param board //棋盘
* @param x //横坐标
* @param y //纵坐标
* @param Chess//棋子
* @param row //行数
* @param col //列数
* @return //true或false
*/
private static boolean IsWin(String[][] board, int x, int y, String Chess, int row, int col) {
//判断横或竖是否有相同的五颗棋
for (int i = 0; i < row - 5; i++) {
if (board[x][i].equals(Chess) && board[x][i + 1].equals(Chess) && board[x][i + 2].equals(Chess)
&& board[x][i + 3].equals(Chess)
&& board[x][i + 4].equals(Chess))
return true;
if (board[i][y].equals(Chess) && board[i + 1][y].equals(Chess) && board[i + 2][y].equals(Chess)
&& board[i + 3][y].equals(Chess)
&& board[i + 4][y].equals(Chess))
return true;
}
//判断该棋子的左上、右下和左下、右上是否有连续的相同的五颗棋子
int count1 = 1;
int count2 = 1;
int lx, ly;
//左上
for (lx = x - 1, ly = y + 1; lx >= 0 && ly >= 0; lx--, ly--) {
if (board[lx][ly].equals(Chess)) {
count1++;
if (count1 >= 5)
return true;
} else {
break;
}
}
//右下
for (lx = x + 1, ly = y - 1; lx >= 0 && ly >= 0; lx--, ly--) {
if (board[lx][ly].equals(Chess)) {
count1++;
if (count1 >= 5)
return true;
} else {
break;
}
}
//左下
for (lx = x - 1, ly = y - 1; lx >= 0 && ly >= 0; lx--, ly--) {
if (board[lx][ly].equals(Chess)) {
count2++;
if (count2 >= 5)
return true;
} else {
break;
}
}
//右上
for (lx = x + 1, ly = y + 1; lx >= 0 && ly >= 0; lx--, ly--) {
if (board[lx][ly].equals(Chess)) {
count2++;
if (count2 >= 5)
return true;
} else {
break;
}
}
return false;//没有人赢
}
/**
* 打印棋盘
* @param board 棋盘
* @param row 行数
* @param col 列数
*/
private static void PrintBoard(String[][] board, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col + 1; j++) {
System.out.printf(" %s ", board[i][j]);
if (j < col)
System.out.print("|");
}
System.out.println();
if (i < row - 1) {
for (int j = 0; j < col + 1; j++) {
System.out.print("---");
if (j < col)
System.out.print("|");
}
System.out.println();
}
}
for (int j = 0; j < col; j++) {
System.out.printf(" %s", board[row][j]);
if (j < col - 1)
System.out.print("|");
}
}
/**
* 给棋盘添加坐标并初始化棋盘为空格
*
* @param board 棋盘
* @param row 行数
* @param col 列数
*/
private static void InitBoard(String[][] board, int row, int col) {
String[] arr = {"1 ", "2 ", "3 ", "4 ", "5 ", "6 ", "7 ", "8 ", "9 ", "10"};
board[row] = arr;
for (int i = 0; i < arr.length; i++) {
board[i][col] = arr[i];
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
board[i][j] = " ";
}
}
System.out.println();
}
}
五、效果展示