【Java基础项目】五子棋

代码逻辑如下:

  1. main 函数是程序的入口点,它首先显示一个主菜单,让玩家选择是开始新游戏还是退出游戏。

  2. init 函数用于初始化游戏数据,将棋盘所有位置设置为0(空地),并将当前回合数flag设置为0,表示白棋先行。

  3. isWin 函数检查给定位置(x, y)的棋子是否形成了五个连续的棋子。它检查水平、垂直、两个对角线方向,如果任一方向形成了五个连续的棋子,则返回1表示获胜。

  4. playerMove 函数允许玩家在棋盘上落子。如果所选位置为空,则落子成功,切换到下一个玩家;如果位置已有棋子,则落子失败。

  5. menuView 函数显示主菜单,并处理玩家的选择。

  6. gameView_ShowMap 函数打印当前棋盘的状态,使用不同的符号表示空地、白子和黑子。

  7. winView 函数在某个玩家获胜时显示胜利信息,并允许玩家按任意键返回主菜单。

  8. gameView 函数是游戏的主要循环,它初始化游戏数据,然后不断循环,让玩家落子,检查获胜条件,直到某个玩家获胜,然后显示胜利界面。

开始编写代码:

package com.qls.project;

import java.awt.*;
import java.util.Scanner;

public class Demo{
    public static Scanner scan = new Scanner(System.in);
    public static int[][] map = new int[19][19]; // 棋盘
    public static int flag; // 当前回合数


    //主函数
    public static void main(String[] args) {
        menuView(); // 主菜单界面
    }

    // 初始化游戏数据
    public static void init(){
        for (int i = 0; i < 19; i++) {
            for (int j = 0; j < 19; j++) {
                map[i][j] = 0; // 初始化棋盘为0,表示空地
            }
        }
        flag = 0; // 初始化当前回合为白棋
    }

    // 判断是否获胜
    public static int isWin(int x, int y){
        // 判断获胜的逻辑
        int value=map[x][y];
        int lineSum = 0;
        for (int i = y; i >= 0; i--) {
            //判断向左
            if (map[x][i] == value) {
                lineSum++;
            } else break;
        }
        for (int i = y + 1; i < map.length - 1; i++) {
            //判断向右
            if (map[x][i] == value) {
                lineSum++;
            } else break;
        }
        if (lineSum >= 5)
            return 1;
        //判断垂直输赢
        int upSum = 0;
        for (int i = x; i >= 0; i--) {
            //判断向上
            if (map[i][y] == value) {
                upSum++;
            } else break;
        }
        for (int i = x + 1; i < map.length - 1; i++) {
            //判断向下
            if (map[i][y] == value) {
                upSum++;
            } else break;
        }
        if (upSum >= 5)
            return 1;
        //判断左斜
        int leftUpSum=0;
        for (int i = x,j=y; i >=0 && j>=0; i--,j--) {
            //判断左上
            if(map[i][j]==value){
                leftUpSum++;
            }else break;
        }
        for (int i = x+1,j=y+1; i <map.length-1 && j<map[0].length-1; i++,j++) {
            //判断右下
            if(map[i][j]==value){
                leftUpSum++;
            }else break;
        }
        if(leftUpSum>=5){
            return 1;
        }
        //判断右斜
        int rightUpSum=0;
        for(int i=x,j=y;i>=0 && j<map[0].length-1;i--,j++){
            //判断右上
            if(map[i][j]==value){
                rightUpSum++;
            }else break;
        }
        for(int i=x+1,j=y-1; i<map.length-1 && j>=0;i++,j--){
            //判断左下
            if(map[i][j]==value){
                rightUpSum++;
            }else break;
        }
        if(rightUpSum>=5){
            return 1;
        }
        else return 0;
    }// 默认返回0,表示没有获胜

    // 玩家落子
    public static int playerMove(int x, int y){
        if (map[x][y] == 0) { // 如果落子位置为空地
            map[x][y] = (flag % 2) + 1; // 将对应位置改为当前玩家的棋子
            flag++; // 切换回合
            return 1; // 落子成功
        } else {
            return 0; // 落子失败,棋盘已有子
        }
    }

    // 主菜单界面
    public static void menuView(){
        System.out.println("**********************************");
        System.out.println("******** 欢迎来到五子棋游戏!********");
        System.out.println("************1. 开始游戏 ***********");
        System.out.println("************0. 退出游戏 ************");
        System.out.println("**********************************");
        System.out.print("请选择操作>:");
        int choice = scan.nextInt();
        switch(choice) {
            case 1:
                gameView(); // 开始游戏
                break;
            case 0:
                System.exit(0); // 退出游戏
                break;
            default:
                System.out.println("无效的选择,请重新输入!");
                menuView(); // 重新显示菜单
        }
    }

    // 打印游戏棋盘
    public static void gameView_ShowMap(){
        //打印标注行
        //System.out.println("\u001B[44m");
        for (int k = 0; k <= 19; k++) {
            if(k == 0){
                System.out.print("  ");
            }else{
                System.out.printf("%3d",(k-1));
            }
        }
        System.out.println();
        for (int i = 0; i < 19; i++) {
            System.out.printf("%3d",i);//打印标注列
            for (int j = 0; j < 19; j++) {
                if (map[i][j] == 0) {
                    System.out.print("\u001B[33m X \u001B[0m"); // 空地
                } else if (map[i][j] == 1) {
                    System.out.print(" ● "); // 白子
                } else if (map[i][j] == 2) {
                    System.out.print(" ○ "); // 黑子
                }
            }
            System.out.println();
        }
        //System.out.println("\u001B[40m");
    }

    // 游戏胜利界面
    public static void winView(){
        if ((flag % 2) + 1 == 1) {
            System.out.println("***********************************");
            System.out.println("********---》黑棋玩家获胜!***********");
            System.out.println("***********************************");
        } else {
            System.out.println("***********************************");
            System.out.println("********---》白棋玩家获胜!***********");
            System.out.println("***********************************");
        }
        System.out.println("按任意键2次回到主菜单...");
        scan.nextLine(); // 清空输入缓冲区
        scan.nextLine(); // 等待用户输入任意键
        menuView(); // 回到主菜单
    }

    // 游戏界面整合
    public static void gameView(){
        init(); // 初始化游戏数据
        while(true){
            gameView_ShowMap(); // 打印游戏界面
            System.out.println("***********************************");
            if ((flag % 2) + 1 == 1) {
                System.out.println("白棋玩家行动:");
            } else {
                System.out.println("黑棋玩家行动:");
            }
            System.out.print("请玩家输入坐标(例如:x y):");
            int x = scan.nextInt();
            int y = scan.nextInt();
            System.out.println("***********************************");
            int result = playerMove(x, y); // 落子
            if (result == 0) {
                System.out.println("落子失败,请重新输入!");
                continue; // 落子失败,重新开始循环
            }

            int winResult = isWin(x, y); // 判断游戏是否胜利
            if (winResult != 0) {
                gameView_ShowMap();
                winView(); // 胜利界面
                break; // 结束当前界面
            }


        }
    }
    }

  • 34
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七洛殇Atrosenet.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值