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
相关产品推荐
相关产品推荐

