You are on page 1of 8

1.

hàm main
Khởi tạo :
global screen, background, mode
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
PALETTE = get_palette(palette_path)
mode = 'title screen'
character1 = None
character2 = None
versus_data = None

Khởi tạo các biến toàn cục screen, background, và mode.


Tạo một cửa sổ hiển thị Pygame với kích thước (640, 480).
Thiết lập một đồng hồ để kiểm soát tốc độ khung ở 30 khung hình mỗi giây.
Nhận một bảng màu bằng cách sử dụng hàm get_palette với đường dẫn được chỉ định bởi
palette_path.
Khởi tạo các biến khác (character1, character2, versus_data) với giá trị None.
Ánh xạ điều khiển:
controls1 = { ... } # Từ điể n ánh xạ điều khiển cho người chơi 1
controls2 = { ... } # Từ điể n ánh xạ điều khiển cho người chơi 2
Định nghĩa từ điển cho người chơi 1 (controls1) và người chơi 2 (controls2) với
các cặp khóa-giá trị ánh xạ hành động điều khiển với các phím bàn phím cụ thểsử
dụng hằng sốPygame (K_RIGHT, K_LEFT, v.v.).V
Vòng lặp chính
while True:
clock.tick(30) # Giới hạn vòng lặp ở 30 lần chạy mỗ
i giây

for event in pygame.event.get():


if event.type == QUIT:
pygame.quit()
sys.exit()
```
- Vòng lặp chính của trò chơi chạy ở tốc độ 30 khung hình mỗ
i
giây và kiểm tra sự kiện thoát.

Màn Hình Tiêu Đề:

if mode == 'title screen':


mode = title_screen()
Nếu chế độ hiện tại là màn hình tiêu đề, nó gọi hàm title_screen và cập nhật chế độ tương ứng.
Chế Độ Arcade:

if mode == 'arcade':
sound_test()
if character1:
# ... một số logic để xử lý đối thủ trong chế độ arcade
elif not character1:
# ... một số logic để lựa chọn nhân vật trong chế độ arcade
Nếu chế độ hiện tại là chế độ arcade, nó kiểm tra xem có nhân vật người chơi (character1) và thực
hiện logic liên quan đến đối thủ hoặc lựa chọn nhân vật tương ứng.
Chế Độ Versus/Watch:
elif mode in ('versus', 'watch'):
character1, character2, background, versus_data = character_select(controls1, controls2)
Nếu chế độ là versus hoặc watch, nó gọi hàm character_select để thiết lập nhân vật và nền.
Màn Hình Versus:

if versus_data:
versus_screen(versus_data)
Nếu có dữ liệu cho trận đấu versus, nó gọi hàm versus_screen.
Trận Đấu:

if character1 and character2:


round_start(character1, character2, 1)
fight(character1, character2, mode)
Nếu cả character1 và character2 tồn tại, nó bắt đầu một trận đấu bằng cách gọi hàm round_start và
sau đó là hàm fight.

2. hàm fight
Khởi Tạo Biến Toàn Cục:

global fighting, attack_range, hit_freeze_time, empty_box, health_damage


Các biến toàn cục dùng để theo dõi trạng thái chiến đấu, phạm vi tấn công, thời gian đóng
băng khi bị đánh, hộp trống, và thiệt hại máu.

Khởi Tạo Clock và Surface:

clock = pygame.time.Clock()
display_surface = pygame.Surface((320, 240)).convert()
Tạo đối tượng Clock để kiểm soát tốc độ khung hình.
Tạo một đối tượng Surface để vẽ đồ họa, có kích thước 320x240.

Khởi Tạo Font và Biến Cấu Hình:

font = pygame.font.SysFont('Arial', 20)


attack_range = 0
hit_freeze_time = 0
empty_box = [0,0,0,0]
health_damage = [2,5,10,12,15,18,20,22,2,2]
Tạo đối tượng Font cho văn bản với phông chữ Arial kích thước 20.
Các biến khác được khởi tạo với giá trị mặc định.

Khởi Tạo Thanh Máu:

health_bar = pygame.Surface((102,12)).convert()
health_bar.fill((255,0,0))
pygame.draw.rect(health_bar, (255,255,255), [0,0,102,12],1)
Tạo thanh máu với đối tượng Surface kích thước 102x12 và màu đỏ.
Vẽ khung cho thanh máu.

Gán Đối Thủ Cho Nhân Vật:


character1.opponent = character2
character2.opponent = character1
Gán đối thủ cho nhân vật 1 và 2 để họ có thể đối đầu.

Bắt Đầu Trạng Thái Chiến Đấu:

fighting = True
Đặt trạng thái chiến đấu là True.

Vòng Lặp Cho Chế Độ "Versus":

while fighting:
# ... (các sự kiện và xử lý cho chế độ versus)
Trong vòng lặp này, xử lý các sự kiện như phím được nhấn và di chuyển nhân vật. Cập nhật
trạng thái của nhân vật và vẽ trạng thái chiến đấu lên màn hình.

Vòng Lặp Cho Chế Độ "Arcade":

while fighting:
# ... (các sự kiện và xử lý cho chế độ arcade)
Trong vòng lặp này, chỉ có nhân vật 1 là người chơi và nhân vật 2 là máy tính (AI). Các sự
kiện và xử lý tương tự như chế độ "versus".

Vòng Lặp Cho Chế Độ "Watch":

while fighting:
# ... (các sự kiện và xử lý cho chế độ watch)
Trong vòng lặp này, cả hai nhân vật đều được điều khiển bởi máy tính (AI). Các sự kiện và
xử lý tương tự như chế độ "versus" và "arcade".

Cập Nhật Màn Hình và Hiển Thị:

pygame.display.flip()
Cập nhật màn hình với những thay đổi mới.

3. hàm round
Khởi Tạo Biến:
clock = pygame.time.Clock()
display_surface = pygame.Surface((320, 240)).convert()
font = pygame.font.SysFont('Arial', 25, bold=True)
health_bar = pygame.Surface((102, 12)).convert()
Tạo đối tượng Clock để kiểm soát tốc độ khung hình.
Tạo đối tượng Surface để vẽ đồ họa, có kích thước 320x240.
Tạo đối tượng Font cho văn bản với phông chữ Arial, kích thước 25, và đậm.

Khởi Tạo Thanh Máu:


health_bar.fill((255, 0, 0))
pygame.draw.rect(health_bar, (255, 255, 255), [0, 0, 102, 12], 1)
Tạo thanh máu với màu đỏ và khung trắng
Tạo Văn Bản "ROUND" và "FIGHT!":
text1 = font.render('ROUND ' + str(round_number), True, YELLOW)
text2 = font.render('ROUND ' + str(round_number), True, RED)
Tạo văn bản "ROUND X" với màu vàng và đỏ, với X là số vòng.
Vòng Lặp Cho Phần Hiển Thị "ROUND" và "FIGHT!":
while True:
# ... (các sự kiện và xử lý)
Vòng lặp này sẽ chạy mãi mãi cho đến khi kết thúc vòng.
Xử Lý Sự Kiện:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
pygame.quit()
sys.exit()
Xử lý sự kiện nhấn phím và thoát game nếu cần thiết.

Cập Nhật Nhân Vật và Hiển Thị:


character1.update()
character2.update()
Cập nhật trạng thái của nhân vật

Hiển Thị Đồ Họa:


display_surface.fill((0, 0, 0))
display_surface.blit(background['image'], background['pos'])
shadow_pos = [character1.axis_pos[0] + character1.sprites[0]['x_axis_shift'],
FLOOR_Y_POS - 6]
display_surface.blit(character1.sprites[0]['image'], shadow_pos)
shadow_pos = [character2.axis_pos[0] + character2.sprites[0]['x_axis_shift'],
FLOOR_Y_POS - 6]
display_surface.blit(character2.sprites[0]['image'], shadow_pos)
character1.draw(display_surface)
character2.draw(display_surface)
display_surface.blit(health_bar, (20, 18))
display_surface.blit(health_bar, (198, 18))
if character1.updated_health > 0:
pygame.draw.rect(display_surface, (255, 255, 0), [120, 19, -character1.updated_health +
2, 10])
if character2.updated_health > 0:
pygame.draw.rect(display_surface, (255, 255, 0), [199, 19, character2.updated_health,
10])
Hiển thị đồ họa nhân vật và thanh máu.

Hiển Thị "FIGHT!":


text_flash_time += 1
if text_flash_time < 6:
screen.blit(text1, text_pos)
elif text_flash_time < 12:
screen.blit(text2, text_pos)
elif text_flash_time > 12:
text_flash_time = 0
Hiển thị văn bản "FIGHT!" với hiệu ứng nhấp nháy.

Cập Nhật Màn Hình và Hiển Thị:


pygame.display.flip()
Cập nhật màn hình với những thay đổi mới.
Hàm này được thiết kế để hiển thị thông báo "ROUND X" và "FIGHT!" trước khi bắt đầu
một vòng đấu mới trong trò chơi đối kháng.

4. Hàm veruss
Khởi Tạo Biến và Đối Tượng Font:
clock = pygame.time.Clock()
font = pygame.font.SysFont('Arial', 24, bold=True)
Tạo đối tượng Clock để kiểm soát tốc độ khung hình.
Tạo đối tượng Font cho văn bản với phông chữ Arial, kích thước 24, và đậm.

Chuẩn Bị Dữ Liệu Cho Hiển Thị:


character1_name = font.render(versus_data[0]['name'], True, WHITE)
character2_name = font.render(versus_data[1]['name'], True, WHITE)
character1_portrait = versus_data[0]['portrait']
character2_portrait = pygame.transform.flip(versus_data[1]['portrait'], True, False)
versus_image = versus_data[2]
Tạo các đối tượng văn bản và hình ảnh cần hiển thị dựa trên dữ liệu đầu vào.

Tính Toán Vị Trí Cho Các Phần Tựa và Hình Ảnh:


versus_image_pos = [320 - int(versus_image.get_width() / 2), 260]
portrait_x_offset = int(((640 - versus_image.get_width()) / 2 -
character1_portrait.get_width()) / 2)
character1_portrait_pos = [portrait_x_offset, 170]
character2_portrait_pos = [640 - portrait_x_offset - character2_portrait.get_width(), 170]
character1_name_pos = [int(character1_portrait_pos[0] + character1_portrait.get_width() / 2
- character1_name.get_width() / 2), 90]
character2_name_pos = [int(character2_portrait_pos[0] + character2_portrait.get_width() / 2
- character2_name.get_width() / 2), 90]
Tính toán vị trí của các phần tựa và hình ảnh dựa trên kích thước và giữa các thành phần.

Vòng Lặp Cho Hiển Thị:


t1 = pygame.time.get_ticks()
while True:
# ... (các sự kiện và xử lý)
Vòng lặp này chạy mãi mãi cho đến khi sự kiện kết thúc.

Xử Lý Sự Kiện:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
return
Xử lý sự kiện nhấn phím để chuyển từ màn hình so sánh về màn hình chính.

Kiểm Tra Thời Gian Đã Trôi:


t2 = pygame.time.get_ticks()
if (t2 - t1) / 1000 > 3:
break
Kiểm tra xem đã đủ thời gian hiển thị so sánh chưa (trong trường hợp này là 3 giây). Nếu đủ
thời gian, thoát khỏi vòng lặp.

Hiển Thị Hình Ảnh và Văn Bản:


screen.fill(BLUE)
screen.blit(versus_image, versus_image_pos)
screen.blit(character1_portrait, character1_portrait_pos)
screen.blit(character2_portrait, character2_portrait_pos)
screen.blit(character1_name, character1_name_pos)
screen.blit(character2_name, character2_name_pos)
pygame.display.flip()
Hiển thị các phần tựa, hình ảnh và văn bản lên màn hình.

5. Hàm title_screen có nhiệm vụ hiển thị màn hình chính của trò chơi và xử lý sự kiện người
chơi chọn chế độ chơi.

Khởi Tạo Biến và Đối Tượng Font:


clock = pygame.time.Clock()
PALETTE = get_palette(palette_path)
alpha_color = PALETTE[0]
font = pygame.font.SysFont('Arial', 22)
text = font.render("Hit Any Key to Play", True, YELLOW)
text_pos = [320 - int(text.get_width() / 2), 380]
text_flash_time = 0
show_menu = False
menu = ['arcade', 'versus', 'watch']
menu_length = len(menu)
menu_index = 0
Tạo đối tượng Clock để kiểm soát tốc độ khung hình.
Lấy bảng màu từ hàm get_palette.
Khởi tạo một màu alpha dựa trên bảng màu.
Tạo đối tượng Font và văn bản hiển thị "Hit Any Key to Play".
Các biến khác để quản lý hiển thị menu và lựa chọn chế độ chơi.

Chuẩn Bị Hình Ảnh Đồ Họa và Vị Trí:


image_path = sfibm_path + "TITLE.229"
with open(image_path, 'rb') as file:
image_data = file.read(229 * 131)
title = pygame.image.fromstring(image_data, (229, 131), 'P')
title.set_palette(PALETTE)
title.set_colorkey(alpha_color)
title.convert()
title_scaled_size = (title.get_width() * SCALE, title.get_height() * SCALE)
title = pygame.transform.scale(title, title_scaled_size)
title_pos = [int((320 - (title.get_width()) / 2)), 80]
Chuẩn bị hình ảnh đồ họa cho màn hình chính và điều chỉnh kích thước.
Thiết lập màu alpha và bảng màu cho hình ảnh.
Vòng Lặp Cho Hiển Thị và Xử Lý Sự Kiện:
while True:
# ... (sự kiện và xử lý)
Vòng lặp này chạy mãi mãi cho đến khi người chơi chọn một chế độ chơi.
Xử Lý Sự Kiện:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
pygame.quit()
sys.exit()
if show_menu:
# Xử lý sự kiện khi người chơi đang ở trong menu.
# Nếu người chơi nhấn phím lên hoặc xuống, cập nhật màu sắc của các mục menu.
# Nếu người chơi nhấn Enter, trả về chế độ chơi đã chọn.
elif not show_menu:
# Nếu người chơi chưa ở trong menu, hiển thị văn bản nhấp nháy "Hit Any Key to
Play".
Hiển Thị Nội Dung Màn Hình Chính:
screen.fill(BLACK)
screen.blit(title, title_pos)
if show_menu:
# Hiển thị các mục menu và màu sắc của chúng.
elif not show_menu:
# Hiển thị văn bản "Hit Any Key to Play" nhấp nháy.
pygame.display.flip()
Hiển thị màn hình chính với hình ảnh và nội dung tương ứng.
Nếu người chơi ở trong menu, hiển thị các mục menu và xử lý màu sắc của chúng.
Nếu người chơi không ở trong menu, hiển thị văn bản nhấp nháy.
Hàm này được sử dụng để hiển thị màn hình chính của trò chơi và chọn chế độ chơi.

6. Hàm character_select có nhiệm vụ cho phép người chơi lựa chọn nhân vật trong trò chơi và
khởi tạo thông tin liên quan.
7.
Khởi Tạo Biến và Đối Tượng Font:
clock = pygame.time.Clock()
PALETTE = get_palette(palette_path)
alpha_color = PALETTE[0]
font = pygame.font.SysFont('Arial', 20)
Tạo đối tượng Clock để kiểm soát tốc độ khung hình.
Lấy bảng màu từ hàm get_palette.
Khởi tạo một màu alpha dựa trên bảng màu.
Tạo đối tượng Font để hiển thị văn bản

Chuẩn Bị Hình Ảnh Đồ Họa và Vị Trí:

image_path = sfibm_path + "SELECT.SF2"


with open(image_path, 'rb') as file:
image_data1 = file.read(195 * 93)
image_data2 = file.read(122 * 75)
world_map = pygame.image.fromstring(image_data1, (195, 93), 'P')
characters_faces = pygame.image.fromstring(image_data2, (122, 72), 'P')
# ... (tiếp theo là xử lý hình ảnh và vị trí)
Chuẩn bị hình ảnh đồ họa cho màn hình chọn nhân vật.
Thiết lập màu alpha và bảng màu cho hình ảnh.

Chuẩn Bị Dữ Liệu Nhân Vật và Vị Trí:


images = load_R(R, ID, PALETTE)
# ... (tiếp theo là xử lý hình ảnh nhân vật và vị trí)
Sử dụng hàm load_R để tải các hình ảnh nhân vật và thiết lập kích thước.
Khởi tạo hình ảnh và vị trí của các ô chọn nhân vật cho cả hai người chơi.

Vòng Lặp Cho Hiển Thị và Xử Lý Sự Kiện:


while True:
# ... (sự kiện và xử lý)
Vòng lặp này chạy mãi mãi cho đến khi người chơi đã lựa chọn nhân vật cho cả hai hoặc
quay lại màn hình chính.
Xử Lý Sự Kiện:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
# ... (xử lý sự kiện khi người chơi nhấn phím)
Xử lý sự kiện khi người chơi nhấn phím, bao gồm di chuyển trong menu và chọn nhân vật.
Hiển Thị Nội Dung Màn Hình:
screen.fill(BLUE)
# ... (hiển thị hình ảnh và vị trí nhân vật, ô chọn)
pygame.display.flip()
Hiển thị màn hình chọn nhân vật với hình ảnh và vị trí tương ứng.
Hiển thị ô chọn và xử lý hiệu ứng nhấp nháy.
Trả Về Dữ Liệu:
if mode == 'arcade':
if character1:
# ... (tiếp theo là chuẩn bị dữ liệu cho chế độ arcade)
elif mode in ('versus', 'watch'):
if character1 and character2:
# ... (tiếp theo là chuẩn bị dữ liệu cho chế độ versus hoặc watch)
Nếu đã chọn đủ nhân vật cho cả hai người chơi, chuẩn bị dữ liệu cho chế độ chơi tương ứng.
8.
9.

You might also like