Th4 192020
 

Bài viết tiếp theo sẽ là vài ví dụ khi bạn sử dụng điều khiển luồng trong chương trình.
Một chương trình ngắn: Guess the Number
Các ví dụ mà tôi đã chỉ ra cho bạn cho đến nay rất hữu ích cho việc giới thiệu các khái niệm cơ bản, nhưng bây giờ hãy để cho tôi thấy mọi thứ bạn đã học được kết hợp với nhau như thế nào trong một chương trình hoàn chỉnh hơn. Trong phần này, tôi sẽ cho bạn thấy một trò chơi đơn giản, trò chơi đoán số. Khi bạn chạy chương trình này, đầu ra sẽ trông giống như thế này:

I am thinking of a number between 1 and 20.
Take a guess.
10
Your guess is too low.
Take a guess.
15
Your guess is too low.
Take a guess.
17
Your guess is too high.
Take a guess.
16
Good job! You guessed my number in 4 guesses!

Nhập source code phía dưới và lưu dưới tên guessTheNumber.py.

# This is a guess the number game.
import random
secretNumber = random.randint(1, 20)
print('I am thinking of a number between 1 and 20.')
# Ask the player to guess 6 times.
for guessesTaken in range(1, 7):
	print('Take a guess.')
	guess = int(input())
	if guess < secretNumber:
		print('Your guess is too low.')
	elif guess > secretNumber:
		print('Your guess is too high.')
	else:
		break # This condition is the correct guess!
if guess == secretNumber:
	print('Good job! You guessed my number in ' + str(guessesTaken) + 'guesses!')
else:
    print('Nope. The number I was thinking of was ' + str(secretNumber))

Cách chương trình thực hiện bạn sẽ thấy như đoạn trên, bây giờ chúng ta sẽ phân tích những đoạn nhỏ trong chương trình này.

# This is a guess the number game.
import random
secretNumber = random.randint(1, 20)

Đầu tiên, một nhận xét ở đầu mã giải thích chương trình là làm gì. Sau đó, chương trình nhập mô-đun random để có thể sử dụng hàm random.randint() để tạo số cho người dùng đoán.
Giá trị trả về, một số nguyên ngẫu nhiên trong khoảng từ 1 đến 20, được lưu trữ trong biến SecretNumber.

print('I am thinking of a number between 1 and 20.')
# Ask the player to guess 6 times.
for guessesTaken in range(1, 7):
	print('Take a guess.')
	guess = int(input())

Chương trình nói với người chơi rằng nó đã đưa ra một con số bí mật và sẽ cho người chơi sáu cơ hội để đoán nó. Mã cho phép người chơi nhập dự đoán và kiểm tra dự đoán đó là trong một vòng lặp for sẽ lặp lại nhiều nhất sáu lần. Điều đầu tiên xảy ra trong vòng lặp là người chơi gõ vào một phỏng đoán. Vì input () trả về một chuỗi, giá trị trả về của nó được truyền thẳng vào int (), giúp dịch chuỗi thành giá trị số nguyên. Điều này được lưu trữ trong một biến có tên là guess.

if guess < secretNumber:
	print('Your guess is too low.')
elif guess > secretNumber:
	print('Your guess is too high.')

Một vài dòng mã kiểm tra để xem liệu đoán có nhỏ hơn hoặc lớn hơn số bí mật hay không. Trong cả hai trường hợp, một gợi ý được in ra màn hình.

else:
	break # This condition is the correct guess!

Nếu số đoán không cao hơn hoặc thấp hơn số bí mật, thì nó phải bằng số bí mật, trong trường hợp này, bạn muốn thực thi chương trình thoát ra khỏi vòng lặp for.

if guess == secretNumber:
	print('Good job! You guessed my number in ' + str(guessesTaken) + 'guesses!')
else:
    print('Nope. The number I was thinking of was ' + str(secretNumber))

Sau vòng lặp for, câu lệnh if … other kiểm tra xem người chơi đã đoán đúng số chưa và sau đó in một thông báo phù hợp lên màn hình. Trong cả hai trường hợp, chương trình sẽ hiển thị một biến chứa giá trị nguyên (guessesTaken và secretNumber). Vì nó phải nối các giá trị số nguyên này thành các chuỗi, nên nó chuyển các biến này cho hàm str (), trả về dạng giá trị chuỗi của các số nguyên này. Bây giờ các chuỗi này có thể được nối với các toán tử + trước khi cuối cùng được chuyển đến lệnh gọi hàm print ().
Một chương trình ngắn: Kéo, búa, giấy.
Cho phép sử dụng các khái niệm lập trình mà chúng tôi đã học được từ trước đến nay để tạo ra một trò chơi đơn giản kéo búa giấy. Đầu ra sẽ như thế này:

ROCK, PAPER, SCISSORS
0 Wins, 0 Losses, 0 Ties
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
p
PAPER versus...
PAPER
It is a tie!
0 Wins, 1 Losses, 1 Ties
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
s
SCISSORS versus...
PAPER
You win!
1 Wins, 1 Losses, 1 Ties
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
q

Nhập đoạn code phía dưới và lưu dưới tên rpsGame.py

import random, sys
print('ROCK, PAPER, SCISSORS')
# These variables keep track of the number of wins, losses, and ties.
wins = 0
losses = 0
ties = 0
while True: # The main game loop.
	print('%s Wins, %s Losses, %s Ties' % (wins, losses, ties))
	while True: # The player input loop.
		print('Enter your move: (r)ock (p)aper (s)cissors or (q)uit')
		playerMove = input()
		if playerMove == 'q':
			sys.exit() # Quit the program.
		if playerMove == 'r' or playerMove == 'p' or playerMove == 's':
			break # Break out of the player input loop.
		print('Type one of r, p, s, or q.')
	# Display what the player chose:
	if playerMove == 'r':
		print('ROCK versus...')
	elif playerMove == 'p':
		print('PAPER versus...')
	elif playerMove == 's':
		print('SCISSORS versus...')
	# Display what the computer chose:
	randomNumber = random.randint(1, 3)
	if randomNumber == 1:
		computerMove = 'r'
		print('ROCK')
	elif randomNumber == 2:
		computerMove = 'p'
		print('PAPER')
	elif randomNumber == 3:
		computerMove = 's'
		print('SCISSORS')
	# Display and record the win/loss/tie:
	if playerMove == computerMove:
		print('It is a tie!')
		ties = ties + 1
	elif playerMove == 'r' and computerMove == 's':
		print('You win!')
		wins = wins + 1
	elif playerMove == 'p' and computerMove == 'r':
		print('You win!')
		wins = wins + 1
	elif playerMove == 's' and computerMove == 'p':
		print('You win!')
		wins = wins + 1
	elif playerMove == 'r' and computerMove == 'p':
		print('You lose!')
		losses = losses + 1
	elif playerMove == 'p' and computerMove == 's':
		print('You lose!')
		losses = losses + 1
	elif playerMove == 's' and computerMove == 'r':
		print('You lose!')
		losses = losses + 1

Bây giờ chúng ta sẽ bóc tách từng đoạn code nhỏ để hiểu rõ hơn.

import random, sys
print('ROCK, PAPER, SCISSORS')
# These variables keep track of the number of wins, losses, and ties.
wins = 0
losses = 0
ties = 0

Đầu tiên, chúng ta nhập mô-đun random và sys để chương trình của chúng ta có thể gọi các hàm random.randint() và sys.exit(). Chúng tôi cũng thiết lập ba biến để theo dõi xem có bao nhiêu chiến thắng, thua và hòa mà người chơi đã có.

while True: # The main game loop.
	print('%s Wins, %s Losses, %s Ties' % (wins, losses, ties))
	while True: # The player input loop.
		print('Enter your move: (r)ock (p)aper (s)cissors or (q)uit')
		playerMove = input()
		if playerMove == 'q':
			sys.exit() # Quit the program.
		if playerMove == 'r' or playerMove == 'p' or playerMove == 's':
			break # Break out of the player input loop.
		print('Type one of r, p, s, or q.')

Chương trình này sử dụng một vòng lặp while bên trong một vòng lặp while khác. Vòng lặp đầu tiên là vòng lặp trò chơi chính, và một trò chơi duy nhất là kéo, búa, giấy là người chơi trên mỗi lần lặp qua vòng lặp này. Vòng lặp thứ hai yêu cầu đầu vào từ người chơi và tiếp tục lặp cho đến khi người chơi đã nhập r, p, s hoặc q cho di chuyển của họ. Các r, p và s tương ứng với búa, giấy và kéo, trong khi q có nghĩa là người chơi có ý định bỏ. Trong trường hợp đó, sys.exit() được gọi và chương trình thoát. Nếu người chơi đã nhập r, p hoặc s, việc thực thi sẽ thoát ra khỏi vòng lặp. Mặt khác, chương trình nhắc nhở người chơi nhập r, p, s hoặc q và quay lại điểm bắt đầu của vòng lặp.

# Display what the player chose:
	if playerMove == 'r':
		print('ROCK versus...')
	elif playerMove == 'p':
		print('PAPER versus...')
	elif playerMove == 's':
		print('SCISSORS versus...')

Người chơi lựa chọn và hiển thị trên màn hình

# Display what the computer chose:
	randomNumber = random.randint(1, 3)
	if randomNumber == 1:
		computerMove = 'r'
		print('ROCK')
	elif randomNumber == 2:
		computerMove = 'p'
		print('PAPER')
	elif randomNumber == 3:
		computerMove = 's'
		print('SCISSORS')

Tiếp theo, di chuyển trên máy tính được chọn ngẫu nhiên. Vì random.randint () chỉ có thể trả về một số ngẫu nhiên, giá trị số nguyên 1, 2 hoặc 3 mà nó trả về được lưu trữ trong một biến có tên randomNumber. Chương trình lưu trữ một chuỗi ‘r’, ‘p’ hoặc ‘s’ trong computerMove dựa trên số nguyên trong randomNumber, cũng như hiển thị di chuyển máy tính.

# Display and record the win/loss/tie:
	if playerMove == computerMove:
		print('It is a tie!')
		ties = ties + 1
	elif playerMove == 'r' and computerMove == 's':
		print('You win!')
		wins = wins + 1
	elif playerMove == 'p' and computerMove == 'r':
		print('You win!')
		wins = wins + 1
	elif playerMove == 's' and computerMove == 'p':
		print('You win!')
		wins = wins + 1
	elif playerMove == 'r' and computerMove == 'p':
		print('You lose!')
		losses = losses + 1
	elif playerMove == 'p' and computerMove == 's':
		print('You lose!')
		losses = losses + 1
	elif playerMove == 's' and computerMove == 'r':
		print('You lose!')
		losses = losses + 1

Cuối cùng, chương trình so sánh các chuỗi trong playerMove và computerMove và hiển thị kết quả trên màn hình. Nó cũng làm tăng các chiến thắng, thua lỗ hoặc các biến quan hệ một cách thích hợp. Khi việc thực thi kết thúc, nó sẽ quay trở lại điểm bắt đầu của vòng lặp chương trình chính để bắt đầu một trò chơi khác.
Tổng kết
Bằng cách sử dụng các biểu thức đánh giá thành True hoặc False (còn gọi là điều kiện), bạn có thể viết các chương trình đưa ra quyết định về việc thực thi mã nào và mã nào cần bỏ qua. Bạn cũng có thể thực thi mã nhiều lần trong một vòng lặp trong khi một điều kiện nhất định ước tính là True. Các câu lệnh break and continue rất hữu ích nếu bạn cần thoát khỏi một vòng lặp hoặc nhảy trở lại vòng lặp khởi động.
Những tuyên bố kiểm soát luồng này sẽ cho phép bạn viết các chương trình thông minh hơn. Bạn cũng có thể sử dụng một loại điều khiển luồng khác bằng cách viết các hàm của riêng bạn, đó là chủ đề của chương tiếp theo.
Bài tập thực hành

  1. Hai dạng dữ liệu của Boolean là gì? Bạn viết chúng như thế nào?
  2. Ba toán tử của Boolean?
  3. Viết bảng sự thật của 3 toán tử Boolean.
  4. Những biểu thức sau thực hiện sẽ cho ra kết quả như thế nào
(5 > 4) and (3 == 5)
not (5 > 4)
(5 > 4) or (3 == 5)
not ((5 > 4) or (3 == 5))
(True and True) and (True == False)
(not False) or (not True)
  1. Sáu toán tử so sánh là như thế nào?
  2. Sự khác nhau giữa toán tử == và toán tử =
  3. Giải thích ý nghĩa của toán tử and khi bạn sử dụng nó
  4. Phân biệt 3 khối lệnh trong đoạn mã dưới đây
spam = 0
if spam == 10:
    print('eggs')
    if spam > 5:
        print('bacon')
    else:
        print('ham')
    print('spam')
print('spam')
  1. Viết mã in Hello nếu 1 được lưu trong spam, in Howdy nếu 2 là được lưu trữ trong spam và in Greetings! nếu bất cứ điều gì khác được lưu trữ trong spam.
  2. Bạn cần nhấn những phím nào để kết thúc vòng lặp vô tận.
  3. Sự khác nhau giữa break và continue là như thế nào?
  4. Sự khác nhau giữa range(10)range(0, 10) và range(0, 10, 1) trong vòng lặp for là như thế nào?
  5. Viết một chương trình in các số từ 1 đến 10 bằng vòng lặp for, và một chương trình như vậy bằng vòng lặp while.
  6. Nếu bạn có một hàm bacon() trong một module tên là spam. Có cách nào để bạn sử dụng hàm bacon() bằng cách import spam.
    Phần thêm: Tìm hiểu hàm round() và abs() trên internet. Và các ứng dụng của chúng, sau đấy thử sử dụng chúng trong command line