1. Trang chủ
  2. » Luận Văn - Báo Cáo

đề tài xây dựng game bằng ngôn ngữ lập trình python

28 3 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Xây Dựng Game Bằng Ngôn Ngữ Lập Trình Python
Tác giả Ngụy Đình Khang, Hoàng Gia Kiệt, Cao Nhật Duy
Người hướng dẫn TS. Đỗ Như Tài
Trường học Trường Đại Học Kinh Tế Tp.Hcm
Chuyên ngành Lập Trình Căn Bản
Thể loại Báo Cáo Cuối Kỳ
Năm xuất bản 2024
Thành phố Tp.Hcm
Định dạng
Số trang 28
Dung lượng 257,95 KB

Nội dung

Trong một game sẽ có 36 thẻ tương ứng 18 cặp thẻ trùng nhau, người chơi cần nhớ và thử các vị trí khác nhau để lật được các thẻ trùng khớp.. locals import * Random: Thư viện này cung cấ

Trang 1

BỘ GIÁO DỤC & ĐÀO TẠO TRƯỜNG ĐẠI HỌC KINH TẾ TP.HCM

Giảng Viên: TS Đỗ Như Tài

Sinh viên: Ngụy Đình Khang - 31231026834

Hoàng Gia Kiệt - 31231024563 Cao Nhật Duy - 31231026658

TP.HCM, ngày 20 tháng 4 năm 2024

Trang 2

MỤC LỤC

A MỞ ĐẦU 1

1 Giới thiệu đề tài 1

2 Mục đích – Mục tiêu 1

B NỘI DUNG 2

1 Đôi nét về game lật thẻ 2

1.1 Game lật thẻ là gì? 2

1.2 Luật chơi 2

2 Giới thiệu vấn đề 2

3 Sơ đồ thuật toán 2

4 Xây dựng game 5

4.1 Các thư viện được sử dụng 5

4.2 Khởi tạo biến, điều kiện và cấu hình trò chơi 5

4.3 Hiển thị menu chính 8

4.4 Tạo bảng xáo trộn ngẫu nhiên 9

4.5 Tổ hợp hình thành các icon của ô 11

4.6 Vẽ bảng trò chơi lên màn hình 14

4.7 Sử lý các sự kiện 19

4.8 Thời gian 22

4.9 Điểm số 22

4.10 Kết quả trò chơi 22

5 Kết luận 23

Trang 3

A MỞ ĐẦU

1 Giới thiệu đề tài.

Xây dựng trò chơi Lật Thẻ bằng ngôn ngữ lâp trình python

Thế giới ngày nay đang chứng kiến sự phát triển vũ bão của lĩnh vực Công nghệ thông tin,len lỏi vào mọi ngóc ngách đời sống, vẽ nên bức tranh hiện đại đầy tiềm năng trên toàn cầu vàtại Việt Nam Công nghệ thông tin đóng vai trò then chốt trong công cuộc công nghiệp hóa,hiện đại hóa, là chìa khóa dẫn dắt đất nước ta vươn lên tầm cao mới

Python là một ngôn ngữ lập trình hướng đối tượng cao cấp, được sử dụng rộng rãi để pháttriển các ứng dụng web và đa dạng ứng dụng khác Python được tạo ra bởi Guido van Rossum

và phát triển dưới dự án mã nguồn mở Với cú pháp đơn giản và dễ hiểu, Python là lựa chọnhoàn hảo cho người mới học lập trình Nó có thể giải quyết các vấn đề liên quan đến số học,

xử lý văn bản, tạo game và nhiều công việc khác

Trong quá trình tìm hiểu, chúng tôi đặc biệt quan tâm đến việc sử dụng Python và thư việnPygame để phát triển các trò chơi Pygame là một bộ công cụ hữu ích trong lập trình Python

và đã tạo ra nhiều trò chơi nổi tiếng từ thời ban đầu Vì vậy, chúng tôi đã quyết định sử dụngthư viện Pygame để xây dựng trò chơi Lật Thẻ

2 Mục đích – Mục tiêu

 Mục đích:

 Nắm chắc được kỹ năng và kiến thức về lập trình

 Tìm hiểu về thư viện Pygame trong ngôn ngữ lập trình Python

 Củng cố, áp dụng, nâng cao kiến thức đã được học

 Nắm bắt được quy trình làm game cơ bản

 Mục tiêu:

 Vận dụng được tính chất của lập trình hướng đối tượng

 Sử dụng thư viện Pygame vào việc xây dựng game Lật Thẻ

1

Trang 4

1.2 Luật chơi.

Các thẻ của game được tổ hợp từ các dạng hình học và màu khác nhau Trong một game sẽ có 36 thẻ tương ứng 18 cặp thẻ trùng nhau, người chơi cần nhớ và thử các vị trí khác nhau để lật được các thẻ trùng khớp Khi hai thẻ trùng được mở hai thẻ này sẽ được giữa nguyên mặt đã được lật và người chơi tiếp tục lật thẻ để tìm cặp trùng lặp khác Nếu người chơi lật thẻ không trùng nhau thì hai thẻ sẽ tự úp thẻ lại như cũ Người chơi lật được tất cả các cặp thẻ là thắng cuộc

2 Giới thiệu vấn đề

Yêu cầu chương trình là thiết kế được một chương trình game trên dựa vào cácphương pháp lập trình đã học Cụ thể là sử dụng phương pháp lập trình Python đang họckết hợp với các mẫu thiết kế và các giải thuật toán học

3 Sơ đồ thuật toán

2

Trang 5

Khởi tạo bảng Hiển thị animation

bắt đầu trò chơi Xử lí sự kiện

Người chơi chọn

mở 1 ô mới

3

Trang 8

Hiển thị animation th ắng trò chơi và chuẩn bị cho ván mới

6

Trang 9

from pygame locals import *

 Random: Thư viện này cung cấp các công cụ để làm việc với số ngẫu nhiên, như hàmrandom.shuffle() được sử dụng để xáo trộn các hình ảnh và màu sắc trước khi hiển thịchúng trên bảng

 Pygame: Đây là một thư viện Python được sử dụng để phát triển trò chơi và ứng dụng

đa phương tiện Thư viện được sử dụng để tạo cửa sổ, hiển thị hình ảnh, vẽ các hình

và biểu tượng trên màn hình, xử lý sự kiện như nhấp chuột và nút bàn phím, và thựchiện các hiệu ứng như lật các ô

 Sys: Thư viện này cung cấp các chức năng và biến liên quan đến hệ thống Nó được sửdụng để thoát khỏi trò chơi bằng cách gọi ‘sys.exit()’

 Pygame.locals: Thư viện này cung cấp các hằng số được sử dụng để xác định các sựkiện như nhấp chuột và nút bàn phím trong pygame

4.2 Khởi tạo biến, điều kiện và cấu hình trò chơi

XMARGIN = int (( CR - ( BOARDWIDTH * ( BOXSIZE GAPSIZE ))) / 2

YMARGIN = int (( WINDOWHEIGHT - ( BOARDHEIGHT ( BOXSIZE + GAPSIZE ))) /

Trang 10

 WINDOWHEIGHT : là chiều cao của cửa sổ trong trò chơi

 REVEALSPEED : tốc độ mà các ô trong trò chơi được hiển thị (ví dụ: khi một

ô mở ra)

 BOXSIZE : là kích thước của mỗi ô trong bảng trò chơi

 GAPSIZE : là khoảng cách giữa các ô trong bảng trò chơi

 BOARDWIDTH : là số lượng ô theo chiều ngang trong bảng trò chơi

 BOARDHEIGHT : là số lượng ô theo chiều dọc trong bảng trò chơi

 assert (BOARDWIDTH * BOARDHEIGHT) % 2 == 0 : Dòng này kiểm traxem có đúng là số lượng ô trong bảng là số chẵn hay không Điều này quantrọng vì trong trò chơi hình memory matching, cần có một số chẵn ô để tạothành các cặp

 XMARGIN là khoảng cách từ mép trái của cửa sổ đến vị trí bắt đầu của bảngtrò chơi theo chiều ngang

 YMARGIN là khoảng cách từ mép trên của cửa sổ đến vị trí bắt đầu của bảngtrò chơi theo chiều dọc

Trang 11

 HIGHLIGHTCOLOR là màu được sử dụng để làm nổi bật ô trong tròchơi, trong trường hợp này là màu xanh dương.

ALLCOLORS = ( RED , GREEN , BLUE , YELLOW , ORANGE , PURPLE ,

CYAN , WHITE , PINK )

ALLSHAPES = ( DONUT , SQUARE , DIAMOND , LINES , OVAL , TRAPEZOID , X

assert len ( ALLCOLORS ) * len ( ALLSHAPES ) * >= BOARDWIDTH

BOARDHEIGHT , "Ba 9ng quá lớn so với số@ hình dạng/màu sẵ@ c được xác định."

Hình học:

 DONUT, SQUARE…X là các biến được gán cho các chuỗi đại diện cho cáchình dạng Chúng được sử dụng để đại diện cho mỗi loại hình dạng hoặc biểutượng trong game

 Điều kiện: Số màu x số hình dạng x2 >= tổng số ô (Nếu điều kiện này khôngđúng, tức là số lượng hình dạng và màu sắc không đủ để tạo ra các cặp cho tất

cả các ô trong bảng)

pygame init ()

FPSCLOCK pygame time Clock ()

DISPLAYSURF = pygame display set_mode (( CR , WINDOWHEIGHT ))

Trang 12

Icon

Backgroud

4.3 Hiển thị menu chính

font pygame font SysFont ( 'sans' , 20 )

text_1 font render ( 'View Game Information' , True , BLACK )

text_2 font render ( 'Start New Game' , True , BLACK )

text_3 font render ( 'Display Game Scores' , True , BLACK )

text_4 font render ( 'Exit Game' , True , BLACK )

pygame draw rect ( DISPLAYSURF , WHITE ,( 400 , 150 , 220 , 50 ))

pygame draw rect ( DISPLAYSURF , WHITE ,( 400 , 250 , 220 , 50 ))

pygame draw rect ( DISPLAYSURF , WHITE ,( 400 , 350 , 220 , 50 ))

pygame draw rect ( DISPLAYSURF , WHITE ,( 400 , 450 , 220 , 50 )) DISPLAYSURF blit ( text_1 ,( 405 , 160 ))

DISPLAYSURF blit ( text_2 ,( 430 , 260 ))

DISPLAYSURF blit ( text_3 ,( 410 , 360 ))

DISPLAYSURF blit ( text_4 ,( 460 , 460 ))

mouse_x , mouse_y pygame mouse get_pos ()

#draw_menu()

for event in pygame event get ():

if event type == pygame QUIT :

Trang 13

Tạo font và văn bản:

 font = pygame.font.SysFont('sans', 20): Tạo một đối tượng font với font chữ'sans' (không có serif) và kích thước 20

 text_1, text_2, text_3, text_4: Tạo các đối tượng văn bản bằng cách sử dụnghàm render() của font đã tạo Các văn bản được tạo là 'View GameInformation', 'Start New Game', 'Display Game Scores', 'Exit Game', và màuchữ là màu đen (BLACK)

Định nghĩa hàm main_menu():

 Hàm này điều khiển việc hiển thị menu chính và xử lý sự kiện

 Trong vòng lặp while, menu chính được hiển thị liên tục trên màn hình

 Các hộp và văn bản của menu được vẽ lên màn hình sử dụng các hàm củaPygame như fill(), blit(), và draw.rect()

 mouse_x, mouse_y = pygame.mouse.get_pos(): Lấy vị trí của con trỏ chuột

 Trong vòng lặp xử lý sự kiện, kiểm tra các sự kiện như QUIT (khi người dùngđóng cửa sổ), và MOUSEBUTTONDOWN (khi người dùng nhấn chuột)

 Nếu người dùng nhấn chuột trái (event.button == 1) và con trỏ chuột nằmtrong phạm vi của một trong các hộp menu, hành động tương ứng sẽ được thựchiện dưới các điều kiện của lệnh if

4.4 Tạo bảng xáo trộn ngẫu nhiên

def getRandomizedBoard ():

icons = []

for color in ALLCOLORS :

for shape in ALLSHAPES :

icons append (( shape , color ))

random shuffle ( icons )

numIconsUsed int ( BOARDWIDTH * BOARDHEIGHT / 2

icons = icons [: numIconsUsed ] *

random shuffle ( icons )

board = []

for x in range ( BOARDWIDTH ):

column []

for in range ( BOARDHEIGHT ):

column append ( icons [ 0 ])

del icons [ ]

board append ( column )

return board

11

Trang 14

Đoạn mã này định nghĩa hàm getRandomizedBoard(), có chức năng tạo ra một bảng trò chơi ngẫu nhiên, với các biểu tượng được sắp xếp một cách ngẫu nhiên trên bảng

 icons = []: Tạo một danh sách trống để chứa các biểu tượng (icons) cho trò chơi

 For color in ALLCOLORS:: Duyệt qua tất cả các màu sắc được định nghĩa trong ALLCOLORS

 For shape in ALLSHAPES:: Duyệt qua tất cả các hình dạng được định nghĩa trong ALLSHAPES

 Icons.append((shape, color)): Thêm cặp hình dạng và màu sắc vào danh sách icons Mỗi cặp biểu tượng đại diện cho một loại thẻ trong trò chơi Memory

 random.shuffle(icons): Xáo trộn danh sách icons để tạo ra một sự phân phối ngẫu nhiên của các biểu tượng

 numIconsUsed = int(BOARDWIDTH * BOARDHEIGHT / 2): Tính số lượng biểu tượng cần sử dụng trên bảng dựa trên kích thước của bảng Vì mỗi biểu tượng cần xuất hiện đôi một, nên chúng ta chỉ cần một nửa số lượng ô trên bảng

 icons = icons[:numIconsUsed] * 2: Lấy một phần của danh sách icons ban đầu

có độ dài là numIconsUsed, sau đó nhân đôi nó để có tổng cộng 2 lần số lượng biểu tượng cần sử dụng

 random.shuffle(icons): Xáo trộn lại danh sách icons một lần nữa để tạo ra một trạng thái ngẫu nhiên cuối cùng cho các biểu tượng trước khi chúng được đặt lên bảng

 Tiếp theo, đoạn mã tạo ra một bảng (board) với kích thước là BOARDWIDTH

x BOARDHEIGHT Mỗi ô trên bảng được điền với một cặp hình dạng và màu sắc từ danh sách icons, và sau đó loại bỏ cặp này khỏi danh sách để không sử dụng lại Cuối cùng, hàm trả về bảng đã được tạo

def splitIntoGroupsOf ( groupSize , theList ):

result []

for i in range ( , len ( theList ), groupSize ):

result append ( theList [ i i + groupSize ])

return result

 Được sử dụng để chia một danh sách thành các nhóm có kích thước groupSize

 Khởi tạo một danh sách trống để lưu trữ các nhóm

 Duyệt qua danh sách theList với bước là groupSize Điều này có nghĩa là mỗi lầnduyệt, i sẽ tăng lên groupSize đơn vị, bắt đầu từ 0 và kết thúc ở len(theList) - 1

 Thêm một nhóm vào danh sách result Nhóm này bao gồm các phần tử của theList

từ chỉ số i đến i + groupSize Điều này tạo ra các nhóm có kích thước là groupSize

 Trả về danh sách result, chứa tất cả các nhóm đã được tạo ra

12

Trang 15

4.5 Tổ hợp hình thành các icon của ô

def leftTopCoordsOfBox ( boxx , boxy ):

left boxx * ( HOP KC ) + XMARGIN

top = boxy ( HOP + KC ) + YMARGIN

return ( left , top )

Tính toán và trả về tọa độ của ô

 Đoạn mã này định nghĩa một hàm có tên là leftTopCoordsOfBox, nhận hai tham

số đầu vào:

1/ boxx: Đây là chỉ số của ô theo chiều ngang (hoành độ)

2/ boxy: Đây là chỉ số của ô theo chiều dọc (tung độ)

 Hàm này thực hiện như sau:

- Tính toán vị trí bên trái của ô dựa trên chỉ số ngang (boxx) Đoạn mãleft = boxx * (BOXSIZE + GAPSIZE) + XMARGIN thực hiện tínhtoán bằng cách nhân chỉ số boxx với tổng của kích thước ô (BOXSIZE)cộng với kích thước khoảng cách giữa các ô (GAPSIZE), và sau đócộng với giá trị lề ngang (XMARGIN) Điều này xác định vị trí bên tráicủa ô trong hệ tọa độ toàn cục

- Tính toán vị trí đỉnh của ô dựa trên chỉ số dọc (boxy) Đoạn mã top =boxy * (BOXSIZE + GAPSIZE) + YMARGIN thực hiện tính toántương tự như trên, nhưng với chỉ số boxy và giá trị lề dọc(YMARGIN) Điều này xác định vị trí đỉnh của ô trong hệ tọa độ toàncục Cuối cùng, hàm trả về một bộ giá trị (left, top) đại diện cho vị tríbên trái và đỉnh của ô trong hệ tọa độ toàn cục

def getShapeAndColor ( board , boxx , boxy ):

return board [ boxx ][ boxy ][ 0 ], board [ boxx ][ boxy ][ 1 ]

Thông tin về hình dạng và màu sắc:

 Hàm này nhận vào ba tham số board, boxx, và boxy

 boar là bảng chứa các icons của trò chơi Memory

 boxx và boxy là chỉ số của ô trên bảng

 Hàm này trả về hình dạng và màu sắc của ô được chỉ định bởi boxx và boxy trên bảng

Để làm điều này, nó truy cập vào giá trị tương ứng trong board dựa trên chỉ số boxx vàboxy và trả về hình dạng (index 0) và màu sắc (index 1) của ô đó

def drawIcon ( shape , color , boxx , boxy ):

13

Trang 16

quarter = int ( BOXSIZE * 0.25 )

half int ( BOXSIZE 0.5 )

left , top = leftTopCoordsOfBox ( boxx , boxy )

elif shape == SQUARE :

pygame draw rect ( DISPLAYSURF , color , ( left quarter , top +

quarter , BOXSIZE half , BOXSIZE half ))

elif shape == DIAMOND :

pygame draw polygon ( DISPLAYSURF , color , (

( left half , top ), ( left + BOXSIZE - 1 , top half ), ( left

+ half , top + BOXSIZE - 1 ), ( left , top half )))

elif shape == LINES :

for in range ( 0 , BOXSIZE , 4 ):

pygame draw line ( DISPLAYSURF , color , ( left , top + i ), ( left

+ i , top ))

pygame draw line ( DISPLAYSURF , color , ( left , top +

BOXSIZE - 1 ), ( left + BOXSIZE - 1 , top ))

elif shape == OVAL :

pygame draw ellipse ( DISPLAYSURF , color , ( left , top quarter ,

BOXSIZE , half ))

elif shape == X :

pygame draw line ( DISPLAYSURF , color , ( left , top ), ( left +

BOXSIZE , top BOXSIZE ), 5 )

pygame draw line ( DISPLAYSURF , color , ( left , top + BOXSIZE ), ( left + BOXSIZE , top ), 5 )

elif shape == HEART :

pygame draw polygon ( DISPLAYSURF , color , (

( left BOXSIZE // 4 , top BOXSIZE // 4 ), # Điể9 m dưới bển trái

( left BOXSIZE // 2 , top BOXSIZE // 4 ), # Điể9 m trển

( left BOXSIZE * // 4 , top BOXSIZE // 4 ) # Điể9 m

))

pygame draw circle ( DISPLAYSURF , color , ( left BOXSIZE // 4 ,

top + BOXSIZE // ), BOXSIZE // 4 )

pygame draw circle ( DISPLAYSURF , color , ( left BOXSIZE //

4 , top BOXSIZE // 4 ), BOXSIZE // )

elif shape == STAR :

vertices [( left + BOXSIZE // , top ), # Đỉ 9nh trển

( left BOXSIZE // 4 , top BOXSIZE // 4 ), # Đỉ 9nh

Trang 17

( left BOXSIZE // 2 , top BOXSIZE ), # Đỉ 9nh dưới

( left BOXSIZE // 4 , top BOXSIZE // 4 ), # Đỉ 9nh trái dưới

( left , top + BOXSIZE // ), # Đỉ 9nh trái

( left BOXSIZE // 4 , top BOXSIZE // 4 )] # Đỉ 9nh trái trển

pygame draw polygon ( DISPLAYSURF , color , vertices )

elif shape == TRAPEZOID :

vertices [( left + BOXSIZE * 0.25 , top ),

pygame draw polygon ( DISPLAYSURF , color , vertices )

elif shape == CONG :

pygame draw rect ( DISPLAYSURF , color , ( left BOXSIZE // 4 , top ,

BOXSIZE // , BOXSIZE ))

pygame draw rect ( DISPLAYSURF , color , ( left , top + BOXSIZE // ,

BOXSIZE , BOXSIZE // 2 ))

Tính toán kích thước phần tư và một nửa của ô:

 quarter và half lần lượt đại diện cho một phần tư và một nửa kích thước của ô Điềunày giúp tính toán vị trí và kích thước của các hình dạng trong ô một cách dễ dàng

Tính toán vị trí bên trái và đỉnh của ô:

 Hàm leftTopCoordsOfBox được gọi để tính toán vị trí bên trái và đỉnh của ô dựa trên chỉ số boxx và boxy

Vẽ hình dạng tương ứng với giá trị shape:

 Nếu shape là DONUT, vẽ một hình tròn và một hình tròn rỗng trong ô

 pygame.draw.circle được sử dụng để vẽ hình tròn

 DISPLAYSURF là màn hình pygame, color là màu sắc của hình tròn

 (left + half, top + half) là tọa độ của tâm của hình tròn, half - 5 là bán kính

 BGCOLOR là màu nền, được sử dụng để vẽ hình tròn rỗng bên trong hình tròn đầu tiên

Tương tự, các điều kiện còn lại trong các phần if-elif làm tương tự, vẽ các hình dạng khác nhau tùy thuộc vào giá trị của shape:

15

Ngày đăng: 22/04/2024, 10:52

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w