劊子手遊戲

LLXL發表於2018-06-02

https://vjudge.net/problem/UVA-489

題目大意:計算機給一個單詞你猜,每次可以猜一個字母,如果單詞裡有那個字母,那這個單詞裡的所有字母都會顯示出來,如果沒有這個字母就說明猜錯了,錯誤次數只有7次,你的任務是編寫一個“裁判”程式,出入單詞和玩家的猜測,判斷玩家贏了(You win.),還是輸了(You lose.),還是放棄(You chickened out.)


思路:理解題意後發現這道題並不難,演算法設計也不復雜,只需要簡單的遞迴,題目說已經猜過的字母再猜一次也算錯,為了避免增加多一個字元陣列來標示字母時候已經被猜過,可以直接採用將已經猜過的字元改成空格;

樣例輸入:
1
cheese
chese
2
cheese
abcdefg
3
cheese
abcdefgij
-1
樣例輸出:
Round 1
You win.
Round 2
You chickened out.
Round 3

You lose.

程式碼:

#include<iostream>
#include<string.h>
using namespace std;
#define MAXN 100
char s1[MAXN], s2[MAXN];//s1計算機給的單詞,s2玩家猜的單詞
int lefts, chance;//剩下的字母個數和允許錯誤次數
int win, lose;//win=1贏,lose=1輸
void guess(char ch)
{
	int bad = 1;
	for (int i = 0; i<strlen(s1); i++)
	{
		if (ch == s1[i])
		{
			lefts--;
			s1[i] = ' ';//把已經猜過的字母給成空格;
			bad = 0;
		}
	}
	if (bad) chance--;//如果沒有猜對
	if (!chance) lose = 1;//錯誤次數用完
	if (!lefts)   win = 1;//猜出了計算機給單詞
	return;
}
int main()
{
	int n;
	while (cin >> n&&n != -1)
	{
		cin >> s1;
		cin >> s2;
		cout << "Round" << ' ' << n << endl;
		win = lose = 0;
		lefts = strlen(s1);//字串長度
		chance = 7;
		for (int i = 0; i<strlen(s2); i++)
		{
			guess(s2[i]);//每猜一個字母都進行判斷
			if (win || lose)
				break;

		}
		if (win) cout << "You win." << endl;
		else if (lose)   cout << "You lose." << endl;
		else
			cout << "You chickened out." << endl;
	}
	return 0;
}


相關文章