Random (ngẫu nhiên) có nghiã là mình không có cách gì đoán trước được kết quả việc, cái gì sẽ xảy ra. Trong Python có những hàm (functions) và những trò chơi (games) để bạn sử dụng Random. Sau đây là vài thí dụ.
1) Trò chơi Đoán mò (Guessing game)
#GuessingGame.py import random # phải “nhập khẩu” chương trình random trước the_number = random.randint(1, 10) guess = int(input("Guess a number between 1 and 10: ")) # bạn đoán mò 1 số từ 1 đến 10 while guess != the_number: # trong khi số bạn cho còn khác với số của máy cho thì cứ tiếp tục vòng lặp while if guess > the_number: print(guess, "was too high. Try again.") # không phải, số bạn cho lớn quá if guess < the_number: print(guess, "was too low. Try again.") # không phải, số bạn cho thấp quá guess = int(input("Guess again: ")) # Đóan lại đi ! print(guess, "was the number! You win!") # Đúng rồi bạn thắng
Chú thích: Hàm (function) random.randint(): sẽ cho ta 1 số nguyên (integer) một cách ngẫu nhiên từ 1 đến 10, là số mà bạn/trẻ phải đoán cho đúng. 2 arguments (đối số) là 1 và 10 trong () cách nhau 1 dấu phẩy có nghiã là từ 1 đến 10.
Bài tập: Sửa lại chương trình trên: thêm: nếu bạn đoán sai thì phải trả 2$ và tích lũy vào một biến có tên count. Nếu bạn đoán đúng bạn được 20$. Nhưng sau cùng coi bạn có lãnh được trọn 20$ không. Nếu count <20 thì chủ casino là computer sẽ trả sai biệt. Nhưng nếu count >20 thì bạn phải trả sai biệt giữa tổng số tiền đoán sai với 20$ khi bạn đoán trúng. Nếu bạn chưa làm được thì xem “bài giải” sau đây:
2) Vòng xoắn màu ngẫu nhiên
Ta muốn vẽ vòng xoắn ốc với kích thước (size) ngẫu nhiên, màu chọn ngẫu nhiên và vị trí con rùa cũng ngẫu nhiên.
Để dễ hiểu chương trình sau này bạn cần biết tọa độ trên màn hình sẽ như thế nào, các hàm liên hệ.
Màn hình trong Python sẽ như sau:
Chiều ngang của màn hình được xác định bằng hàm turtle.window_width(). Nửa phần bên trái trục tung (y) sẽ có dấu trừ và có chiều dài sẽ là -turtle.window_width()//2. Nửa phần bên phải không có dấu trừ và là turtle.window_width()//2.
Tương tự: Chiều cao (height) của màn hình được xác định bằng hàm turtle.window_height(). Nửa phần bên dưới trục hoành (x) sẽ có dấu trừ và có chiều dài sẽ là –turtle.window_height()//2.
Điểm gốc của đồ thị trên màn hình là tâm điểm O(0,0).
Các hàm random.randrange(argument1, argument2) cho ta một số ngẫu nhiên từ argument1 đến argument2)
Hàm random.randint(argument1, argument2) cho ta một số nguyên (integer) từ argument 1 đến argument2. (Argument= đối số).
Sau đây là chương trình:
#RandomCircles.py import random import turtle # vì phải vẽ nên phải “nhập cảng” con rùa t = turtle.Pen() turtle.bgcolor("black") colors = ["red", "yellow", "blue", "green", "orange", "purple", "white", "gray"] # danh sách (list) các màu for n in range(50): # Vẽ những vòng xoắn có kích thước/màu một cách ngẫu nhiên tại vị trí cũng ngẫu nhiên t.pencolor(random.choice(colors)) # Chọn 1 màu ngẫu nhiên size = random.randint(10,40) # chọn kích thước vòng xoắn 1 cách ngẫu nhiên trong khoảng từ 10 đến 40 pixels (dots) # Chọn ngẫu nhiên 1 vị trí toạ độ (x,y) trên màn hình x = random.randrange(-turtle.window_width()//2, turtle.window_width()//2) # hoành độ ngẫu nhiên y = random.randrange(-turtle.window_height()//2, turtle.window_height()//2) # tung độ ngẫu nhiên t.penup() t.setpos(x,y) # định vị trí “con rùa” vừa cho ngẫu nhiên bên trên t.pendown() for m in range(size): # vòng lặp vẽ vòng xoắn tròn t.circle(m*2) t.left(360 / size + 2)
Kết quả sau khi Run->Run module bạn sẽ có những vòng xoắn tròn với các màu chọn ngẫu nhiên và ở những vị trí ngẫu nhiên.
Bài tập: thay vì vòng xoắn tròn, bạn cho vẽ hình vòng xoắn vuông ngẫu nhiên, bạn sẽ có kết quả như hình 6-3 sau đây: (xem chương trình RandomSpirals.py trong folder ch6)
3) TRÒ CHƠI WÁNH TÙ T Ì RA CÁI G Ì RA CÁI N ÀY
Luật lệ trò chơi này hầu như cậu/cô bé nào cũng biết: búa dập kéo, kéo cắt giấy, giấy bọc búa. Giờ bạn chơi trò này với đối phương là cái máy điện toán (computer) của bạn. Xem chương trình sau bạn sẽ biết chương trình sẽ viết thế nào:
#RockPaperScissors.py import random # “nhập cảng” đúng ra là gọi chương trình random của Python choices = ["hammer", "paper", "scissors"] # danh sách tên các thứ bạn/computer chọn print("Hammer crushes scissors. Scissors cut paper. Paper covers hammer.") # luật lệ của trò chơi player = input("Do you want to be hammer, paper, or scissors (or quit)? ") # bạn ra cái gì? búa, giấy hay kéo hay quit? while player != "quit": # Tiếp tục chơi trong khi bạn chưa gõ chữ quit player = player.lower() # Chuyển cái bạn chọn ra thành chữ thường (lower case) computer = random.choice(choices) # computer chọn ngẫu nhiên một cái trong danh sách choices print("You chose " +player+ ", and the computer chose " +computer+ ".") # cho hiện ra cái bạn chọn và cái computer chọn. Dấu + để nối các biến player và computer vào với các string (text) mà thôi if player == computer: # nếu giống nhau print("It's a tie!") # giống nhau thì huề elif player == "hammer": # nếu bạn chọn búa if computer == "scissors": # nếu computer chọn kéo print("You win!") # bạn thắng else: # nếu không print("Computer wins!") # computer thắng elif player == "paper": # nếu bạn ra giấy if computer == "hammer": # và nếu computer ra búa print("You win!") # thì bạn thắng else: # nếu không print("Computer wins!") # computer thắng elif player == "scissors": # nếu bạn ra kéo if computer == "paper": # và nếu computer ra giấy print("You win!") # thì bạn thắng else: # nếu không print("Computer wins!") # computer thắng else: print("I think there was some sort of error...") # có gì đó sai rồi print() # Nhảy 1 dòng trống player = input("Do you want to be hammer, paper, or scissors (or quit)? ") # chơi tiếp hay gõ quit để nghỉ chơi?
4) ĐÁNH BÀI
Chương trình sau này dành cho phụ huynh giải trí hơn là cho trẻ con vì không nên dạy trẻ con đánh bài, đi Casino. Những câu lệnh cũng không có gì lạ, phụ huynh tự tìm hiểu để thấy những câu lệnh có sử dụng những hàm ngẫu nhiên (random) như thế nào. Đánh bài là một trong những trò chơi ngẫu nhiên phổ biến nhất.
# HighCard.py import random suits = ["clubs", "diamonds", "hearts", "spades"] # list các suits faces = ["two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "jack", "queen", "king", "ace"] # list các faces keep_going = True # Boolean variable while keep_going: # mới đầu keep_going là True my_face = random.choice(faces) # bạn chọn một face ngẫu nhiên my_suit = random.choice(suits) # bạn chọn một suit ngẫu nhiên your_face = random.choice(faces) # computer chọn một face ngẫu nhiên your_suit = random.choice(suits) # computer chọn một suit ngẫu nhiên print("I have the", my_face, "of", my_suit) print("You have the", your_face, "of", your_suit) if faces.index(my_face) > faces.index(your_face): print("I win!") # tôi thắng elif faces.index(my_face) < faces.index(your_face): # elif : else if print("You win!") # bạn thắng else: print("It's a tie!") # huề answer = input("Hit [Enter] to keep going, any key to exit: ") # muốn tiếp tục đánh bài thì nhấn nút ENTER, trái lại thì bấm bất cứ nút nào trên bàn phím keep_going = (answer == "") # bấm ENTER thì keep_going vẫn là True nên vòng loop WHILE vẫn tiếp tục. Trái lại nó không True tức là FALSE thì máy ngưng
Chú thích: array (dãy, mảng) là một tập hợp những gì tương tự. Trong Python, list (danh sách) như danh sách suits hay faces nói trên là array. Tuy nhiên trong một array ta không biết “giá trị” (value) mỗi phần tử trong đó. Phải nhờ đến một index (chỉ số) trong đó ghi số thứ tự từ thấp nhất lên cao nhất của các phần tử tương ứng trong array. Thí dụ:
Value in array Suits | “clubs” | “diamonds” | “hearts” | “spades |
index | 0 | 1 | 2 | 3 |
Hàm để tìm index của một phần tử trong list (hay array) là .index(). Chẳng hạn ta có lệnh suits.index(“spades”): sẽ cho ta index của spades trong suits là 3. Nếu index của một phần tử nào trong array mà lớn hơn index của phần tử khác trong array thì phần tử đó có “giá trị” cao hơn. Nhờ hàm này mà ta mới biết con bài nào cao hơn.
5) CHƠI XÚC XẮC – hay XÍ NGẦU (DICE) – YAHTZEE
Luật chơi: bạn có 5 con xúc xắc (dices). Mỗi con có 6 mặt, mỗi mặt có một số chấm đen (dots) từ 1 đến 6 chấm. Bạn gieo một lúc 5 dices. Nếu cả 5 con đều có số chấm đen như nhau thì bạn được Yahtzee. Hoặc bạn có 4 hay 3 con có số chấm đen như nhau.
# FiveDice2.py import random # Game loop keep_going = True # Boolean variable chỉ có 2 trị True và False while keep_going: # "Gieo" 5 con xúc xắc ngẫu nhiên dice = [0,0,0,0,0] # Tạo một array với 5 trị số là 0: dice[0]->dice[4] for i in range(5): # "Gieo" một số nguyên ngẫu nhiên từ 1 đến 6 cho tất cả 5 con xúc xắc dice[i] = random.randint(1,6) # hàm cho số nguyên ngẫu nhiên print("You rolled:", dice) # Print (cho hiện ra màn hình các trị số của dice) # Sort (xếp thứ tự) chúng từ nhỏ đến lớn dice.sort() # xem chú thích # Check coi cả 5 dices đều giống nhau, hay 4 hay 3 dices giống nhau # Yahtzee – là khi cả 5 dices đều giống nhau (có cùng số dots) if dice[0] == dice[4]: print("Yahtzee!") # test 4 dices đầu giống nhau hay 4 dices cuối giống nhau elif (dice[0] == dice[3]) or (dice[1] == dice[4]): print("Four of a kind!") # test 3 slices đầu, 3 dices giữa, hay 3 dices cuối giống nhau elif (dice[0] == dice[2]) or (dice[1] == dice[3]) or (dice[2] == dice[4]): print("Three of a kind") keep_going = (input("Hit [Enter] to keep going, any key to exit: ") == "")
Chú thích:
Tại sao phải sort (xếp thứ tự) trong array dice?
Nếu không sort, thí dụ có 3 dices giống nhau:
dice[1,3,2,3,3] ta phải test 5 lần để tìm 3 số giống nhau.
Nhưng nếu sort ta sẽ có dice[1,2,3,3,3], ta sẽ chỉ test dice[2] với dice[4] coi chúng có bằng nhau hay không thôi.
Hoặc nếu ta có dice[5,3,2,3,3] thì khi sort ta sẽ có dice[2,3,3,3,5) và ta chỉ cần so sánh dice[1] và dice[3] thôi. Với 4 dices giống nhau ta chỉ cần so dice[0] với dice[3] hoặc dice[1] với dice[4]. Nếu có 5 dices giống nhau, sau khi sort ta chỉ cần so sánh dice[0] với dice[4] v.v..
6) KÍNH VẠN HOA (KALEIDOSCOPE)
#Kaleidoscope.py import random import turtle t = turtle.Pen() t.speed(0) # cho “con rùa” chạy nhanh turtle.bgcolor("black") colors = ["red", "yellow", "blue", "green", "orange", "purple", "white", "gray"] # list (array) màu for n in range(50): # Tạo những vòng xoắn có kích thước, màu, vị trí ngẫu nhiên trên màn hình t.pencolor(random.choice(colors)) # chọn ngẫu nhiên màu bút trong array colors[] size = random.randint(10,40) # Chọn một kích thước (size) ngẫu nhiên cho vòng xoắn từ 10 đến 40 # Tạo vị trí toạ độ (x,y) trên màn hình một cách ngẫu nhiên x = random.randrange(0,turtle.window_width()//2) y = random.randrange(0,turtle.window_height()//2) # Vòng xoắn đầu tiên t.penup() t.setpos(x,y) t.pendown() for m in range(size): t.forward(m*2) t.left(91) # Vòng xoắn thứ hai t.penup() t.setpos(-x,y) # ở vị trí toạ độ (-x,y), trên truc x, bên trái trục y t.pendown() for m in range(size): t.forward(m*2) t.left(91) # Vòng xoắn thứ ba t.penup() t.setpos(-x,-y) # ở vị trí toạ độ(-x,-y), dưới trục x và bên trái trục y t.pendown() for m in range(size): t.forward(m*2) t.left(91) # Vòng xoắn thứ tư t.penup() t.setpos(x,-y) t.pendown() for m in range(size): t.forward(m*2) t.left(91)
Các hàm hay lệnh trong bài này các bạn đã biết qua trong những chương trước.
Kết quả: Kính Vạn Hoa
HẾT CHƯƠNG VI