Ở bài viết trước mình đã hướng dẫn các bạn cách làm game Caro chơi qua mạng Lan. Hôm nay mình sẽ sử dụng một thư viện làm game chuyên nghiệp hơn cũng như hướng dẫn cách làm game Space Invaders với Python.
Chắc có lẽ mỗi ai trong chúng ta mà không biết đến game Space Invaders. Trò chơi này gắn liền với tuổi thơ chúng ta nhất là thế hệ 8x 9x. Game Space Invaders cũng có thể nói là một sự khởi đầu cho ngành phát triển game như hiện nay. Với lối chơi đơn giản cũng như không gây nhàm chán, hiện này trò chơi này vẫn luôn được các bạn trẻ yêu thích.
Cài đặt python và các thư viện kèm theo:
Cài đặt python
Nếu các bạn chưa cài python click Tại đây để được hướng dẫn .
Cài đặt thư viện cần thiết
pip install pygame
Bắt đầu lập trình thôi nào
Đầu tiên các bạn cần tạo file với cấu trúc thư mục như sau.
Import các thư viện cần thiết.
import pygame
import random
from pygame import mixer
Tạo một class Game.
class Game:
Hàm khởi tạo.
def __init__[self]:
pygame.init[] # Init pygame
self.xScreen, self.yScreen = 1000, 600 # Screen create
self.VBullet = 15 # Tốc độ Bullet
self.VPlanes = 15 # Tốc độ Planes
self.VEnemy = 6 # Tốc độ Enemy
self.scores = 0 # Điểm số
self.numberEnemy = 2 # Số lượng enemy trong một screen
self.numberBullet = 6 # Số bullet trong một screen
linkBackGround = './data/background.jpg' # Đường dẫn ảnh background
self.linkEnemy = './data/enemy.png' # Đường dẫn ảnh Enemy
self.linkPlanes = './data/planes.png' # Đường dẫn ảnh Planes
self.sizexPlanes, self.sizeyPlanes = 80, 80
self.xPlanes, self.yPlanes = self.xScreen / \
2, self.yScreen-100 # Khởi tao vị trí ban đầu planes
self.screen = pygame.display.set_mode[
[self.xScreen, self.yScreen]] # Khởi tao kích thước màn hình
pygame.display.set_caption["Code Learn - Space Invaders"]
self.background = pygame.image.load[linkBackGround]
icon = pygame.image.load[self.linkPlanes]
pygame.display.set_icon[icon] # Set icon cho screen
self.gamerunning = True
self.listBullet = []
self.listEnemy = []
self.YGameOver = 0
self.K_DOWN = self.K_UP = self.K_LEFT = self.K_RIGHT = False
self.music["./data/musictheme.wav"]
Hàm bật âm thanh .
def music[self, url]: # Âm thanh bắn
bulletSound = mixer.Sound[url]
bulletSound.play[]
Lưu ý
:
- Các bạn ấn Tại đây để lựa chọn âm thanh bạn thích nhé.
- Chỉ sử dụng file âm thanh có đuôi là .wav với Bitdepth là 16.
Hàm hiển thị điểm.
def show_score[self, x, y, scores, size]: # Hiển thị điểm
font = pygame.font.SysFont["comicsansms", size]
score = font.render[str[scores], True, [255, 255, 255]]
self.screen.blit[score, [x, y]]
Hàm để vẽ các hình ảnh .
def image_draw[self, url, xLocal, yLocal, xImg, yImg]: # In ra người hình ảnh
PlanesImg = pygame.image.load[url]
PlanesImg = pygame.transform.scale[
PlanesImg, [xImg, yImg]] # change size image
self.screen.blit[PlanesImg, [xLocal, yLocal]]
Phương thức enemy.
def enemy[self]: # Quản lý Enemy
for count, i in enumerate[self.listEnemy]:
xEnemy = i["xEnemy"] # Lấy toạn độ X
yEnemy = i["yEnemy"] # Lấy toạn độ Y
self.YGameOver
# print["đổi"]
if xEnemy < 0 or xEnemy > self.xScreen-self.sizexPlanes: # Nếu chạm vào hai bên phải trái
# thì đổi hướng
self.listEnemy[count]["direction"] = not self.listEnemy[count]["direction"]
self.image_draw[self.linkEnemy, xEnemy, yEnemy, self.sizexPlanes,
self.sizeyPlanes] # In enemy ra màn hình
self.listEnemy[count]["xEnemy"] = xEnemy + \
[self.VEnemy if self.listEnemy[count]
["direction"] == False else -self.VEnemy]
self.listEnemy[count]["yEnemy"] = yEnemy + \
self.VEnemy/2.5 # Toạn độ x xông tốc độ Enemy/3
# Gán giá trị lớn nhất của Enemy theo y
self.YGameOver = yEnemy if yEnemy > self.YGameOver else self.YGameOver
# print[xEnemy,yEnemy,self.xScreen,self.yScreen]
# print[self.listEnemy[count]["direction"]]
Lưu ý
: Khi mỗi Enemy
được
khởi tạo sẽ được add vào listEnemy
. Mỗi Enemy được định nghĩa dưới dạng dict với các key là {"xEnemy","yEnemy","direction"}. Khi trong vòng while trong hàm run chạy thì:
- Kiểm tra xem các có chạm vào lề bên phải và bên trái màn hình hay không
xEnemy self.xScreen-self.sizexPlanes
nếu trong khoảng thì sẽ đổi hướng đi ngược lại. - Đưa Enemy tiến về phía trước và dịch sang phía
"direction"
. - Gán các giá trị theo trục Y lớn nhất của Enemy vào
self.YgnemyGameOver
.
Phương thức bullet.
def bullet[self]:
for count, i in enumerate[self.listBullet]:
xBullet = i["xBullet"] # Lấy trúc tọa độ theo X
yBullet = i["yBullet"] # Lấy trúc tọa độ theo X
self.image_draw['./data/bullet.png', xBullet,
yBullet, 50, 50] # In ra bullet
self.listBullet[count]["yBullet"] = yBullet - \
self.VBullet # Tiến y vè phía trước
if yBullet self.xScreen else self.xPlanes
self.yPlanes = 0 if self.yPlanes < 0 else self.yPlanes
self.yPlanes = self.yScreen-self.sizeyPlanes if self.yPlanes + \
self.sizeyPlanes > self.yScreen else self.yPlanes
# nếu số lượng Enemy ít hơn self.numberEnemy thì tạo thêm
if len[self.listEnemy] < self.numberEnemy:
self.listEnemy.append[{
"xEnemy": random.randint[0, self.xScreen-self.sizexPlanes],
"yEnemy": random.randint[-50, self.yScreen/6],
"direction": random.choice[[True, False]]
}]
listEnemy2 = self.listEnemy
# Kiểm tra có trúng bullet
for countEnemy, enemyIteam in enumerate[listEnemy2]:
xEnemy = enemyIteam["xEnemy"]
yEnemy = enemyIteam["yEnemy"]
xEnemy = enemyIteam["xEnemy"]
yEnemy = enemyIteam["yEnemy"]
for countBullet, bulletIteam in enumerate[self.listBullet]:
xBullet = bulletIteam["xBullet"]
yBullet = bulletIteam["yBullet"]
# Kiểm tra bullet có nằm giữa Enemy theo trục x không
isInX = xEnemy