Chủ Nhật, 19 tháng 8, 2012

Game đoán chữ Hangman bằng Python

Bạn lạc vào một xứ sở Thần Tiên xa xôi nơi mà văn minh hiện đại không biết tới. Ở đó luật pháp rất nghiêm, trong đó có luật là nếu ăn trộm thì sẽ bị treo cổ. Bạn lạc vào nơi không quen biết, và không có gì để ăn. Bạn lòng vòng 1 khu chợ và trong lúc cơ cực, bạn đành phải “nhón” 1 quả cam. Lính gác phát hiện ra bạn, trói bạn lại và mang ra chợ hành hình trước bàn dân thiên hạ. Nhưng vua của đất nước Thần Tiên đó lại rất coi trọng những người có chữ, và sẽ tha cho bọn nếu bạn đoán được đúng chữ ẩn số.
Trong game này, bạn sẽ học các khái niệm về:
  • Methods – Phương thức
  • The append() list method – Thêm thành phần của list (danh sách)
  • The lower() and upper() string methods – phương thức chữ thường và chữ hoa cho chuỗi
  • The reverse() list method – phương thức đảo danh sách
  • The split() string method – phương thức chia chuỗi
  • The range() function – hàm range()
  • The list() function – hàm list()
  • for loops – vòng lặp loop
  • elif statements – Kiểm tra điều kiện
  • The startswith() and endswith() string methods. – Phương thức startswith() và endswith()
  • The dictionary data type. – Kiểu dữ liệu tử điển
  • key-value pairs – Cặp khóa – giá trị
  • The keys() and values() dictionary methods – phương thức keys() và values()
  • Multiple variable assignment, such as a, b, c = [1, 2, 3] – Đa gán
Muốn lập trình được game này bạn phải sơ đồ hóa trước, như cái sơ đồ ở dưới:


Còn code của game thì đây:

import random
HANGMANPICS = ['''
 
  +---+
  |   |
      |
      |
      |
      |
=========''', '''
 
  +---+
  |   |
  O   |
      |
      |
      |
=========''', '''
 
  +---+
  |   |
  O   |
  |   |
      |
      |
=========''', '''
 
  +---+
  |   |
  O   |
 /|   |
      |
      |
=========''', '''
 
  +---+
  |   |
  O   |
 /|\  |
      |
      |
=========''', '''
 
  +---+
  |   |
  O   |
 /|\  |
 /    |
      |
=========''', '''
 
  +---+
  |   |
  O   |
 /|\  |
 / \  |
      |
=========''']
 
words = 'hocbaomat linux hacker backtrack python wordpress javascript'.split()
 
def getRandomWord(wordList):
    # This function returns a random string from the passes list of strings.
    wordIndex = random.randint(0, len(wordList)-1)
    return wordList[wordIndex]
 
def displayBoard(HANGMANPICS, missedLetters, correctLetters, secretWord):
    print(HANGMANPICS[len(missedLetters)])
    print()
 
    print('Nhung chu cai doan truot:', end=' ')
    for letter in missedLetters:
           print(letter, end=' ')
    print()
 
    blanks = '_' * len(secretWord)
 
    for i in range(len(secretWord)):
           if secretWord[i] in correctLetters:
               blanks = blanks[:i] + secretWord[i] + blanks[i+1:]
 
    for letter in blanks:
           print(letter, end=' ')
    print()
 
def getGuess(alreadyGuessed):
    # Returns the letter the player entered. This
    # function makes sure the player entered a single letter, and not
    # something else
 
    while True:
        print('Doan 1 chu cai')
        guess = input()
        guess = guess.lower()
        if len(guess) != 1:
           print('Chi dien vao 1 chu cai.')
        elif guess in alreadyGuessed:
           print('Chu cai do da doan roi. Doan lai.')
        elif guess not in 'abcdefghijklmnopqrstuvwxyz':
           print('Nhap 1 CHU CAI.')
        else:
           return guess
 
def playAgain():
    # This function returns True if the player wants to play again, otherwise
    # it returns False.
    print('Ban co muon choi lai khong? (yes or no)')
    return input().lower().startswith('y')
 
# main code
print('T R E O   C O')
missedLetters = ''
correctLetters = ''
secretWord = getRandomWord(words)
gameIsDone = False
 
 
while True:
    displayBoard(HANGMANPICS, missedLetters, correctLetters, secretWord)
 
    # Let the player type in a letter
 
    guess = getGuess(missedLetters + correctLetters)
 
    if guess in secretWord:
           correctLetters += guess
 
           #Check if the player has won
           foundAllLetters = True
           for i in range(len(secretWord)):
               if secretWord[i] not in correctLetters:
                   foundAllLetters = False
                   break
           if foundAllLetters:
               print('Xong! Tu bi mat do la "' + secretWord + '"! Ban da thang!')
               gameIsDone = True
 
    else:
           missedLetters = missedLetters + guess
 
           #Check if player has guesses too many times and lost
           if len(missedLetters) == len(HANGMANPICS) - 1:
               displayBoard(HANGMANPICS, missedLetters, correctLetters, secretWord)
               print('Da qua so lan doan!\nSau ' + str(len(missedLetters)) + ' lan doan truot va ' +
                     str(len(correctLetters)) + ' lan doan dung, tu can doan la "' + secretWord + '"')
               gameIsDone = True
 
    # Ask the player if they want to play again (but only if the game is done).
    if gameIsDone:
        if playAgain():
            missedLetters = ''
            correctLetters = ''
            gameIsDone = False
            secretWord = getRandomWord(words)
        else:
            break
 
Nhớ là các bạn hãy gõ code nhé, đừng copy & paste, gõ thì mới lên trình lập trình được. Để tiện hình dung, các bạn hãy save nội dung code vào 1 file rồi chạy thử xem game này chơi như thế nào.
Chúc các bạn vui!

3 nhận xét:

  1. File ".\DoanChu.py", line 71
    print('Nhung chu cai doan truot:', end=' ')
    ^
    SyntaxError: invalid syntax

    bị lỗi ạ :D

    Trả lờiXóa
  2. chay ma ban thay dau ' bang " xem thu co bi loi gi ko nhe print("Nhung chu cai doan truot:', end=' ")

    Trả lờiXóa