You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java新手求助:如何优化IntelliJ IDEA中JDK8编写的游戏代码?

代码优化与新手编程建议

我是编程新手,这是我写的第一个程序之一,代码太臃肿,用IntelliJ IDEA + JDK SE 8开发,想知道怎么高效写代码,以下是我的代码:

import java.util.Objects;
import java.util.Scanner;

public class Game {

    public static void main(String[] args) {

        String[][] OxO = {{
"@","@","@","@","@","@","@","@"},
                          {"@","P","O"," "," "," "," ","@",""," "},
                          {"@"," "," "," ","O","O"," ","@",""," "},
                          {"@","O"," ","O","O"," "," ","@",""," "},
                          {"@"," "," ","O","X"," "," ","@",""," "},
                          {"@"," ","O","O","O","O"," ","@",""," "},
                          {"@"," "," "," "," "," "," ","@",""," "},
                          {"@","@","@","@","@","@","@","@"}};
        int x = 1;
        int y = 1;

        System.out.println("Enter 'w','a','s', or 'd' to play. You are 'P' and your objective is to get to the 'X'");

        while(OxO[4][4] != "P") {

            System.out.println(OxO[0][0]+OxO[0][1]+OxO[0][2]+OxO[0][3]+OxO[0][4]+OxO[0][5]+OxO[0][6]+OxO[0][7]);
            System.out.println(OxO[1][0]+OxO[1][1]+OxO[1][2]+OxO[1][3]+OxO[1][4]+OxO[1][5]+OxO[1][6]+OxO[1][7]);
            System.out.println(OxO[2][0]+OxO[2][1]+OxO[2][2]+OxO[2][3]+OxO[2][4]+OxO[2][5]+OxO[2][6]+OxO[2][7]);
            System.out.println(OxO[3][0]+OxO[3][1]+OxO[3][2]+OxO[3][3]+OxO[3][4]+OxO[3][5]+OxO[3][6]+OxO[3][7]);
            System.out.println(OxO[4][0]+OxO[4][1]+OxO[4][2]+OxO[4][3]+OxO[4][4]+OxO[4][5]+OxO[4][6]+OxO[4][7]);
            System.out.println(OxO[5][0]+OxO[5][1]+OxO[5][2]+OxO[5][3]+OxO[5][4]+OxO[5][5]+OxO[5][6]+OxO[5][7]);
            System.out.println(OxO[6][0]+OxO[6][1]+OxO[6][2]+OxO[6][3]+OxO[6][4]+OxO[6][5]+OxO[6][6]+OxO[6][7]);
            System.out.println(OxO[7][0]+OxO[7][1]+OxO[7][2]+OxO[7][3]+OxO[7][4]+OxO[7][5]+OxO[7][6]+OxO[7][7]);
            Scanner scanner = new Scanner(System.in);
            String movement = scanner.nextLine();
            if(Objects.equals(movement, "a")) {
                int old = x;
                x = x - 1;
                OxO[y][8] = OxO[y][old];
                if(Objects.equals(OxO[y][x], "O") || Objects.equals(OxO[y][x], "@")) {
                    x = x+1;
                } else {
                    OxO[y][x] = OxO[y][8];
                    OxO[y][old] = " ";
                }
            } else if (Objects.equals(movement, "d")) {
                int old = x;
                x = x + 1;
                OxO[y][8] = OxO[y][old];
                if(Objects.equals(OxO[y][x], "O") || Objects.equals(OxO[y][x], "@")) {
                    x = x-1;
                } else {
                    OxO[y][x] = OxO[y][8];
                    OxO[y][old] = " ";
                }
            } else if (Objects.equals(movement, "w")) {
                int old = y;
                y = y - 1;
                OxO[y][8] = OxO[old][x];
                if(Objects.equals(OxO[y][x], "O") || Objects.equals(OxO[y][x], "@")) {
                    y = y+1;
                } else {
                    OxO[y][x] = OxO[y][8];
                    OxO[old][x] = " ";
                }
            } else if (Objects.equals(movement, "s")) {
                int old = y;
                y = y + 1;
                OxO[y][8] = OxO[old][x];
                if(Objects.equals(OxO[y][x], "O") || Objects.equals(OxO[y][x], "@")) {
                    y = y-1;
                } else {
                    OxO[y][x] = OxO[y][8];
                    OxO[old][x] = " ";
                }
            }
            System.out.println("\n\n\n\n\n\n\n");

        }

        System.out.println(OxO[0][0]+OxO[0][1]+OxO[0][2]+OxO[0][3]+OxO[0][4]+OxO[0][5]+OxO[0][6]+OxO[0][7]);
        System.out.println(OxO[1][0]+OxO[1][1]+OxO[1][2]+OxO[1][3]+OxO[1][4]+OxO[1][5]+OxO[1][6]+OxO[1][7]);
        System.out.println(OxO[2][0]+OxO[2][1]+OxO[2][2]+OxO[2][3]+OxO[2][4]+OxO[2][5]+OxO[2][6]+OxO[2][7]);
        System.out.println(OxO[3][0]+OxO[3][1]+OxO[3][2]+OxO[3][3]+OxO[3][4]+OxO[3][5]+OxO[3][6]+OxO[3][7]);
        System.out.println(OxO[4][0]+OxO[4][1]+OxO[4][2]+OxO[4][3]+OxO[4][4]+OxO[4][5]+OxO[4][6]+OxO[4][7]);
        System.out.println(OxO[5][0]+OxO[5][1]+OxO[5][2]+OxO[5][3]+OxO[5][4]+OxO[5][5]+OxO[5][6]+OxO[5][7]);
        System.out.println(OxO[6][0]+OxO[6][1]+OxO[6][2]+OxO[6][3]+OxO[6][4]+OxO[6][5]+OxO[6][6]+OxO[6][7]);
        System.out.println(OxO[7][0]+OxO[7][1]+OxO[7][2]+OxO[7][3]+OxO[7][4]+OxO[7][5]+OxO[7][6]+OxO[7][7]);
        System.out.println("\nYou have done it!");

    }

}

优化后的代码

import java.util.Scanner;

public class Game {
    // 定义常量替代魔法值,提升可读性
    private static final char WALL = '@';
    private static final char PLAYER = 'P';
    private static final char OBSTACLE = 'O';
    private static final char GOAL = 'X';
    private static final char EMPTY = ' ';

    public static void main(String[] args) {
        // 简化棋盘定义,移除多余空元素
        char[][] board = {
                {WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL},
                {WALL, PLAYER, OBSTACLE, EMPTY, EMPTY, EMPTY, EMPTY, WALL},
                {WALL, EMPTY, EMPTY, EMPTY, OBSTACLE, OBSTACLE, EMPTY, WALL},
                {WALL, OBSTACLE, EMPTY, OBSTACLE, OBSTACLE, EMPTY, EMPTY, WALL},
                {WALL, EMPTY, EMPTY, OBSTACLE, GOAL, EMPTY, EMPTY, WALL},
                {WALL, EMPTY, OBSTACLE, OBSTACLE, OBSTACLE, OBSTACLE, EMPTY, WALL},
                {WALL, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, WALL},
                {WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL}
        };

        int playerX = 1;
        int playerY = 1;
        Scanner scanner = new Scanner(System.in);

        System.out.println("输入 'w','a','s','d' 进行移动,你是'" + PLAYER + "',目标是到达'" + GOAL + "'");

        // 修正判断逻辑,用char直接比较更高效准确
        while (board[4][4] != PLAYER) {
            printBoard(board);
            String movement = scanner.nextLine().trim().toLowerCase();

            // 统一处理方向偏移,减少重复代码
            int dx = 0;
            int dy = 0;
            switch (movement) {
                case "a": dx = -1; break;
                case "d": dx = 1; break;
                case "w": dy = -1; break;
                case "s": dy = 1; break;
                default:
                    System.out.println("无效输入,请输入w/a/s/d");
                    continue;
            }

            // 计算新位置并判断是否可移动
            int newX = playerX + dx;
            int newY = playerY + dy;
            char targetCell = board[newY][newX];

            if (targetCell != WALL && targetCell != OBSTACLE) {
                // 更新玩家位置
                board[playerY][playerX] = EMPTY;
                board[newY][newX] = PLAYER;
                playerX = newX;
                playerY = newY;
            }

            System.out.println("\n\n\n\n\n\n\n");
        }

        printBoard(board);
        System.out.println("\n你成功了!");
        scanner.close();
    }

    // 提取打印逻辑为独立方法,消除重复代码
    private static void printBoard(char[][] board) {
        for (char[] row : board) {
            StringBuilder rowStr = new StringBuilder();
            for (char cell : row) {
                rowStr.append(cell);
            }
            System.out.println(rowStr);
        }
    }
}

主要优化点

  • 消除重复代码:将重复的棋盘打印逻辑提取为printBoard方法,后续修改只需调整一处,避免复制粘贴的冗余
  • 统一移动逻辑:用switch-case处理方向输入,通过dx/dy(坐标偏移量)统一计算新位置,替代重复的if-else分支
  • 使用常量替代魔法值:定义WALL、PLAYER等常量,让代码语义更清晰,修改元素符号时无需逐个查找替换
  • 修复字符串比较错误:原代码用!=比较字符串(Java中==/!=比较的是对象引用),优化后改用char直接比较,更高效且逻辑准确
  • 优化资源创建:Scanner仅初始化一次并在程序结束时关闭,避免每次循环创建新对象浪费资源
  • 简化棋盘结构:移除原数组中多余的空元素,让棋盘定义更简洁直观
  • 增加输入校验:处理无效输入,提示用户正确操作,提升程序健壮性

给编程新手的建议

  • 遵循DRY原则:遇到重复代码第一时间考虑提取成方法或循环,这是减少代码臃肿最直接的手段
  • 字符串比较用equals:Java中字符串是对象,==/!=比较的是内存地址,equals才是比较内容,避免逻辑错误
  • 多用常量:把固定不变的值(如游戏元素符号、配置参数)定义成常量,代码更易读、易维护
  • 模块化拆分功能:把不同职责的逻辑拆分成独立方法,比如打印、移动、校验等,让主逻辑更简洁清晰
  • 分步调试:遇到问题时,打印关键变量(如玩家坐标、目标位置),逐步排查错误
  • 利用IDE工具:用IntelliJ IDEA的自动格式化(Ctrl+Alt+L)、代码提示功能,保持代码格式规范
  • 写注释:对关键逻辑、常量添加注释,方便自己后续理解,也便于他人阅读

内容的提问来源于stack exchange,提问作者yes boi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:02:32