【问题标题】:Creating hangman game without arrays [closed]创建没有数组的刽子手游戏[关闭]
【发布时间】:2013-08-01 15:21:39
【问题描述】:

这就是输出的样子。

我需要在原始字符串中找到猜测的索引。

如果这是真的,那么它应该用读入的字符替换索引处的问号 字符串猜测。

之后它应该从字符串“abcdefghijklmnopqrstuvwxyz”中取出那个字符

如果 originalString 不包含猜测,那么它应该只从字符串“abcdefghijklmnopqrstuvwxyz”中取出该字符

我在谷歌上查了这个问题,发现一堆代码,它们都在使用数组或者我在 es 课上没学过的东西。所以请不要使用数组。

我被 if else 语句卡住了。

    int count=1;
    while (count<=24){
        Scanner keyboard = new Scanner(System.in);

        int length;
        String originalString;
        String guess;
        String option= "abcdefghijklmnopqrstuvwxyz";
        String questionmarks;

        System.out.println("Please enter a string");
        originalString=keyboard.nextLine();

        length=originalString.length();

        questionmarks = originalString.replaceAll(".", "?");



        System.out.println("Original String: "+originalString);
        System.out.println("Guessed String: "+questionmarks);
        System.out.println("Characters to choose from: "+option);
        System.out.println("Please guess a character");
        guess=keyboard.nextLine();

        if (originalString.contains(guess)){
            count++;


        }


        else{
            option.replace(guess, "_");
            count++;
            System.out.println(option);

        }

【问题讨论】:

    标签: java string


    【解决方案1】:

    我粗略一瞥就注意到了一些事情:

    • .replace() 返回一个String,它不会修改option,除非你这样做:

      option = option.replace(guess, "_");

    • 另外,由于你不想使用数组,我强烈建议你使用StringBuilder

    编辑 1(基于来自重复线程的评论):
    您可以使用StringBuilder 来获得一个初始化为所有- 的字符串。然后当有人猜对一个字母时,你可以将-替换为guess

    StringBuilder sb_word = new StringBuilder(lengthOfOriginalString); 
    
    for (int i = 0; i < length; i++)
         sb_word.append('-'); //add hyphens to StringBuilder, StringBuffer would also work
    

    你真的应该使用类似的东西:

    final char blank = '-';
    

    然后,在某人发出guess 之后,如果您确定i 位置的字符应替换为guess,您可以这样做:

     sb_word.setCharAt(i, guess.charAt(0));
    

    编辑 2

    while (bodyparts > 0 && !win) //play game while you have bodyparts and haven't won
    {       
         System.out.printf("Word to guess: %s\nEnter a letter or word guess: " , sb_word);
         guess = keyboard.next();
    
         if (guess.length() == 1)
         {
             for (int i = 0; i < length; i++) //loop to see if guess is in originalString
                 if (Character.toLowerCase(word.charAt(i)) == 
                     Character.toLowerCase(guess.charAt(0)))
                 {  //it is, so set boolean contains to be true and replace blank with guess
                    sb_word.setCharAt(i, guess.charAt(0));
                    contains = true;
                 }
    
            if (!contains)
            {
                bodyparts--;
                System.out.printf("Incorrect, you have %d bodyparts left.\n", bodyparts);
            } 
            else if (sb_word.indexOf(String.valueOf(blank)) == -1)
            { //all the letters have been uncovered, you win
                win = true;
                System.out.println(word);
            }
            else
            {
               contains = false;
               System.out.println("Good guess.");
            }
        }
    
        else
        {
            if (guess.equals(word))
                win = true;
            else
           {
                bodyparts = 0;
                System.out.printf("Incorrect, you have %d bodyparts left.\n" , bodyparts);
           }
        }
    }
    

    【讨论】:

    • 如果你确定i位置的角色——我想这就是他要找的:-)
    • 哦,这很好,我忘记了StringBuilder,只是采用了“使用+=”方法重建临时字符串。我更喜欢这个,虽然听起来 OP 可能还达不到他班级的StringBuilder 部分。
    • 是的,也没有学习过 stringbuilder。
    • @Treasure 我很少这样做,但你似乎很迷茫。您必须采取主动并为自己学习。谁在乎你没学过StringBuilder,去学吧。谷歌,兄弟。不要指望有人只给你代码。并非所有内容都明确存在,即变量声明等。我会让你自己弄清楚,但逻辑是正确的。祝你好运。
    • @Treasure PS:如果您复制此代码并将其作为作业提交:(a)您的老师或助教或其他人很可能会知道这不是您的,(b)它只是剽窃和 (c) 不要费心做一些愚蠢的事情,比如简单地更改变量名,它并不像人们想象的那么聪明(过去 5 年一直是 TA,一直在抓人作弊)。祝你好运。
    【解决方案2】:

    EDIT2:删掉所有这些,但基本上,当你学习数组时,这会容易得多。

    编辑:与问题无关,但无论猜测是否成功,都不需要出现else 块中的条件吗?在这两种情况下,您都增加计数,并且您需要将猜测的字符排除在外,无论它是否存在,对吗?

    PSUEDOCODE 为里面的“成功猜测”:

    String temporaryGuess = "";
    for-loop for each character in originalString {
        if (character at current index = guess) 
            append guess to temporaryGuess;
        else
            append a ? to temporaryGuess;
    }
    set the previous guessed String to the temporaryGuess String
    

    【讨论】:

    • 不知道查找是什么,是的,我猜我们应该用数组来做。我们的教授教的不好。 :S
    • 不用担心,您可以使用广阔的互联网。通过“查找”,我的意思是您必须使用 String.contains(char) 方法,然后通过循环并调用 String.indexOf(char, lastIndex) 来查找每个索引,以便找到字符的每个实例。这有点干,但内容丰富:docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
    • 不确定您所说的 taht 方法是什么意思。我将如何找到字符串中猜测的那个字符的索引号?像这样的东西? originalString.indexOf(guess, lastIndex);
    • 好吧,我为你的实现写了一个快速而肮脏的副本,结果证明这是可能的,但不如使用数组那么有效。我不会给你确切的代码,但我会在我的原始答案中发布一些伪代码。
    • and contains 方法不接受字符,它只接受字符串还是我错了?
    【解决方案3】:

    这是我的看法,一个可玩的不带数组的刽子手游戏:

    import java.util.Scanner;
    
    public class Hangman {
        private static Scanner scanner = new Scanner(System.in);    
        private static String word;
        private static String availableChoices = "abcdefghijklmnopqrstuvwxyz";
        private static String hiddenWord;
        private static boolean winner = false;
    
        public static void main(String[] args) {
            System.out.print("Enter a word to guess: ");
    
            word = scanner.nextLine();
            hiddenWord = wordToQuestionMarks(word);
    
            System.out.println("Hangman Word Set: " + word + "\n\n");
    
            while (!winner) {
                guessLetter();
            }
    
            System.out.println("Congrats! You Win!");
        }
    
        private static String wordToQuestionMarks(String word) {
            return word.replaceAll(".", "?");
        }
    
        private static void guessLetter() {
            System.out.println("Hidden Word: " + hiddenWord);
            System.out.println("Characters to choose from: " + availableChoices);
            System.out.print("Guess a letter: ");
            String letterChoice = scanner.nextLine();
    
            int found = 0;
    
            if (hasLetter(letterChoice)) {
                found = updateGameState(letterChoice);
            }
    
            updateAvailableChoices(letterChoice);
    
            System.out.println("You found " + found + " " + letterChoice + "\n");
            gameOver();
        }
    
        private static int updateGameState(String letter) {
            int found = 0;
    
            for(int i=0; i< word.length(); i++) {
                if (word.charAt(i) == letter.charAt(0)) {
                    String prev = hiddenWord.substring(0,i).concat(letter);
                    hiddenWord = prev.concat(hiddenWord.substring(i+1));
                    found++;
                }
            }
    
            return found;
        }
    
        private static void updateAvailableChoices(String removeLetter) {
            availableChoices = availableChoices.replace(removeLetter, " ");
        }
    
        private static void gameOver() {
            if (!hiddenWord.contains("?")) {
                winner = true;
            }
        }
    
        private static boolean hasLetter(String letter) {
            if (word.contains(letter)) {
                return true;
            }
            else {
                return false;
            }
        }
    
    }
    

    示例输出

    Enter a word to guess: stack
    Hangman Word Set: stack
    
    
    Hidden Word: ?????
    Characters to choose from: abcdefghijklmnopqrstuvwxyz
    Guess a letter: a
    You found 1 a
    
    Hidden Word: ??a??
    Characters to choose from:  bcdefghijklmnopqrstuvwxyz
    Guess a letter: z
    You found 0 z
    
    Hidden Word: ??a??
    Characters to choose from:  bcdefghijklmnopqrstuvwxy 
    Guess a letter: s
    You found 1 s
    
    Hidden Word: s?a??
    Characters to choose from:  bcdefghijklmnopqr tuvwxy 
    Guess a letter: t
    You found 1 t
    
    Hidden Word: sta??
    Characters to choose from:  bcdefghijklmnopqr  uvwxy 
    Guess a letter: k
    You found 1 k
    
    Hidden Word: sta?k
    Characters to choose from:  bcdefghij lmnopqr  uvwxy 
    Guess a letter: c
    You found 1 c
    
    Congrats! You Win!
    

    就像其他人在这里所说的那样,这不是这样做的理想方式。数组会让这个更干净。

    【讨论】:

    • 如果他不知道怎么做这个作业,他几乎肯定不会使用/编写方法。
    • 有点想,但我这样做更多是为了我自己的无聊。
    • 很公平,我有时也会这样做。
    • PS:你不需要replaceAll(),你可以使用replace()replaceAll() 只有在处理正则表达式时才需要。
    • 是的,我不会做这个问题。等我下节课见到我的教授时,我会向他寻求帮助。感谢您的帮助。
    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多