Cách tạo game Hangman bằng Python

Hangman là trò chơi đoán từ phổ biến và bạn có thể tự tạo trò chơi này dễ dàng. Dưới đây là hướng dẫn làm game Hangman bằng Python.

Tạo game Hangman bằng Python

Cách chơi game Hangman

Hangman được ứng dụng rất nhiều trong dạy học, giúp người chơi rèn luyện khả năng ghi nhớ. Người chủ trò sẽ đưa ra từ cần đoán với số lượng chữ cái cụ thể, còn người chơi có nhiệm vụ tìm ra nó bằng cách đưa ra lần lượt từng chữ cái mà họ cho rằng có trong đáp án.

Nếu đoán đúng chữ cái trong từ đáp án, Hangman sẽ điền nó vào dấu gạch ngang. Ngược lại, nếu đoán sai, người chơi sẽ mất cơ hội, Hangman sẽ vẽ một gạch tạo nên một phần của người que (đại diện cho số điểm). Người chơi có tất cả 7 lần đoán. Nếu đoán đúng, họ sẽ giành chiến thắng. Nếu sai, Hangman hoàn tất hình vẽ người que.

Cách xây dựng game Hangman

Nhập mô đun random và xác định một hàm, get_random_word_from_wordlist(), để chọn một từ ngẫu nhiên trong file. File text này có thể chứa các danh từ phổ biến hoặc tên địa điểm, loài vật, phim... mà bạn thích. Xây dựng một danh sách bằng dấu ngoặc vuông ([]).

Dùng lệnh with để mở file và chuyển chế độ sang ‘r’ là chỉ đọc. Nó tự động đóng file ở cuối của khối ngay cả trong trường hợp lỗi. Nếu xem file hangman_wordlist.txt, bạn sẽ thấy có một từ hiện trên mỗi dòng, vì thế, file này tách từng từ bằng một ký tự dòng mới.

Chuyển ký tự thoát cho dòng mới (\n) sang hàm split() để chứa từng từ trong danh sách bạn đã xác định ban đầu. Dùng random.choice() để trả về một từ ngẫu nhiên trong danh sách.

import random
 
def get_random_word_from_wordlist():
    wordlist = []
 
    with open("hangman_wordlist.txt", 'r') as file:
        wordlist = file.read().split("\n")
 
    word = random.choice(wordlist)
    return word

Tiếp theo, xác định một hàm, get_some_letters() lấy từ đã chọn ngẫu nhiên làm tham số. Hàm này sẽ hiện một chuỗi gạch trống (_) và một số chữ cái cho người dùng.

Xác định danh sách trống letters để chứa tất cả ký tự hiện trong từ đó. Dùng biến temp để lưu một chuỗi số của các gạch trống bằng độ dài của từ. Dùng list() để chuyển đổi chuỗi thành một danh sách ký tự và lặp nó. Dùng append() để thêm ký tự vào danh sách nếu chưa có.

Dùng random.choice() để chọn ký tự ngẫu nhiên mà bạn muốn hiện tới người dùng cùng các nét gạch trống. Lặp ký tự của từ bằng enumerate để theo dõi chỉ mục của từng ký tự.

Khi tìm thấy ký tự được chọn ngẫu nhiên, thay gạch trống bằng ký tự đó. Dùng join() để hợp nhất danh sách ký tự thành một chuỗi hoàn chỉnh và trả về nó.

def get_some_letters(word):
    letters = []
    temp = '_' * len(word)
 
    for char in list(word):
        if char not in letters:
            letters.append(char)
 
    character = random.choice(letters)
 
    for num, char in enumerate(list(word)):
        if char == character:
            templist = list(temp)
            templist[num] = char
            temp = ''.join(templist)
 
    return temp

Xác định một hàm draw_hangman() lấy số cơ hội làm tham số. Hàm này cung cấp một nhân vật người treo. Số cơ hội giảm tương ứng với số lượt chơi còn lại. Khi hết lượt chơi, nhân vật người que hoàn thành và game kết thúc.

def draw_hangman(chances):
    if chances == 6:
        print("________ ")
        print("| | ")
        print("| ")
        print("| ")
        print("| ")
        print("| ")
    elif chances == 5:
        print("________ ")
        print("| | ")
        print("| 0 ")
        print("| ")
        print("| ")
        print("| ")
    elif chances == 4:
        print("________ ")
        print("| | ")
        print("| 0 ")
        print("| / ")
        print("| ")
        print("| ")
    elif chances == 3:
        print("________ ")
        print("| | ")
        print("| 0 ")
        print("| /| ")
        print("| ")
        print("| ")
    elif chances == 2:
        print("________ ")
        print("| | ")
        print("| 0 ")
        print("| /|\ ")
        print("| ")
        print("| ")
    elif chances == 1:
        print("________ ")
        print("| | ")
        print("| 0 ")
        print("| /|\ ")
        print("| / ")
        print("| ")
    elif chances == 0:
        print("________ ")
        print("| | ")
        print("| 0 ")
        print("| /|\ ")
        print("| / \ ")
        print("| ")

Khai báo một hàm, start_hangman_game() xác định logic chính của chương trình. Lấy từ ngẫu nhiên bằng cách gọi hàm get_random_word_from_wordlist() và lấy chuỗi hiện cho người dùng bằng hàm get_some_letters.

Đặt số cơ hội sang 7 và khởi tạo một biến, found là sai. Bạn sẽ đặt nó sang true nếu chữ cái được đoán nằm trong từ.

def start_hangman_game():
    word = get_random_word_from_wordlist()
    temp = get_some_letters(word)
    chances = 7
    found = False

Khai báo một vòng lặp kết thúc khi người dùng đoán đúng từ hoặc hết cơ hội. Bắt đầu game bằng cách hiển thị trình tự, số ký tự trong từ và cơ hội còn lại. Yêu cầu người chơi đoán từ và nhận nó bằng hàm input(). Xác thực đầu vào người dùng bằng cách kiểm tra độ dài của ký tự và xem đó có phải bảng chữ cái hay không.

    while True:
        if chances == 0:
            print(f"Sorry! You Lost, the word was: {word}")
            print("Better luck next time")
            break
 
        print("=== Guess the word ===")
        print(temp, end='')
        print(f"\t(word has {len(word)} letters)")
        print(f"Chances left: {chances}")
        character = input("Enter the character you think the word may have: ")
 
        if len(character) > 1 or not character.isalpha():
            print("Please enter a single alphabet only")
            continue

Nếu đầu vào hợp lệ, kiểm tra xem ký tự có nằm trong từ và thay nó bằng quy trình đã thấy trước đó, rồi update giá trị được tìm thấy. Nếu ký tự không hiện, cơ hội bị giảm. Nếu ký tự hiện, chuyển giá trị được tìm thấy về giá trị ban đầu là sai.

Nếu không còn dấu gạch ngang trống, hiện thông báo người dùng giành chiến thắng cùng số lần đoán đã thực hiện. Nếu không, hiện ảnh hangman theo số cơ hội còn lại.

        else:
            for num, char in enumerate(list(word)):
                if char == character:
                    templist = list(temp)
                    templist[num] = char
                    temp = ''.join(templist)
                    found = True
 
        if found:
            found = False
        else:
            chances -= 1
 
        if '_' not in temp:
            print(f"\nYou Won! The word was: {word}")
            print(f"You got it in {7 - chances} guess")
            break
        else:
            draw_hangman(chances)
 
        print()

Xác định một hàm để chơi game Hangman. Nếu người dùng nhập yes, hãy gọi hàm start_hangman_game(), nếu không, thoát game bằng một thông báo phù hợp. Trong trường hợp đầu vào không hợp lệ, yêu cầu người dùng nhập lại thông tin lần nữa.

print("===== Welcome to the Hangman Game =====")
 
while True:
    choice = input("Do you wanna play hangman? (yes/no): ")
 
    if 'yes' in choice.lower():
        start_hangman_game()
    elif 'no' in choice.lower():
        print('Quitting the game...')
        break
    else:
        print("Please enter a valid choice.")
 
    print("\n")

Kết quả:

Kết quả khi người chơi giành chiến thắng:

Game Hangman

Kết quả khi người chơi thua cuộc:

Kết quả khi thua game Hangman

Trên đây là cách tạo game Hangman bằng Python. Hi vọng bài viết hữu ích với các bạn.

Thứ Tư, 02/08/2023 13:50
51 👨 293
0 Bình luận
Sắp xếp theo
    ❖ Python