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

Nội dung

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 - 31231026834Hoàng Gia Kiệt - 31231024563Cao Nhật Duy - 31231026658

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

Trang 2

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

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

4.3Hiển thị menu chính 8

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

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

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át triể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ọn hoà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ện Pygame để 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ụng thư 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

B NỘI DUNG

1 Đôi nét về game lật thẻ1.1 Game lật thẻ là gì?

Game lật thẻ là một mini game kinh điển và được biết đến rộng rãi trên nhiều nền tảng Trò chơi này xuất hiện từ rất lâu và trở thành một trong những trò chơi điện tử đầu tiên được phát triển và phổ biến Trong game lật bài, người chơi lật những mảnh thẻ để tìm hình ảnh trùng nhau.

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ác phươ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ọc kế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

Start

Thiết lập cấu hình trò chơi

Khởi tạo thư viện Pygame và cấu hình cửa

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 9

 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àm random.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ực hiệ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* (BOXSIZEGAPSIZE))) /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 tra xem có đúng là số lượng ô trong bảng là số chẵn hay không Điều này quan trọng vì trong trò chơi hình memory matching, cần có một số chẵn ô để tạo thà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ảng trò 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ảng trò chơi theo chiều dọc.

 Code trên định nghĩa một số màu sử dụng trong trò chơi hoặc ứng dụng, thông thường được sử dụng để vẽ các đối tượng, ô, hoặc để làm nền Sử dụng bảng mã màu RGB {RGB trong tiếng Anh có nghĩa là đỏ (red), xanh lục (green) và xanh lam (blue), là ba màu gốc trong các mô hình ánh sáng bổ sung}

 BGCOLOR là màu nền của cửa sổ trong trò chơi, trong trường hợp này là màu đen

 LIGHTBGCOLOR là màu nền nhẹ, có thể được sử dụng cho các phần nền nhẹ hơn, trong trường hợp này là màu xám

 BOXCOLOR là màu của các ô trong bảng trò chơi, trong trường hợp này là màu trắng

8

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,

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

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

BOARDHEIGHT, "Ba9ng 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ác hình dạng Chúng được sử dụng để đại diện cho mỗi loại hình dạng hoặc biểu tượ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)

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

Trang 12

Icon

Backgroud

4.3 Hiển thị menu chính

fontpygame.font.SysFont('sans', 20)

text_1font.render('View Game Information', True , BLACK)

text_2font.render('Start New Game', True , BLACK)

text_3font.render('Display Game Scores', True , BLACK)

text_4font.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_ypygame.mouse.get_pos() #draw_menu()

foreventinpygame.event.get(): ifevent.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ụng hàm render() của font đã tạo Các văn bản được tạo là 'View Game Information', 'Start New Game', 'Display Game Scores', 'Exit Game', và màu chữ 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ủa Pygame 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ằm

trong phạm vi của một trong các hộp menu, hành động tương ứng sẽ được thực hiệ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

defgetRandomizedBoard(): icons= []

forcolorinALLCOLORS: forshapeinALLSHAPES:

icons.append((shape, color)) random.shuffle(icons)

numIconsUsedint(BOARDWIDTH*BOARDHEIGHT/2

icons=icons[:numIconsUsed] *

random.shuffle(icons) board= []

forxinrange(BOARDWIDTH): column []

forinrange(BOARDHEIGHT): column.append(icons[0]) delicons[]

board.append(column) returnboard

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ò

 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.

defsplitIntoGroupsOf(groupSize, theList): result []

foriinrange(, len(theList), groupSize): result.append(theList[ii+groupSize]) returnresult

 Đượ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ần duyệ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 ô

defleftTopCoordsOfBox(boxx, boxy): leftboxx* (HOPKC) +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ính toá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ái củ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án tươ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àn cụ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.

defgetShapeAndColor(board, boxx, boxy):

returnboard[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 ô đó

defdrawIcon(shape, color, boxx, boxy):

13

Trang 16

quarter=int(BOXSIZE*0.25) halfint(BOXSIZE0.5)

left, top=leftTopCoordsOfBox(boxx, boxy)

elifshape==SQUARE:

pygame.draw.rect(DISPLAYSURF, color, (leftquarter, top+

quarter, BOXSIZEhalf, BOXSIZEhalf)) elifshape==DIAMOND:

pygame.draw.polygon(DISPLAYSURF, color, (

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

+half, top+BOXSIZE-1), (left, tophalf))) elifshape==LINES:

forinrange(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)) elifshape==OVAL:

pygame.draw.ellipse(DISPLAYSURF, color, (left, topquarter,

BOXSIZE, half))

elifshape==X:

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

BOXSIZE, topBOXSIZE), 5)

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

elifshape==HEART:

pygame.draw.polygon(DISPLAYSURF, color, (

(leftBOXSIZE//4, topBOXSIZE//4), # Điể9m dướibển trái

(leftBOXSIZE//2, topBOXSIZE//4), # Điể9m trển

(leftBOXSIZE*//4, topBOXSIZE//4) # Điể9m

))

pygame.draw.circle(DISPLAYSURF, color, (leftBOXSIZE//4,

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

pygame.draw.circle(DISPLAYSURF, color, (leftBOXSIZE//

4, topBOXSIZE//4), BOXSIZE//) elifshape==STAR:

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

(leftBOXSIZE//4, topBOXSIZE//4), # Đỉ9nh

Trang 17

(leftBOXSIZE//2, topBOXSIZE), # Đỉ9nh

pygame.draw.polygon(DISPLAYSURF, color, vertices) elifshape==TRAPEZOID:

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

pygame.draw.polygon(DISPLAYSURF, color, vertices) elifshape==CONG:

pygame.draw.rect(DISPLAYSURF, color, (leftBOXSIZE//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ều nà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