Hứng trứng (Eggs Catcher) là một game cổ điển với mục tiêu là hứng được càng nhiều trứng càng tốt. Trong game, mỗi quả trứng bạn hứng được sẽ giúp bạn tăng thêm điểm và nếu bạn hứng trượt 3 lần thì bạn sẽ thua.
Trong bài viết này, Quản Trị Mạng sẽ cùng các bạn tìm hiểu cách lập trình game hứng trứng bằng Python.
Cách lập trình game hứng trứng bằng Python
Game hứng trứng thử thách sự tập trung và tốc độ phản ứng của bạn khi bạn phải dùng một chiếc rổ để hứng những quả trứng rơi xuống khắp trên màn hình. Để tạo ra một game hứng trứng, bạn phải thiết kế hoạt ảnh quả trứng rơi xuống những điểm ngẫu nhiên trên màn hình và một chiếc rổ để hứng trứng.
Để tạo game hứng trứng bằng Python, bước đầu tiên bạn cần làm đó là thiết kế sàn, rổ và trứng. Khi game bắt đầu, những quả trứng sẽ dần dần di chuyển trên sàn, điều này sẽ tạo ra hoạt ảnh cho thấy quả trứng đang rơi xuống. Sau đó, với sự trợ giúp của các vòng lặp, chúng ta có thể liên tục kiểm tra xem trứng đã được hứng vào rổ hay đã chạm đất.
Khi quả trứng được hứng hoặc rơi xuống đất thì sự kiện kết thúc, quả trứng đó sẽ bị loại bỏ và game phải điều chỉnh điểm số bằng cách tăng điểm nếu quả trứng được hứng vào rổ hoặc giảm một mạng nếu quả trứng chạm đất.
Lập trình game hứng trứng bằng Python
Để lập trình game hứng trứng bằng Python bạn cần tạo ra 3 vòng lặp khác nhau.
- Một vòng lặp được dùng để tạo ra những quả trứng mới.
- Một vòng lặp khác được dùng để kiểm tra xem rổ có hứng được trứng hay không.
- Và vòng lặp thứ ba được dùng để di chuyển những quả trứng và kiểm tra xem trứng có bị chạm mặt đất hay không.
Hy vọng rằng giờ đây bạn đã hiểu toàn bộ quá trình tạo ra một game hứng trứng bằng Python. Chúng ta sẽ cần tới 3 mô-đun Python dưới đây cho việc lập trình game:
- itertools: Để thay đổi màu của các quả trứng đang rơi.
- random: Để những quả trứng xuất hiện ở các vị trí ngẫu nhiên.
- Tkinter: Để hoạt ảnh hóa game trên màn hình.
Dưới đây là toàn bộ code của game hứng trứng trên Python:
from itertools import cycle
from random import randrange
from tkinter import Canvas, Tk, messagebox, font
canvas_width = 800
canvas_height = 400
root = Tk()
c = Canvas(root, width=canvas_width, height=canvas_height, background="deep sky blue")
c.create_rectangle(-5, canvas_height-100, canvas_width+5, canvas_height+5, fill="sea green", width=0)
c.create_oval(-80, -80, 120, 120, fill='orange', width=0)
c.pack()
color_cycle = cycle(["light blue", "light green", "light pink", "light yellow", "light cyan"])
egg_width = 45
egg_height = 55
egg_score = 10
egg_speed = 500
egg_interval = 4000
difficulty = 0.95
catcher_color = "blue"
catcher_width = 100
catcher_height = 100
catcher_startx = canvas_width / 2 - catcher_width / 2
catcher_starty = canvas_height - catcher_height - 20
catcher_startx2 = catcher_startx + catcher_width
catcher_starty2 = catcher_starty + catcher_height
catcher = c.create_arc(catcher_startx, catcher_starty, catcher_startx2, catcher_starty2, start=200, extent=140, style="arc", outline=catcher_color, width=3)
game_font = font.nametofont("TkFixedFont")
game_font.config(size=18)
score = 0
score_text = c.create_text(10, 10, anchor="nw", font=game_font, fill="darkblue", text="Score: "+ str(score))
lives_remaining = 3
lives_text = c.create_text(canvas_width-10, 10, anchor="ne", font=game_font, fill="darkblue", text="Lives: "+ str(lives_remaining))
eggs = []
def create_egg():
x = randrange(10, 740)
y = 40
new_egg = c.create_oval(x, y, x+egg_width, y+egg_height, fill=next(color_cycle), width=0)
eggs.append(new_egg)
root.after(egg_interval, create_egg)
def move_eggs():
for egg in eggs:
(eggx, eggy, eggx2, eggy2) = c.coords(egg)
c.move(egg, 0, 10)
if eggy2 > canvas_height:
egg_dropped(egg)
root.after(egg_speed, move_eggs)
def egg_dropped(egg):
eggs.remove(egg)
c.delete(egg)
lose_a_life()
if lives_remaining == 0:
messagebox.showinfo("Game Over!", "Final Score: "+ str(score))
root.destroy()
def lose_a_life():
global lives_remaining
lives_remaining -= 1
c.itemconfigure(lives_text, text="Lives: "+ str(lives_remaining))
def check_catch():
(catcherx, catchery, catcherx2, catchery2) = c.coords(catcher)
for egg in eggs:
(eggx, eggy, eggx2, eggy2) = c.coords(egg)
if catcherx < eggx and eggx2 < catcherx2 and catchery2 - eggy2 < 40:
eggs.remove(egg)
c.delete(egg)
increase_score(egg_score)
root.after(100, check_catch)
def increase_score(points):
global score, egg_speed, egg_interval
score += points
egg_speed = int(egg_speed * difficulty)
egg_interval = int(egg_interval * difficulty)
c.itemconfigure(score_text, text="Score: "+ str(score))
def move_left(event):
(x1, y1, x2, y2) = c.coords(catcher)
if x1 > 0:
c.move(catcher, -20, 0)
def move_right(event):
(x1, y1, x2, y2) = c.coords(catcher)
if x2 < canvas_width:
c.move(catcher, 20, 0)
c.bind("<Left>", move_left)
c.bind("<Right>", move_right)
c.focus_set()
root.after(1000, create_egg)
root.after(1000, move_eggs)
root.after(1000, check_catch)
root.mainloop()
Bạn có thể tự tạo ra phiên bản game của riêng mình sau đó so sánh với phần code mẫu. Ngoài ra, bạn cũng có thể dùng phần code mẫu để tham khảo hoặc sửa lỗi nếu cần.
Kết
Ba hàm vòng lặp được thự thi bằng cách sử dụng bộ đếm thời gian để đảm bảo rằng chúng không được thực thi trước vòng lặp chính. Sau đó hàm mainloop() được thực thi để chạy game hứng trứng.
Chúc bạn thành công!