Hướng dẫn dùng sparce python

Ở 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 

Chủ Đề