DẠY TRẺ (KIDS) LẬP TRÌNH ĐIỆN TOÁN

(CODING/PROGRAMMING)

NGÔN NGỮ PYTHON

Your kids can do this with Python!

Điều kiện học:

  • Phụ huynh phải biết sử dụng Windows 10 VÀ Internet nếu trẻ chưa biết.
  • Dành cho các máy PC.
  • Dùng Google Chrome
  • Một ít tiếng Anh về điện toán
  • Có bộ gõ tiếng Việt càng tốt (VNI, VPS…)

CHƯƠNG VI

PYTHON VÀ TRÒ CHƠI NGẪU NHIÊN (RANDOM)

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)

Hình 6-3

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
Suits
Faces

 

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

5 Con xúc xắc (dices)

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

 

Mới Nhất

Câu Hỏi & Bình Luân

BÌNH LUẬN

Please enter your comment!
Please enter your name here

Ghi danh nhận bài đăng mới nhất

X