|
| 1 | +from plugin import plugin |
| 2 | +import requests |
| 3 | +import json |
| 4 | +import random |
| 5 | +import nltk |
| 6 | +from nltk.corpus import words |
| 7 | + |
| 8 | +nltk.download('words') |
| 9 | +english_words = set(words.words()) |
| 10 | + |
| 11 | +@plugin("word chain game") |
| 12 | +def word_chain_game(jarvis, s): |
| 13 | + if s: |
| 14 | + jarvis.say("This command does not take arguments. Just type 'word chain game' to start.") |
| 15 | + return |
| 16 | + |
| 17 | + def is_valid_word(word_to_check): |
| 18 | + api_url = f"https://api.dictionaryapi.dev/api/v2/entries/en/{word_to_check}" |
| 19 | + try: |
| 20 | + response = requests.get(api_url) |
| 21 | + return response.status_code == 200 |
| 22 | + except requests.exceptions.RequestException: |
| 23 | + return False |
| 24 | + |
| 25 | + def get_jarvis_word(starting_letter, used_words): |
| 26 | + possible_words = [word for word in english_words |
| 27 | + if word.startswith(starting_letter) and word.lower() not in used_words] |
| 28 | + if possible_words: |
| 29 | + return random.choice(possible_words).lower() |
| 30 | + return None |
| 31 | + |
| 32 | + def get_initial_word(): |
| 33 | + initial_words = [ |
| 34 | + "example", "banana", "grape", "orange", "kiwi", "apple", "lemon", "melon", "olive", "peach", |
| 35 | + "rhythm", "synergy", "wizard", "oxygen", "quartz", "sphinx", "voyage", "utopia", "yacht", "zebra", |
| 36 | + "azure", "bronze", "crimson", "daisy", "ebony", "frost", "golden", "hazel", "indigo", "jade", |
| 37 | + "amber", "beige", "coral", "denim", "ivory", "khaki", "lavender", "magenta", "ochre", "pearl", |
| 38 | + "apricot", "burgundy", "cyan", "fuchsia", "ginger", "lime", "maroon", "navy", "orchid", "plum" |
| 39 | + ] |
| 40 | + return random.choice(initial_words).lower() |
| 41 | + |
| 42 | + jarvis.say("\nLet's play Word Chain! No word repeats allowed in this game.") |
| 43 | + word_chain = [] |
| 44 | + score = 0 |
| 45 | + last_letter = None |
| 46 | + used_words = set() |
| 47 | + |
| 48 | + initial_word = get_initial_word() |
| 49 | + current_word = initial_word |
| 50 | + word_chain.append(current_word) |
| 51 | + used_words.add(current_word) |
| 52 | + score += 1 |
| 53 | + last_letter = current_word[-1].lower() |
| 54 | + jarvis.say(f"I'll start! My word is: {current_word}.") |
| 55 | + |
| 56 | + while True: |
| 57 | + prompt_letter = last_letter.upper() if last_letter else "?" |
| 58 | + user_word = jarvis.input(f"Your word starting with '{prompt_letter}'? (or 'stop') ").strip().lower() |
| 59 | + |
| 60 | + if user_word.lower() == 'stop': |
| 61 | + jarvis.say("Game stopped by player.") |
| 62 | + break |
| 63 | + |
| 64 | + if not user_word: |
| 65 | + jarvis.say("You didn't enter a word. Try again or type 'stop'.") |
| 66 | + continue |
| 67 | + |
| 68 | + if last_letter and user_word[0].lower() != last_letter: |
| 69 | + jarvis.say(f"Invalid! Word must start with '{prompt_letter}'. Game Over!") |
| 70 | + break |
| 71 | + |
| 72 | + if user_word in used_words: |
| 73 | + jarvis.say(f"Invalid! '{user_word}' used already. No repeats! Game Over!") |
| 74 | + break |
| 75 | + |
| 76 | + if not is_valid_word(user_word): |
| 77 | + jarvis.say(f"Invalid! '{user_word}' not recognized. Game Over!") |
| 78 | + break |
| 79 | + |
| 80 | + word_chain.append(user_word) |
| 81 | + used_words.add(user_word) |
| 82 | + score += 1 |
| 83 | + last_letter = user_word[-1].lower() |
| 84 | + jarvis.say(f"Valid word! '{user_word}'. My turn...") |
| 85 | + |
| 86 | + next_word = get_jarvis_word(last_letter, used_words) |
| 87 | + if next_word: |
| 88 | + current_word = next_word |
| 89 | + word_chain.append(current_word) |
| 90 | + used_words.add(current_word) |
| 91 | + score += 1 |
| 92 | + last_letter = current_word[-1].lower() |
| 93 | + jarvis.say(f"My word is: {current_word}. Your turn starting with '{last_letter.upper()}'?") |
| 94 | + else: |
| 95 | + jarvis.say(f"I'm stuck! You win this round!") |
| 96 | + break |
| 97 | + |
| 98 | + jarvis.say("\nGame Over!") |
| 99 | + jarvis.say(f"Word Chain: {', '.join(word_chain)}") |
| 100 | + jarvis.say(f"Your Score: {score}") |
0 commit comments