C5ZONE
CHÀO MỪNG BẠN ĐÃ GHÉ THĂM DIỄN ĐÀN C5Zone


Bạn nên đăng nhập hoặc đăng ký thì mới xem được những nội dung chính của DIỄN ĐÀN. Việc đăng nhập hoặc đăng ký làm thành viên không tốn phí gì đâu. bạn yên tâm.
Bạn cũng có thể cứ làm khách vẫn xem được một phần nội dung của Diễn đàn, nhưng bị nhiều hạn chế hạn chế ở các chuyên mục như: không xem được ảnh, không nhìn thấy link ...

< /form>< /div>< /div>
C5ZONE
CHÀO MỪNG BẠN ĐÃ GHÉ THĂM DIỄN ĐÀN C5Zone


Bạn nên đăng nhập hoặc đăng ký thì mới xem được những nội dung chính của DIỄN ĐÀN. Việc đăng nhập hoặc đăng ký làm thành viên không tốn phí gì đâu. bạn yên tâm.
Bạn cũng có thể cứ làm khách vẫn xem được một phần nội dung của Diễn đàn, nhưng bị nhiều hạn chế hạn chế ở các chuyên mục như: không xem được ảnh, không nhìn thấy link ...

< /form>< /div>< /div>
C5ZONE
Would you like to react to this message? Create an account in a few clicks or log in to continue.

C5ZONELog in

We Share


descriptionHướng dẫn code game "Thỏ chiến binh" bằng Python EmptyHướng dẫn code game "Thỏ chiến binh" bằng Python

more_horiz
Bạn đã bao giờ tự hỏi rằng các video game được tạo ra như thế nào chưa? Nó không hề phức tạp như bạn nghĩ đâu.
Trong bài hướng dẫn này, bạn có thể tự tạo cho mình một tựa game đơn giản mang tên "Thỏ chiến binh" bằng Python. Trong game, một chú thỏ sẽ chiến đấu, phòng thủ pháo đài trước sự tấn công của lũ lửng mật.

Các cài đặt cần thiết

Để code "Thỏ chiến binh" bạn cần cài Python 2.7.3. Đây là phiên bản tốt nhất cho việc viết game, đừng cài phiên bản 3.3.0 nhé. Sau khi cài, bạn mở trình soạn thảo code IDLE bằng cách mở Start Menu, điền IDLE sau đó nhấp vào IDLE để chạy chương trình.
Tiếp theo, bạn cần thư viện PyGame để có thể code game trên Python. Truy cập pygame.org/download.shtml để tải về và cài đặt PyGame. Nhớ tải về đúng phiên bản PyGame hỗ trợ Python 2.7.3.
Bên cạnh đó, tựa game này cũng cần có một số tài nguyên khác. Bạn có thể tải những tài nguyên đó bằng cách nhấp vào đây.
Sau khi tải về, nhớ giải nén thư mục tài nguyên vào cùng thư mục mà bạn lưu code tựa game "Thỏ chiến binh". Nhớ đặt tên thư mục con chứa tài nguyên là resoureces để tiện cho việc code sau này.

Bước 1: Những dòng code đầu tiên

Bạn hãy chạy IDLE và nhập những dòng code sau:

Code:

# 1 - Import library
 import pygame
 from pygame.locals import *
 
 # 2 - Initialize the game
 pygame.init()
 width, height = 640, 480
 screen=pygame.display.set_mode((width, height))
 
 # 3 - Load images
 player = pygame.image.load("resources/images/dude.png")
 
 # 4 - keep looping through
 while 1:
    # 5 - clear the screen before drawing it again
    screen.fill(0)
    # 6 - draw the screen elements
    screen.blit(player, (100,100))
    # 7 - update the screen
    pygame.display.flip()
    # 8 - loop through the events
    for event in pygame.event.get():
        # check if the event is the X button
        if event.type==pygame.QUIT:
            # if it is quit the game
            pygame.quit()
            exit(0)
 


Sau khi nhập xong, hãy lưu lại vào thư mục mà bạn chuẩn bị từ trước, nơi chứa thư mục con resources với tên gọi game.py.
Bây giờ, nếu chạy những dòng code trên, bạn sẽ thấy màn hình dưới đây:

Hướng dẫn code game "Thỏ chiến binh" bằng Python May-lam-mat-640x100
Hướng dẫn code game "Thỏ chiến binh" bằng Python Tho1Hình ảnh đầu tiên của tựa game

Bước 2: Thêm cảnh quan

Bây giờ, chúng ta sẽ thêm hình nền cho game. 
Ở cuối phần #3, sau phần tải ảnh chú thỏ, bạn thêm những dòng code sau vào:

Code:

grass = pygame.image.load("resources/images/grass.png")
 castle = pygame.image.load("resources/images/castle.png")
 


Tuy nhiên, bức ảnh grass.png chưa lấp đầy khung hình. Vì thế, bạn cần vẽ thêm một số phần vào trước phần #6. Thêm những dòng code sau vào trước screen.blit(player, (100,100))

Code:

    for x in range(width/grass.get_width()+1):
        for y in range(height/grass.get_height()+1):
            screen.blit(grass,(x*100,y*100))
    screen.blit(castle,(0,30))
    screen.blit(castle,(0,135))
    screen.blit(castle,(0,240))
    screen.blit(castle,(0,345 ))
 


Nếu chạy chương trình bây giờ bạn sẽ thấy kết quả như sau:
Hướng dẫn code game "Thỏ chiến binh" bằng Python Tho2Game đã có thêm hình nền và các pháo đài thỏ

Bước 3: Tạo chuyển động cho chú thỏ

Bây giờ, để có một tựa game thực sự, bạn cần điều khiển được chú thỏ theo điều khiển trên bàn phím.
Để làm điều này, bạn cần thêm dòng code sau vào cuối phần #2:

Code:

keys = [False, False, False, False]
 playerpos=[100,100]
 


Thay đổi dòng code sau ở phần #6:

Code:

    screen.blit(player, (100,100))
 


Bằng dòng code:

Code:

    screen.blit(player, playerpos)
 


Cuối phần #8, ngay sau phần kiểm tra block cho event.type==pygame.QUIT, thêm dòng code sau vào:

Code:

        if event.type == pygame.KEYDOWN:
            if event.key==K_w:
                keys[0]=True
            elif event.key==K_a:
                keys[1]=True
            elif event.key==K_s:
                keys[2]=True
            elif event.key==K_d:
                keys[3]=True
        if event.type == pygame.KEYUP:
            if event.key==pygame.K_w:
                keys[0]=False
            elif event.key==pygame.K_a:
                keys[1]=False
            elif event.key==pygame.K_s:
                keys[2]=False
            elif event.key==pygame.K_d:
                keys[3]=False
 


Tiếp theo, bổ sung thêm đoạn code sau vào cuối file game.py:

Code:

    # 9 - Move player
    if keys[0]:
        playerpos[1]-=5
    elif keys[2]:
        playerpos[1]+=5
    if keys[1]:
        playerpos[0]-=5
    elif keys[3]:
        playerpos[0]+=5
 


Chạy code và bạn vẫn thấy hình ảnh như ở cuối bước 2. Tuy nhiên, khi nhấn các phím WASD, bạn sẽ thấy sự kỳ diệu xảy ra.
Hướng dẫn code game "Thỏ chiến binh" bằng Python Tho3Chú thỏ đã có thể di chuyển

Bước 4: Tạo hành động xoay cho chú thỏ

Giờ chú thỏ đã có thể di chuyển rồi. Nhưng là sẽ tuyệt vời hơn rất nhiều nếu nó có thể xoay mặt theo hướng di chuyển mà bạn chọn.
Để làm điều này, bạn cần thực hiện như sau:
Đầu tiên, thêm dòng code sau vào cuối phần #1:

Code:

import math
 


Tiếp theo, thay dòng cuối của phần #6 (dòng player.blit) bằng đoạn code sau:

Code:

    # 6.1 - Set player position and rotation
    position = pygame.mouse.get_pos()
    angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
    playerrot = pygame.transform.rotate(player, 360-angle*57.29)
    playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
    screen.blit(playerrot, playerpos1)
 


Tiếp tục chạy chương trình, lần này, khi nhấn nút WASD, chú thỏ không chỉ di chuyển mà còn xoay mặt theo hướng di chuyển nữa. Tuyệt vời!
Hướng dẫn code game "Thỏ chiến binh" bằng Python Tho10Và giờ thỏ còn có thể xoay mặt theo hướng di chuyển

Bước 5: Tạo hành động bắn cung cho chú thỏ

Bây giờ, phần chuyển động của chú thỏ đã xong. Chúng ta tới phần tạo hành động bắn cung cho chú thỏ.
Đầu tiên, bạn cần thêm hai biến rất quan trọng sau đây vào phần #2:

Code:

acc=[0,0]
 arrows=[]
 


Tiếp theo, tải hình ảnh mũi tên ở cuối phần #3 bằng dòng cách thêm dòng code:

Code:

arrow = pygame.image.load("resources/images/bullet.png")
 


Bây giờ, khi bạn nhấp chuột, mũi tên sẽ được bắn ra. Thêm những dòng code sau vào cuối phần #8 để xử lý sự kiện bắn tên mới vừa được tạo ra nhé:

Code:

        if event.type==pygame.MOUSEBUTTONDOWN:
            position=pygame.mouse.get_pos()
            acc[1]+=1
            arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])
 


Tiếp theo, bạn cần vẽ mũi tên trên màn hình. Thêm đoạn code sau ngay cuối phần #6.1:

Code:

    # 6.2 - Draw arrows
    for bullet in arrows:
        index=0
        velx=math.cos(bullet[0])*10
        vely=math.sin(bullet[0])*10
        bullet[1]+=velx
        bullet[2]+=vely
        if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:
            arrows.pop(index)
        index+=1
        for projectile in arrows:
            arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)
            screen.blit(arrow1, (projectile[1], projectile[2]))
 


Chạy thử chương trình bây giờ bạn có thể di chuyển chú thỏ bằng bàn phím và bắn cung bằng cách nhấp chuột.
Hướng dẫn code game "Thỏ chiến binh" bằng Python Tho5Chú thỏ biết bắn cung rồi nè

Bước 6: Tạo ra những con lửng mật

Bây giờ bạn đã có chú thỏ chiến binh với khả năng di chuyển và bắn cung để bảo vệ thành trì. Vậy những kẻ xâm lược đâu?
Ở bước này, bạn có thể tạo ra những con lửng mật lao về phía pháo đài. Bạn cần một số bước nhỏ sau:

  • Thêm những chú lửng mật vào một mảng danh sách

  • Cập nhật mảng mỗi khung hình và kiểm tra mỗi khi lửng mật biến mất khỏi khung hình

  • Hiển thị tiếp những con lửng mật


Đầu tiên, bạn cần thêm những dòng code sau vào cuối phần #2:

Code:

badtimer=100
 badtimer1=0
 badguys=[[640,100]]
 healthvalue=194
 


Đây là những dòng code thiết lập game thêm những con lửng mật mới sau một khoảng thời gian nhất định.
Tiếp theo, thêm hai dòng code sau vào cuối phần #3:

Code:

badguyimg1 = pygame.image.load("resources/images/badguy.png")
 badguyimg=badguyimg1
 


Dòng code đầu tiên sẽ có nhiệm vụ thêm hình ảnh của con lửng mật vào game. Dòng thứ hai sao chép hình ảnh con lửng mật.
Bổ sung thêm đoạn code sau vào sau phần #6.2:

Code:

    # 6.3 - Draw badgers
    if badtimer==0:
        badguys.append([640, random.randint(50,430)])
        badtimer=100-(badtimer1*2)
        if badtimer1>=35:
            badtimer1=35
        else:
            badtimer1+=5
    index=0
    for badguy in badguys:
        if badguy[0]<-64:
            badguys.pop(index)
        badguy[0]-=7
        index+=1
    for badguy in badguys:
        screen.blit(badguyimg, badguy)
 


Để sử dụng chức năng random, bạn cần khai báo thư viện random trong game.py. Bạn cần thêm dòng code sau vào cuối phần #1:

Code:

import random
 


Tiếp, thêm dòng code sau vào ngay sau hàm while ở phần #4:

Code:

badtimer-=1
 


Bây giờ, chạy thử game để tận hưởng khả năng di chuyển, bắn cung tiêu diệt lửng mật của chú thỏ chiến binh nhé.
Hướng dẫn code game "Thỏ chiến binh" bằng Python Tho6Thỏ bắt đầu có đối tượng để nhắm bắn
Game vẫn chưa hoàn thiện khi mà những con lửng mật không biến mất và pháo đài không sao khi bị lửng mật tấn công trúng.
Hãy thêm dòng code sau vào phía trước dòng index+=1 trên đầu vòng lặp ở phần #6.3:

Code:

        # 6.3.1 - Attack castle
        badrect=pygame.Rect(badguyimg.get_rect())
        badrect.top=badguy[1]
        badrect.left=badguy[0]
        if badrect.left<64:
            healthvalue -= random.randint(5,20)
            badguys.pop(index)
        # 6.3.3 - Next bad guy
 


Bây giờ, khi chạy chương trình, bán sẽ thấy những con lửng mật biến mất khi đâm vào pháo đài. Dù bạn không nhìn thấy nhưng những con lửng mật tấn công pháo đài thành công sẽ khiến lượng máu của bạn bị giảm đi.
Hướng dẫn code game "Thỏ chiến binh" bằng Python Tho7Game đang hoàn thiện, từng bước, từng bước một

Bước 7: Tạo hiệu ứng va chạm giữa lửng mật và mũi tên

Thực tế, trước bước này, mũi tên của thỏ chiến binh chưa tạo ra bất cứ hiệu ứng nào khi bắn trúng lửng mật. Bây giờ, chúng ta sẽ tạo hiệu ứng tiêu diệt lửng mật khi chú thỏ bắn tên trúng mục tiêu.
Ngay sau phần #6.3.1, bạn hãy thêm vào đoạn code sau:

Code:

        #6.3.2 - Check for collisions
        index1=0
        for bullet in arrows:
            bullrect=pygame.Rect(arrow.get_rect())
            bullrect.left=bullet[1]
            bullrect.top=bullet[2]
            if badrect.colliderect(bullrect):
                acc[0]+=1
                badguys.pop(index)
                arrows.pop(index1)
            index1+=1
 


Hiện tại, khi chạy chương trình bạn đã có để tiêu diệt lửng mật nếu bắn tên trúng.

Bước 8: Thêm vào các phần hiển thị máu của pháo đài và đồng hồ

Bây giờ, game của bạn cần có giới hạn nhất định cho máu pháo đài và tính thời gian tồn tại được của pháo đài.
Để thêm đồng hồ. Bạn thêm dòng code sau vào ngay đầu phần #7:

Code:

    # 6.4 - Draw clock
    font = pygame.font.Font(None, 24)
    survivedtext = font.render(str((90000-pygame.time.get_ticks())/60000)+":"+str((90000-pygame.time.get_ticks())/1000%60).zfill(2), True, (0,0,0))
    textRect = survivedtext.get_rect()
    textRect.topright=[635,5]
    screen.blit(survivedtext, textRect)
 


Tiếp theo, để thêm thanh máu, bạn cần tải ảnh của thanh máu trước. Thêm hai dòng code sau vào cuối phần #3:

Code:

healthbar = pygame.image.load("resources/images/healthbar.png")
 health = pygame.image.load("resources/images/health.png")
 


Bây giờ, thêm tiếp đoạn code sau vào ngay dưới phần #6.4:

Code:

    # 6.5 - Draw health bar
    screen.blit(healthbar, (5,5))
    for health1 in range(healthvalue):
        screen.blit(health, (health1+8,8))
 


Đoạn code này vẽ thanh máu màu đỏ. Sau đó vẽ thêm một số lượng màu xanh nhất định đè lên thanh máu, tùy theo lượng máu còn lại của pháo đài.
Chạy chương trình, bạn sẽ thấy thanh máu và đồng hồ xuất hiện:
Hướng dẫn code game "Thỏ chiến binh" bằng Python Tho8Đã có thanh máu và đồng hồ tính thời gian

Bước 9: Thiết lập thắng thua cho game

Tất cả mọi game đều phải có cơ chế thắng/thua. Vì thế, bạn cần thêm cơ chế này vào "Thỏ chiến binh".
Dưới đây là một số kịch bản thắng/thua của "Thỏ chiến binh""
Nếu thời gian đạt mức 900000ms hoặc 90 giây thì:

  • Ngừng game

  • Hiển thị kết quả là 1 hoặc win


Nếu pháo đài bị tiêu diệt thì:

  • Ngừng game

  • Hiển thị kết quả 0 hoặc lose


Thêm đoạn code sau vào cuối game.py:

Code:

    #10 - Win/Lose check
    if pygame.time.get_ticks()>=90000:
        running=0
        exitcode=1
    if healthvalue<=0:
        running=0
        exitcode=0
    if acc[1]!=0:
        accuracy=acc[0]*1.0/acc[1]*100
    else:
        accuracy=0
 # 11 - Win/lose display       
 if exitcode==0:
    pygame.font.init()
    font = pygame.font.Font(None, 24)
    text = font.render("Accuracy: "+str(accuracy)+"%", True, (255,0,0))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery+24
    screen.blit(gameover, (0,0))
    screen.blit(text, textRect)
 else:
    pygame.font.init()
    font = pygame.font.Font(None, 24)
    text = font.render("Accuracy: "+str(accuracy)+"%", True, (0,255,0))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery+24
    screen.blit(youwin, (0,0))
    screen.blit(text, textRect)
 while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)
    pygame.display.flip()
 


Tất nhiên, nếu bạn muốn hiển thị màn hình thông báo game thắng hay thua, bạn cần tải những hình ảnh này trước vào game.py. Thêm đoạn code sau vào cuối phần #3:

Code:

gameover = pygame.image.load("resources/images/gameover.png")
 youwin = pygame.image.load("resources/images/youwin.png")
 


Thay đổi phần #4 từ:

Code:

# 4 - keep looping through
 while 1:
    badtimer-=1
 


Thành:

Code:

# 4 - keep looping through
 running = 1
 exitcode = 0
 while running:
    badtimer-=1
 


Chạy lại game và bây giờ bạn có thể chiến thắng hoặc thua cuộc:
Hướng dẫn code game "Thỏ chiến binh" bằng Python Tho9Game đã có thắng có thua rồi nhé anh em

Bước 10: Thêm nhạc và hiệu ứng âm thanh

Game của bạn trông khá tuyệt rồi nhưng vẫn còn thiếu chút âm thanh. PyGame giúp thao tác thêm âm thanh vào game trở nên đơn giản hơn khá nhiều.
Đầu tiên, bạn cần thêm dòng code sau vào cuối phần #2:

Code:

pygame.mixer.init()
 


Tiếp theo, thêm code tải file âm thanh và thiết lập mức âm lượng ở cuối phần #3:

Code:

# 3.1 - Load audio
 hit = pygame.mixer.Sound("resources/audio/explode.wav")
 enemy = pygame.mixer.Sound("resources/audio/enemy.wav")
 shoot = pygame.mixer.Sound("resources/audio/shoot.wav")
 hit.set_volume(0.05)
 enemy.set_volume(0.05)
 shoot.set_volume(0.05)
 pygame.mixer.music.load('resources/audio/moonlight.wav')
 pygame.mixer.music.play(-1, 0.0)
 pygame.mixer.music.set_volume(0.25)
 


Bây giờ, bạn cần thêm code để phát ra hiệu ứng âm thanh khi cần. Thêm những dòng code sau vào vị trí được ghi trong phần chú thích:

Code:

# phần 6.3.1 sau dòng if badrect.left<64:
 hit.play()
 # phần 6.3.2 sau dòng if badrect.colliderect(bullrect):
 enemy.play()
 # phần 8, sau dòng if event.type==pygame.MOUSEBUTTONDOWN:
 shoot.play()
 


Chạy game và lần này bạn sẽ được tận hưởng cả nhạc nền, hiểu ứng âm nhạc và mọi thứ bạn mong chờ từ một tựa game hoàn chỉnh.
Bạn có thể tải toàn bộ mã code của tựa game "Thỏ chiến binh" bằng cách nhấp vào đây

descriptionHướng dẫn code game "Thỏ chiến binh" bằng Python EmptyRe: Hướng dẫn code game "Thỏ chiến binh" bằng Python

more_horiz
Thanks Phuong, <3 Phuong
privacy_tip Permissions in this forum:
You cannot reply to topics in this forum
power_settings_newLogin to reply