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

Jack语言Expected系列编译错误调试及Hangman游戏代码问题排查

Jack语言Hangman游戏编译错误修复方案

错误原因分析

  • do-while语法误用:Jack的do-while循环要求语句必须包裹在{}中,结构为do { ... } while(条件);。你错误地将独立的do Output.printString(displayWord);与后续while循环拼接,导致编译器无法识别合法语句结构,这是第三个错误的核心原因。实际需求是先执行一次打印再进入循环,因此应使用独立语句+普通while循环的组合,而非do-while。
  • 局部变量未初始化:变量i仅声明未赋值就进入循环,Jack不会为局部变量默认初始化,必须手动let i = 0;。
  • 字符串比较逻辑错误:Jack中!=比较的是字符串对象的引用而非内容,判断字符串不等需用!displayWord.equals(secretWord)。
  • 局部变量声明违规:循环内let char guess = ...属于重复声明类型,Jack要求局部变量必须在method开头用var声明,后续仅用let赋值。

修正后的完整代码

class HangmanGame {
  field String secretWord;
  field String guessedLetters;
  field int maxAttempts;
  field int attempts;

  constructor HangmanGame new(String word) {
    let secretWord = word;
    let guessedLetters = "";
    let maxAttempts = 6;
    let attempts = 0;
    return this;
  }

  method void play() {
    var String displayWord;
    var char letter;
    var int i;
    var char guess;
    var boolean found;
    var int j;

    let displayWord = "";
    let i = 0;
    while (i < secretWord.length()) 
    {
      let letter = secretWord.charAt(i);
      if (guessedLetters.contains(String.valueOf(letter))) 
      {
        let displayWord = displayWord + String.valueOf(letter);
      } 
      else 
      {
        let displayWord = displayWord + "_";
      }
      let i = i + 1;
    }

    // 先执行一次打印,再进入循环
    do Output.printString(displayWord);

    while (!displayWord.equals(secretWord) && attempts < maxAttempts) {
      do Output.printString("\nEnter a letter: ");
      let guess = Keyboard.readChar();
      let guessedLetters = guessedLetters + String.valueOf(guess);
      let found = false;
      let j = 0;

      while (j < secretWord.length()) {
        if (secretWord.charAt(j) == guess) {
          let found = true;
          let displayWord = displayWord.substring(0, j) + String.valueOf(guess) + displayWord.substring(j + 1);
        }
        let j = j + 1;
      }

      if (!found) {
        let attempts = attempts + 1;
        do Output.printString("Incorrect guess. Attempts remaining: " + String.valueOf(maxAttempts - attempts));
      }

      do Output.printString(displayWord);
    }

    do Output.printString("\nCongratulations! You guessed the word.");
  }
}

额外说明

  • maxAttempts - attempts的结果是int类型,需要用String.valueOf()转换后才能和字符串拼接,否则会引发类型错误。
  • 所有局部变量都已移至method开头统一声明,符合Jack语言的语法规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:45:06