0

因此,对于一个班级,我们必须制作一个刽子手游戏,它可以接受用户输入的单词,然后让另一个人来解决它。它必须能够识别单词中的多个重复字母,否则我就完蛋了。下面是我的代码,它工作得很好,直到我删除了我的 checkformatch 方法中的 break 语句,以便它超越了最初发现的字母。有了中断,它永远不会找到第二个第三个等重复的字母,没有它,它会返回每个不是搜索到的字母的字母都是未命中的,并减少了我的生命计数。我需要的是一些关于如何在我的数组中搜索作为猜测输入的字母并返回它们在数组中的索引位置的提示,而不是认为数组中不是猜测的每个字符都是错误的输入。先感谢您。

package hangman;

import java.util.Scanner;

class Game {
int livesRemaining;
String letterGuessed;
String wordInput;
  char[] hiddenWord;
  char[] aOfWord ;

Scanner input = new Scanner(System.in);
boolean isFound;
int a;


public Game()
{
    this.setLives(8);
    //this.output();

    System.out.println("Player 1 please enter the word to be searched: ");
    wordInput = input.nextLine();

    aOfWord = wordInput.toCharArray();

    hiddenWord = new char[aOfWord.length];

    for(int j = 0; j < hiddenWord.length; j++)
        hiddenWord[j] = '*';

    this.output();

    while(livesRemaining > 0)
    {
        System.out.println("Please choose a letter: ");
        letterGuessed = input.nextLine();

        this.checkForMatch(letterGuessed);
        if(isFound == true)
    {
        hiddenWord[a] = letterGuessed.charAt(0);
    }
    else
    {
        System.out.println("Is not found!");
        this.reduceLives();
    }
    this.output();


  }

}

public void setLives(int a)
{
    this.livesRemaining = a;
}

public void reduceLives()
{
    livesRemaining = livesRemaining -1;
    System.out.println("Lives remaining: " + this.getLives());

}

public int getLives()
{
    return livesRemaining;
}

public void output()
{
    System.out.println("Lives remaining: " + this.getLives());
    System.out.println("Word found so far ");

    for(int i = 0; i < hiddenWord.length; i++)
    {
        System.out.print(hiddenWord[i] + "\n");
    }

}

public void checkForMatch(String l)
{

    for(int i = 0; i < aOfWord.length; i++)
        {
            //System.out.println("Comparing " + l.charAt(0) + " To " + aOfWord[i]);
            if(l.charAt(0) == aOfWord[i])   
            { 
               isFound = true;
               a = i;
               break;
            }
            else
            {
                isFound = false;  
            } 
        }

}

}
4

2 回答 2

3

首先,如果要返回字符的索引,则需要将它们添加到某处,我建议返回一个包含所有值的 ArrayList。这是因为如果 ArrayList 太小,它的大小可能会增长,而您真的不需要担心越界问题。

您当前的checkForMatch工作形式可以满足您的需求,但请考虑返回 aboolean而不是将您的 isFound 字段设置为 true/false。还有一个包含 String 类的方法,您可以调用它,因此您的 checkForMatch 的替代方法可能有点像

String yourString = "Hello";
String yourChar = "e";
System.out.println(yourString.contains(yourChar));

这当然会打印出来!

现在,要获取索引,您已经遍历数组并比较方法中的字符checkForMatch(),为什么不简单地ArrayList<Integer> matchedIndices = new ArrayList<Integer>();在方法顶部创建一个,而不是将 isFound 设置为 true,matchedIndices.add(i);如果字符匹配则调用,然后在最后返回数组列表?

您当然必须将返回类型从 void 交换为 ArrayList,但是有很多方法可以解决这个问题,这只是我想到的第一个!

于 2012-09-06T19:44:24.007 回答
1

你的算法看起来不错。但是,它只会为您提供最后一个匹配的字符,因为a只要他找到匹配的字符就会被重写。我认为一个非常简单的解决方案是在您的checkForMatch方法中执行此操作:

if(l.charAt(0) == aOfWord[i])   
{ 
    isFound = true;
    hiddenWord[i] = l.charAt(0);
}

还有这个在你的game方法中......

if(!isFound)
{
    System.out.println("Is not found!");
    this.reduceLives();
}

顺便说一句,您不必使用this.。这仅在某些情况下是必要的。看看这个

于 2012-09-06T19:40:23.930 回答