如何修复 Connect 4 游戏中水平连子计数失效的问题?

大婷大大_4788

大婷大大_4788

2026-07-18

325人浏览

原创

如何修复 Connect 4 游戏中水平连子计数失效的问题?

你的 Connect 4 实现中 checkWin 方法因行列索引传参顺序错误,导致水平方向(左/右)连子数量始终为 0,无法正确检测四连胜。核心问题是将「列索引」误作「行索引」传入,致使数组访问越界或读取错误位置。

你的 connect 4 实现中 `checkwin` 方法因行列索引传参顺序错误,导致水平方向(左/右)连子数量始终为 0,无法正确检测四连胜。核心问题是将「列索引」误作「行索引」传入,致使数组访问越界或读取错误位置。

在你当前的代码中,play() 方法在落子后调用 checkWin(gb, "1", p1choice, yIndex) —— 这里 p1choice 是玩家输入的列号(widthIndex),而 yIndex 是该列中实际落子的行号(heightIndex)。但 checkWin 方法签名却定义为:

public static void checkWin(String[][] gb, String p, int heightIndex, int widthIndex)

⚠️ 这导致参数被颠倒使用:方法内部将 heightIndex 当作列、widthIndex 当作行来访问二维数组 gb[heightIndex][widthIndex],而 Java 中二维数组约定是 gb[row][col](即 gb[i][j] 中 i 为行、j 为列)。因此,gb[heightIndex][widthIndex] 实际访问的是 gb[列][行],严重违背内存布局,造成:

  • 水平检查(左右遍历)始终在错误的“行”上操作(实为列),结果恒为 _ 或越界;
  • horizontalLeft 和 horizontalRight 始终为 0,无法累加;
  • 即使视觉上出现横连四子,逻辑也完全无法识别。

✅ 正确做法是统一索引语义并修正参数顺序:

  1. 修改 checkWin 方法签名,明确参数含义:

    public static void checkWin(String[][] gb, String p, int colIndex, int rowIndex) {
        // colIndex: 落子列(0~6),rowIndex: 落子行(0~6)
    }
  2. 同步更新所有调用处(play 方法内):

    checkWin(gb, "1", p1choice, yIndex);   // ✅ now: (col, row)
    checkWin(gb, "2", p2choice, yIndexP2); // ✅ now: (col, row)
  3. 重写检查逻辑,确保边界安全(推荐优化版):

    public static void checkWin(String[][] gb, String p, int colIndex, int rowIndex) {
        // 水平方向:向左 + 向右
        int horizontal = 1; // 自身计1
        // 向左
        for (int c = colIndex - 1; c >= 0 && gb[rowIndex][c].equals(p); c--) {
            horizontal++;
        }
        // 向右
        for (int c = colIndex + 1; c = 4) {
            System.out.println("Game over. Player " + p + " wins!");
            System.exit(0); // 或设标志终止游戏循环
        }
    }

? 额外注意事项:

  • 你的棋盘是 String[7][7],但 Connect 4 标准为 6 行 × 7 列。当前 i=6 落子时会访问 gb[6][j]——这是第 7 行(索引从 0 开始),超出标准范围,易引发 ArrayIndexOutOfBoundsException。建议改为 String[6][7],并调整下落逻辑:初始 i = 5,循环条件 i >= 0。
  • play() 中 do-while(!cont) 的 cont 始终为 true,导致无限循环。应通过 checkWin 返回胜利状态或设置全局 gameOver 标志控制主循环。
  • 使用 equals() 替代 == 比较字符串内容(虽此处值为 "1"/"2" 字符串常量,但属良好实践)。

修复索引顺序后,水平连子检测将立即生效,游戏逻辑回归预期行为。这是初学者在二维数组坐标映射中最常见也最关键的陷阱之一——务必牢记:array[row][col] ≠ array[y][x] 在图形坐标系中需主动转换,而非默认等价。

在线游戏
在线游戏

海量精品小游戏合集,无需安装即点即玩,休闲益智、动作闯关应有尽有,秒开即玩,轻松解压,快乐停不下来

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

0

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

0

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

0

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

0

15

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

0

15

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

2026.10.22

20

12

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

2026.10.22

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习