489 - Hangman Judge

Hangman Judge

In “Hangman Judge,” you are to write a program that judges a series of Hangman games. For each game, the answer to the puzzle is given as well as the guesses. Rules are the same as the classic game of hangman, and are given as follows:

The contestant tries to solve to puzzle by guessing one letter at a time.
Every time a guess is correct, all the characters in the word that match the guess will 
be ``turned over.'' For example, if your guess is ``o'' 
and the word is ``book'', then both ``o''s in the solution will be counted as ``solved.''
Every time a wrong guess is made, a stroke will be added to the drawing of a hangman, which 
needs 7 strokes to complete. Each unique wrong guess only counts against the contestant once.

   ______   
   |  |     
   |  O     
   | /|\    
   |  |     
   | / \    
 __|_       
 |   |______
 |_________|

If the drawing of the hangman is completed before the contestant has 
successfully guessed all the characters of the word, the contestant loses.
If the contestant has guessed all the characters of the word before 
the drawing is complete, the contestant wins the game.
If the contestant does not guess enough letters to either win or lose, 
the contestant chickens out. 

Your task as the “Hangman Judge” is to determine, for each game, whether the contestant wins, loses, or fails to finish a game.

Input

Your program will be given a series of inputs regarding the status of a game. All input will be in lower case. The first line of each section will contain a number to indicate which round of the game is being played; the next line will be the solution to the puzzle; the last line is a sequence of the guesses made by the contestant. A round number of -1 would indicate the end of all games (and input).

Output

The output of your program is to indicate which round of the game the contestant is currently playing as well as the result of the game. There are three possible results:

You win.
You lose.
You chickened out.

Sample Input

1
cheese
chese
2
cheese
abcdefg
3
cheese
abcdefgij
-1

Sample Output

Round 1
You win.
Round 2
You chickened out.
Round 3
You lose.

刽子手游戏其实是一款猜单词游戏。游戏规则是这样的:计算机想一个单词让你猜,你每次可以猜一个字母。如果单词里有那个字母,所有该字母会显示出来;如果没有那个字母,则计算机会在一幅“刽子手”画上填一笔。这幅画一共需要7笔就能完成,因此你最多只能错6次。注意,猜一个已经猜过的字母也算错。

在本题中,你的任务是编写一个“裁判”程序,输入单词和玩家的猜测,判断玩家赢了(You win.)、输了(You lose.)还是放弃了(You chickened out.)。每组数据包含3行,第1行是游戏编号(-1为输入结束标记),第2行是计算机想的单词,第3行是玩家的猜测。后两行保证只含小写字母。

#include <stdio.h>
#include <string.h>
#define maxNum 105
// 系统字符串和猜测字符串
char c1[maxNum], c2[maxNum];
// 机会
int chance;
// 还有多少个字符没被猜到
int dist;
// 成功和失败状态
bool win, lose;

void guess(char ch) {
    bool noFind = true;
    for(int i = 0; i < strlen(c1); i++) {
        // 如果找到相同字母,未猜到字母减一
        // 并将系统字符串该字母置为空格
        if(ch == c1[i]) {
            dist--;
            c1[i] = ' ';
            noFind = false;
        }
    }
    // 未找到一个匹配字符,则机会减一
    if(noFind) {
        chance--;
    }
    // 机会为0,失败
    if(!chance) {
        lose = true;
    }
    // 未猜到字符位0,成功
    if(!dist) {
        win = true;
    }

}

int main() {
    int rnd;
    memset(c1, 0, sizeof(c1));
    memset(c2, 0, sizeof(c2));
    while(scanf("%d%s%s", &rnd, c1, c2) == 3 &&  rnd != -1) {
        printf("Round %d\n", rnd);
        dist = strlen(c1);
        int n = strlen(c2);
        // 一回合初始化一次状态
        win = false;
        lose = false;
        chance = 7;
        // 循环判定猜测字符串和系统字符串的匹配度
        for(int i = 0; i < n; i++) {
            guess(c2[i]);
            if(win || lose) {
                break;
            }
        }
        // 根据结果输出
        if(win) {
            printf("You win.\n");
        } else if (lose) {
            printf("You lose.\n");
        } else {
            printf("You chickened out.\n");
        }
    }

    return 0;
}

你可能感兴趣的:(ACM,uva,Uva489)