五子棋小游戏
开发一个简单的五子棋小游戏
落子由双方轮流输入;能够随时暂停,保存当前棋盘数据;能够不由程序自主判断胜负
程序实现
棋盘创建
我们规定:11*11棋盘 0:没有棋子 1:黑棋 2:白棋
int[][] board=new int[11][11];
System.out.println("1:黑棋 2:白棋 其余数字将暂停存盘");
落子
落子需要定位+棋子颜色,即需要接受用户输入三个数:行、列、子色
String[] chess=sc.nextLine().split(" ");
实现接收三个输入
方便用户识别
由于数组创建时行列以0开始,下棋时可能会搞混导致下错位置,于是我们将行列数-1方便用户判断落子位置
int chess1=Integer.parseInt(chess[0]);
int chess2=Integer.parseInt(chess[1]);
int chess3=Integer.parseInt(chess[2]);
board[chess1-1][chess2-1]=chess3;
暂停存盘
用户有事离开时可以选择暂停并将当前棋盘数据存下来
输入大于2的数字即可暂停存盘
存盘功能实现
由于五子棋的特性导致创建棋盘时无子处有很多的重复数据,因此我们可以使用稀疏数组将其减量保存下来
public static int[][] save(int[][] board){
int sum=0;
for (int i = 0; i < 11; i++) {
for(int j=0;j<11;j++){
if(board[i][j]!=0){
sum++;
}
}
}
//创建稀疏数组
int[][] save=new int[sum+1][3];
save[0][0]=11;
save[0][1]=11;
save[0][2]=sum;
System.out.println("棋子个数为"+sum);
//将棋子位置存入稀疏数组实现存盘功能
int countchess=0;
for(int i=0;i<11;i++)
{
for(int j=0;j<11;j++)
{
if(board[i][j]!=0)
{
countchess++;
save[countchess][0]=i+1;
save[countchess][1]=j+1;
save[countchess][2]=board[i][j];
}
}
}
return save;
}
限于篇幅不将稀疏数组原理显示,可移步博主另一篇博客@稀疏数组的使用
读盘功能的实现
程序中断后用户想从之前暂停处继续,那么就将稀疏数组保存的存盘数据复现即可
public static int[][] load(int[][] save){
int[][] load=new int[save[0][0]][save[0][1]];
for(int i=1;i<save.length;i++) {
load[save[i][0]-1][save[i][1]-1]=save[i][2];
}
for(int i=0;i<11;i++)
{
for(int j=0;j<11;j++)
{
System.out.print(load[i][j]+"\t");
if(j==10){
System.out.println();
}
}
}
return load;
}
获胜判断
在用户落子后系统会自动进行判断当前棋盘有没有决出胜负
public static void win(int i){
switch(i){
case 1:
System.out.println("游戏结束,黑棋获胜!");
break;
case 2:
System.out.println("游戏结束,白棋获胜!");
break;
}
}
// ========== 新增:判断五子棋赢家的核心方法(完全不影响原有代码) ==========
/**
* 检测11x11棋盘是否有赢家
* @param board 五子棋棋盘数组(0空、1黑、2白)
* @return 1=黑棋胜,2=白棋胜,0=未分胜负
*/
public static int checkWinner(int[][] board) {
// 遍历整个棋盘的每个位置
for (int row = 0; row < 11; row++) {
for (int col = 0; col < 11; col++) {
int currentChess = board[row][col];
if (currentChess == 0) { // 无棋子则跳过
continue;
}
// 定义4个检测方向:横向、纵向、正斜线(左上→右下)、反斜线(右上→左下)
int[][] directions = {{0, 1}, {1, 0}, {1, 1}, {1, -1}};
for (int[] dir : directions) {
int continuousCount = 1; // 当前棋子本身算1个
// 正向统计(如横向向右、纵向向下)
int r = row + dir[0];
int c = col + dir[1];
while (r >= 0 && r < 11 && c >= 0 && c < 11 && board[r][c] == currentChess) {
continuousCount++;
r += dir[0];
c += dir[1];
}
// 反向统计(如横向向左、纵向向上)
r = row - dir[0];
c = col - dir[1];
while (r >= 0 && r < 11 && c >= 0 && c < 11 && board[r][c] == currentChess) {
continuousCount++;
r -= dir[0];
c -= dir[1];
}
// 连续5个及以上相同棋子,判定获胜
if (continuousCount >= 5) {
return currentChess;
}
}
}
}
return 0; // 未分胜负
}
此功能为该项目重难点,(待编)
源码放出
至此,一个简单的五子棋小游戏以开发完毕,稍后学习前端后可能会为这个小游戏增加界面,未完待续
主程序
package gomoku;
import java.util.Scanner;
import static gomoku.Pause.*;
public class Gomoku {
static void main() {
Scanner sc=new Scanner(System.in);
//创建一个11*11棋盘 0:没有棋子 1:黑棋 2:白棋
int[][] board=new int[11][11];
System.out.println("1:黑棋 2:白棋 其余数字将暂停存盘");
boolean flag=true;
//接受用户输入的黑白棋
while(flag)
{
//检测棋子位置
System.out.println("请输入棋子(行 列 棋子颜色)");
String[] chess=sc.nextLine().split(" ");
int chess1=Integer.parseInt(chess[0]);
int chess2=Integer.parseInt(chess[1]);
int chess3=Integer.parseInt(chess[2]);
if(chess3<3){
board[chess1-1][chess2-1]=chess3;
}else {
System.out.println("用户暂停...");
break;//设置暂停条件
}
//输出当前棋盘
for(int i=0;i<11;i++)
{
for(int j=0;j<11;j++)
{
System.out.print(board[i][j]+"\t");
if(j==10){
System.out.println();
}
}
}
//判断当前是否获胜
int winner = checkWinner(board); // 调用Pause类的checkWinner方法
if (winner != 0) {
win(winner); // 调用你原有win方法输出结果
flag = false; // 获胜后结束游戏循环
}
}
sc.close();
int[][] save=save(board);
//遍历棋盘获得非零(棋子)个数
//输出稀疏数组
/*
for(int i=0;i<save.length;i++)
{
System.out.println(save[i][0]+"\t"+
save[i][1]+"\t"+
save[i][2]+"\t");
}
*/
//将稀疏数组打印为原本的数组
int[][] originalboard=load(save);
//endLine
}
}
方法类
package gomoku;
public class Pause {
// 存盘功能实现
public static int[][] save(int[][] board){
int sum=0;
for (int i = 0; i < 11; i++) {
for(int j=0;j<11;j++){
if(board[i][j]!=0){
sum++;
}
}
}
//创建稀疏数组
int[][] save=new int[sum+1][3];
save[0][0]=11;
save[0][1]=11;
save[0][2]=sum;
System.out.println("棋子个数为"+sum);
//将棋子位置存入稀疏数组实现存盘功能
int countchess=0;
for(int i=0;i<11;i++)
{
for(int j=0;j<11;j++)
{
if(board[i][j]!=0)
{
countchess++;
save[countchess][0]=i+1;
save[countchess][1]=j+1;
save[countchess][2]=board[i][j];
}
}
}
return save;
}
//读盘功能实现
public static int[][] load(int[][] save){
int[][] load=new int[save[0][0]][save[0][1]];
for(int i=1;i<save.length;i++) {
load[save[i][0]-1][save[i][1]-1]=save[i][2];
}
for(int i=0;i<11;i++)
{
for(int j=0;j<11;j++)
{
System.out.print(load[i][j]+"\t");
if(j==10){
System.out.println();
}
}
}
return load;
}
//打印函数
//获胜判断
public static void win(int i){
switch(i){
case 1:
System.out.println("游戏结束,黑棋获胜!");
break;
case 2:
System.out.println("游戏结束,白棋获胜!");
break;
}
}
// ========== 新增:判断五子棋赢家的核心方法(完全不影响原有代码) ==========
/**
* 检测11x11棋盘是否有赢家
* @param board 五子棋棋盘数组(0空、1黑、2白)
* @return 1=黑棋胜, 2=白棋胜,0=未分胜负
*/
public static int checkWinner(int[][] board) {
// 遍历整个棋盘的每个位置
for (int row = 0; row < 11; row++) {
for (int col = 0; col < 11; col++) {
int currentChess = board[row][col];
if (currentChess == 0) { // 无棋子则跳过
continue;
}
// 定义4个检测方向:横向、纵向、正斜线(左上→右下)、反斜线(右上→左下)
int[][] directions = {{0, 1}, {1, 0}, {1, 1}, {1, -1}};
for (int[] dir : directions) {
int continuousCount = 1; // 当前棋子本身算1个
// 正向统计(如横向向右、纵向向下)
int r = row + dir[0];
int c = col + dir[1];
while (r >= 0 && r < 11 && c >= 0 && c < 11 && board[r][c] == currentChess) {
continuousCount++;
r += dir[0];
c += dir[1];
}
// 反向统计(如横向向左、纵向向上)
r = row - dir[0];
c = col - dir[1];
while (r >= 0 && r < 11 && c >= 0 && c < 11 && board[r][c] == currentChess) {
continuousCount++;
r -= dir[0];
c -= dir[1];
}
// 连续5个及以上相同棋子,判定获胜
if (continuousCount >= 5) {
return currentChess;
}
}
}
}
return 0; // 未分胜负
}
}
去年今日此门中,人面桃花相映红
人面不知何处去,桃花依旧笑春风

浙公网安备 33010602011771号