Pygame - Các bước code Puzzle Memory

04/01/2022   PyGame
Pygame - Các bước code Puzzle Memory
Nội dung bài viết
Bước 1. Bắt đầu xây dựng Game |
Bước 1. Bắt đầu xây dựng Game
#sử dụng thư viện def main(): #chương trình bắt đầu chạy từ đây và gọi hàm main |
Bước 2. Thiết lập các tham số mặc định cho Game
#sử dụng thư viện #chương trình bắt đầu chạy từ đây và gọi hàm main |
Bước 3. Viết hàm main cho Game, khởi tạo Game (biến vẽ, giờ..)
#sử dụng thư viện #hàm chính của chương trình #chương trình bắt đầu chạy từ đây và gọi hàm main |
Bước 4. Tạo dữ liệu ngẫu nhiên bảng các icon cho các hộp, đặt tiết lộ tất cả các hộp bằng False
#sử dụng thư viện #hàm chính của chương trình #revealedBoxes lưu trạng thái true/false để biết hộp này đã tiết lộ chưa #tọa độ chuột lúc clicked #tô màu cho nền #hàm gán cho danh sách 2 chiều revealedBoxes[] mang giá trị val #hàm sinh ngẫu nhiên ra danh sách hai chiều các icon, màu sắc trả lại danh sách 2 chiều # lấy đủ số icon cần sử dụng = BOARDWIDTH * BOARDHEIGHT /2 với (BOARDWIDTH * BOARDHEIGHT là tổng số hình) #lấy phần tử từ 0->numIconsUsed-1 trong list icons và gấp đôi lên để tạo danh sách chứa từng cặp icon # tạo danh sách 2 chiều chứa các icon, màu sắc # xóa icons[0] đi #trả lại danh sách 2 chiều chứa icon, colors
#chương trình bắt đầu chạy từ đây và gọi hàm main |
Bước 5. Tạo hàm trò chơi bắt đầu và Lấy ngẫu nhiên tọa độ các hộp để tiết lộ
#sử dụng thư viện #hàm chính của chương trình #revealedBoxes lưu trạng thái true/false để biết hộp này đã tiết lộ chưa #tọa độ chuột lúc clicked #tô màu cho nền #gọi hàm game start #hàm gán cho danh sách 2 chiều revealedBoxes[] mang giá trị val #hàm sinh ngẫu nhiên ra danh sách hai chiều các icon, màu sắc trả lại danh sách 2 chiều # lấy đủ số icon cần sử dụng = BOARDWIDTH * BOARDHEIGHT /2 với (BOARDWIDTH * BOARDHEIGHT là tổng số hình) #lấy phần tử từ 0->numIconsUsed-1 trong list icons và gấp đôi lên để tạo danh sách chứa từng cặp icon # tạo danh sách 2 chiều chứa các icon, màu sắc # xóa icons[0] đi #trả lại danh sách 2 chiều chứa icon, colors #hàm bắt đầu chơi game #xáo trộn thứ tự các hộp #tách mảng một chiều boxes thành mảng 2 chiều, có khoảng cách nhau 8 bước #tách mảng một chiều theLisst thành mảng 2 chiều kích thước groupSize #chương trình bắt đầu chạy từ đây và gọi hàm main |
Bước 6. Trò chơi bắt đầu, tạo hiệu ứng tiết lộ các hộp lấy ở bước trước, giới thiệu các biến môi trường
#sử dụng thư viện #hàm chính của chương trình #revealedBoxes lưu trạng thái true/false để biết hộp này đã tiết lộ chưa #tọa độ chuột lúc clicked #tô màu cho nền #gọi hàm game start """ #hàm gán cho danh sách 2 chiều revealedBoxes[] mang giá trị val #hàm sinh ngẫu nhiên ra danh sách hai chiều các icon, màu sắc trả lại danh sách 2 chiều # lấy đủ số icon cần sử dụng = BOARDWIDTH * BOARDHEIGHT /2 với (BOARDWIDTH * BOARDHEIGHT là tổng số hình) #lấy phần tử từ 0->numIconsUsed-1 trong list icons và gấp đôi lên để tạo danh sách chứa từng cặp icon # tạo danh sách 2 chiều chứa các icon, màu sắc # xóa icons[0] đi #trả lại danh sách 2 chiều chứa icon, colors #hàm bắt đầu chơi game #xáo trộn thứ tự các hộp #tách mảng một chiều boxes thành mảng 2 chiều, có khoảng cách nhau 8 bước #vẽ khung trò chơi với board và coveredBoxes #từ boxGroups tạo hiệu ứng tiết lộ các box #tách mảng một chiều theLisst thành mảng 2 chiều kích thước groupSize #hàm vẽ khung trò chơi bao gồm các icon, và trạng thái đã tiết lộ hay chưa #chuyển hộp icon thành tọa độ pixcel #vẽ icon với shape,corlor tại vị trí boxx, boxy def getShapeAndColor(board, boxx, boxy):
#lấy icon, màu sắc của hộp tại box(x,y) #vẽ đa gác hình chữ nhật màu trắng để che icon với mức độ coverage #cập nhật lại màn hình
#vẽ hiệu ứng bao phủ hộp với 8 ô trong boxesToCover #chương trình bắt đầu chạy từ đây và gọi hàm main |
# vẽ khung trò chơi với board và coveredBoxes
drawBoard(board, coveredBoxes)
def drawBoard(board, revealed): # Draws all of the boxes in their covered or revealed state. #vẽ từng tọa độ (boxx,boxy) for boxx in range(BOARDWIDTH): for boxy in range(BOARDHEIGHT): #chuyển tọa độ hộp thày tọa độ pixcel left, top = leftTopCoordsOfBox(boxx, boxy) #nếu chưa tiết lộ thì vẽ hình vuông trắng che đi if not revealed[boxx][boxy]: # Draw a covered box. pygame.draw.rect(DISPLAYSURF, BOXCOLOR, (left, top, BOXSIZE, BOXSIZE)) #nếu đã tiết lộ thì vẽ icon else: # Draw the (revealed) icon. #lấy shape, color từ board shape, color = getShapeAndColor(board, boxx, boxy) #vẽ icon với shape, color tại tọa độ, boxx,boxy drawIcon(shape, color, boxx, boxy) |
# vẽ icon với shape,corlor tại vị trí boxx, boxy
def drawIcon(shape, color, boxx, boxy):
def drawIcon(shape, color, boxx, boxy): # lấy thông số để vẽ hình quarter = int(BOXSIZE * 0.25) # syntactic sugar half = int(BOXSIZE * 0.5) # syntactic sugar left, top = leftTopCoordsOfBox(boxx, boxy) # get pixel coords from board coords # Draw the shapes # vẽ hình bánh donut vẽ 2 vòng tròn if shape == DONUT: pygame.draw.circle(DISPLAYSURF, color, (left + half, top + half), half - 5) pygame.draw.circle(DISPLAYSURF, BGCOLOR, (left + half, top + half), quarter - 5) # vẽ hình vuông elif shape == SQUARE: pygame.draw.rect(DISPLAYSURF, color, (left + quarter, top + quarter, BOXSIZE - half, BOXSIZE - half)) # vẽ hình kim cương (hình thoi) elif shape == DIAMOND: pygame.draw.polygon(DISPLAYSURF, color, ( (left + half, top), (left + BOXSIZE - 1, top + half), (left + half, top + BOXSIZE - 1), (left, top + half))) # vẽ hình đường gạch chéo elif shape == LINES: for i in range(0, BOXSIZE, 4): pygame.draw.line(DISPLAYSURF, color, (left, top + i), (left + i, top)) pygame.draw.line(DISPLAYSURF, color, (left + i, top + BOXSIZE - 1), (left + BOXSIZE - 1, top + i)) # vẽ hình elipse (oval) elif shape == OVAL: pygame.draw.ellipse(DISPLAYSURF, color, (left, top + quarter, BOXSIZE, half)) |
# vẽ hiệu ứng tiết lộ hộp với 8 ô trong boxesToReveal
def revealBoxesAnimation(board, boxesToReveal):
def revealBoxesAnimation(board, boxesToReveal): # Do the "box reveal" animation. #dùng for vẽ hộp màu trắng để che box chứa icon lại #coverage mức độ bao phủ #for coverage từ BOXSIZE->-REVEALSPEED - 1, step=-REVEALSPEED #tức là tiết lộ từ từ giảm từ từ khung trắng for coverage in range(BOXSIZE, -REVEALSPEED - 1, -REVEALSPEED): #lấy từ boxesToCover vẽ các khung trắng bao phủ với mức độ coverage drawBoxCovers(board, boxesToReveal, coverage) |
#vẽ hiệu ứng bao phủ hộp với 8 ô trong boxesToCover
def coverBoxesAnimation(board, boxesToCover):
def coverBoxesAnimation(board, boxesToCover): # Do the "box cover" animation. # for coverage từ 0->BOXSIZE + REVEALSPEED,REVEALSPEED # tức là bao phủ từ từ, tăng từ từ khung trắng for coverage in range(0, BOXSIZE + REVEALSPEED, REVEALSPEED): #lấy từ boxesToCover vẽ các khung trắng bao phủ với mức độ coverage drawBoxCovers(board, boxesToCover, coverage) |
# lấy từ boxes vẽ các khung trắng bao phủ với mức độ coverage
def drawBoxCovers(board, boxes, coverage):
def drawBoxCovers(board, boxes, coverage): # vẽ hình chữ nhật màu nền (hình vuông), có tọa độ (trái, trên, BOXSIZE, BOXSIZE) # lấy icon, màu sắc của hộp tại box(x,y) # vẽ đa gác hình chữ nhật màu trắng để che icon với mức độ coverage # cập nhật lại màn hình # điều khiển tốc độ, làm chậm lại theo FPS, FPS khung hình trên s, FPS càng lơn thì chạy càng nhanh |
Bước 7. Vòng lặp trò chơi, bắt sự kiện, khởi tạo chưa click chuột và vẽ lại màn hình
# sử dụng thư viện # tốc độ game chương trình
# revealedBoxes lưu trạng thái true/false để biết hộp này đã tiết lộ chưa # tọa độ chuột lúc clicked # tô màu cho nền # gọi hàm game start """
# Hàm shuffle() giúp sắp xếp các item trong list một cách ngẫu nhiên. # lấy đủ số icon cần sử dụng = BOARDWIDTH * BOARDHEIGHT /2 với (BOARDWIDTH * BOARDHEIGHT là tổng số hình) # lấy phần tử từ 0->numIconsUsed-1 trong list icons và gấp đôi lên để tạo danh sách chứa từng cặp icon # Hàm shuffle() giúp sắp xếp các item trong list một cách ngẫu nhiên. # tạo danh sách 2 chiều chứa các icon, màu sắc # xóa icons[0] đi # trả lại danh sách 2 chiều chứa icon, colors
# xáo trộn thứ tự các hộp # tách mảng một chiều boxes thành mảng 2 chiều, có khoảng cách nhau 8 bước # vẽ khung trò chơi với board và coveredBoxes # từ boxGroups tạo hiệu ứng tiết lộ các box
# vẽ hình chữ nhật màu nền (hình vuông), có tọa độ (trái, trên, BOXSIZE, BOXSIZE) # lấy icon, màu sắc của hộp tại box(x,y) # vẽ đa gác hình chữ nhật màu trắng để che icon với mức độ coverage # cập nhật lại màn hình # điều khiển tốc độ, làm chậm lại theo FPS, FPS khung hình trên s, FPS càng lơn thì chạy càng nhanh
# dùng for vẽ hộp màu trắng để che box chứa icon lại
|
Bước 8. Vẽ bảng trò chơi trong vòng lặp trò chơi từ mainBoard,revealedBoxes
# sử dụng thư viện # tốc độ game chương trình
# revealedBoxes lưu trạng thái true/false để biết hộp này đã tiết lộ chưa # tọa độ chuột lúc clicked # tô màu cho nền # gọi hàm game start """ # Redraw the screen and wait a clock tick.
# Hàm shuffle() giúp sắp xếp các item trong list một cách ngẫu nhiên. # lấy đủ số icon cần sử dụng = BOARDWIDTH * BOARDHEIGHT /2 với (BOARDWIDTH * BOARDHEIGHT là tổng số hình) # lấy phần tử từ 0->numIconsUsed-1 trong list icons và gấp đôi lên để tạo danh sách chứa từng cặp icon # Hàm shuffle() giúp sắp xếp các item trong list một cách ngẫu nhiên. # tạo danh sách 2 chiều chứa các icon, màu sắc # xóa icons[0] đi # trả lại danh sách 2 chiều chứa icon, colors
# xáo trộn thứ tự các hộp # tách mảng một chiều boxes thành mảng 2 chiều, có khoảng cách nhau 8 bước # vẽ khung trò chơi với board và coveredBoxes # từ boxGroups tạo hiệu ứng tiết lộ các box
# vẽ hình chữ nhật màu nền (hình vuông), có tọa độ (trái, trên, BOXSIZE, BOXSIZE) # lấy icon, màu sắc của hộp tại box(x,y) # vẽ đa gác hình chữ nhật màu trắng để che icon với mức độ coverage # cập nhật lại màn hình # điều khiển tốc độ, làm chậm lại theo FPS, FPS khung hình trên s, FPS càng lơn thì chạy càng nhanh
# dùng for vẽ hộp màu trắng để che box chứa icon lại
|
Bước 9. Bắt các sự kiện trò chơi để thay đổi các biến môi trường của trò chơi
# sử dụng thư viện # tốc độ game chương trình
# revealedBoxes lưu trạng thái true/false để biết hộp này đã tiết lộ chưa # tọa độ chuột lúc clicked # tô màu cho nền # gọi hàm game start """ # Redraw the screen and wait a clock tick.
# Hàm shuffle() giúp sắp xếp các item trong list một cách ngẫu nhiên. # lấy đủ số icon cần sử dụng = BOARDWIDTH * BOARDHEIGHT /2 với (BOARDWIDTH * BOARDHEIGHT là tổng số hình) # lấy phần tử từ 0->numIconsUsed-1 trong list icons và gấp đôi lên để tạo danh sách chứa từng cặp icon # Hàm shuffle() giúp sắp xếp các item trong list một cách ngẫu nhiên. # tạo danh sách 2 chiều chứa các icon, màu sắc # xóa icons[0] đi # trả lại danh sách 2 chiều chứa icon, colors
# xáo trộn thứ tự các hộp # tách mảng một chiều boxes thành mảng 2 chiều, có khoảng cách nhau 8 bước # vẽ khung trò chơi với board và coveredBoxes # từ boxGroups tạo hiệu ứng tiết lộ các box
# vẽ hình chữ nhật màu nền (hình vuông), có tọa độ (trái, trên, BOXSIZE, BOXSIZE) # lấy icon, màu sắc của hộp tại box(x,y) # vẽ đa gác hình chữ nhật màu trắng để che icon với mức độ coverage # cập nhật lại màn hình # điều khiển tốc độ, làm chậm lại theo FPS, FPS khung hình trên s, FPS càng lơn thì chạy càng nhanh
# dùng for vẽ hộp màu trắng để che box chứa icon lại
|
Bước 10. Xử lý khi di chuyển chuột qua hộp
# sử dụng thư viện # tốc độ game chương trình
# revealedBoxes lưu trạng thái true/false để biết hộp này đã tiết lộ chưa # tọa độ chuột lúc clicked # tô màu cho nền # gọi hàm game start """ #lấy hộp (boxx,boxy) từ tọa độ chuột #nếu co tọa độ hộp #kiểm tra xem nếu hộp chưa tiết lộ thì ta vẽ HightlightBox xung quanh hộp # Redraw the screen and wait a clock tick. #lấy tọa độ hộp từ tọa độ pixcel #vẽ viền sáng khi di chuyern qua hộp
# Hàm shuffle() giúp sắp xếp các item trong list một cách ngẫu nhiên. # lấy đủ số icon cần sử dụng = BOARDWIDTH * BOARDHEIGHT /2 với (BOARDWIDTH * BOARDHEIGHT là tổng số hình) # lấy phần tử từ 0->numIconsUsed-1 trong list icons và gấp đôi lên để tạo danh sách chứa từng cặp icon # Hàm shuffle() giúp sắp xếp các item trong list một cách ngẫu nhiên. # tạo danh sách 2 chiều chứa các icon, màu sắc # xóa icons[0] đi # trả lại danh sách 2 chiều chứa icon, colors
# xáo trộn thứ tự các hộp # tách mảng một chiều boxes thành mảng 2 chiều, có khoảng cách nhau 8 bước # vẽ khung trò chơi với board và coveredBoxes # từ boxGroups tạo hiệu ứng tiết lộ các box
# vẽ hình chữ nhật màu nền (hình vuông), có tọa độ (trái, trên, BOXSIZE, BOXSIZE) # lấy icon, màu sắc của hộp tại box(x,y) # vẽ đa gác hình chữ nhật màu trắng để che icon với mức độ coverage # cập nhật lại màn hình # điều khiển tốc độ, làm chậm lại theo FPS, FPS khung hình trên s, FPS càng lơn thì chạy càng nhanh
# dùng for vẽ hộp màu trắng để che box chứa icon lại
|
Bước 11. Xử lý khi Click chuột vào một hộp chưa tiết lộ
#sử dụng thư viện #hàm chính của chương trình #revealedBoxes lưu trạng thái true/false để biết hộp này đã tiết lộ chưa #tọa độ chuột lúc clicked #tô màu cho nền #gọi hàm game start """ #vòng lặp trò chơi #nếu co tọa độ hộp #kiểm tra xem nếu hộp chưa tiết lộ thì ta vẽ HightlightBox xung quanh hộp #đặt trạng thái tiết lộ tại hộp này là True #nếu đây là lần chọn hộp 1 thì gán tọa độ hộp cho firstSelection #nếu đây là lần cọn hợp thứ 2 tức là đã có chọn hộp 1 rồi #trường hợp 2 hộp giống nhau thì giữ nguyên không cần xử lý gì thêm
#hàm gán cho danh sách 2 chiều revealedBoxes[] mang giá trị val #hàm sinh ngẫu nhiên ra danh sách hai chiều các icon, màu sắc trả lại danh sách 2 chiều # lấy đủ số icon cần sử dụng = BOARDWIDTH * BOARDHEIGHT /2 với (BOARDWIDTH * BOARDHEIGHT là tổng số hình) #lấy phần tử từ 0->numIconsUsed-1 trong list icons và gấp đôi lên để tạo danh sách chứa từng cặp icon # tạo danh sách 2 chiều chứa các icon, màu sắc # xóa icons[0] đi #trả lại danh sách 2 chiều chứa icon, colors #tách mảng một chiều theLisst thành mảng 2 chiều kích thước groupSize #chuyển hộp icon thành tọa độ pixcel #lấy tọa độ hộp từ tọa độ pixcel #vẽ icon với shape,corlor tại vị trí boxx, boxy def getShapeAndColor(board, boxx, boxy):
#lấy icon, màu sắc của hộp tại box(x,y) #vẽ đa gác hình chữ nhật màu trắng để che icon với mức độ coverage #cập nhật lại màn hình
#vẽ hiệu ứng bao phủ hộp với 8 ô trong boxesToCover #hàm vẽ khung trò chơi bao gồm các icon, và trạng thái đã tiết lộ hay chưa def drawHighlightBox(boxx, boxy): #hàm bắt đầu chơi game #xáo trộn thứ tự các hộp #tách mảng một chiều boxes thành mảng 2 chiều, có khoảng cách nhau 8 bước #vẽ khung trò chơi với board và coveredBoxes #từ boxGroups tạo hiệu ứng tiết lộ các box #trường hợp click đúng 2 hộp giống nhau #hàm kiểm tra xem có tất cả các hộp đã được tiết lộ chưa #chương trình bắt đầu chạy từ đây và gọi hàm main |
Bước 12. Xử lý trường hợp 2 hộp chọn khác nhau
#sử dụng thư viện #hàm chính của chương trình #revealedBoxes lưu trạng thái true/false để biết hộp này đã tiết lộ chưa #tọa độ chuột lúc clicked #tô màu cho nền #gọi hàm game start """ #vòng lặp trò chơi #nếu co tọa độ hộp #kiểm tra xem nếu hộp chưa tiết lộ thì ta vẽ HightlightBox xung quanh hộp #đặt trạng thái tiết lộ tại hộp này là True #nếu đây là lần chọn hộp 1 thì gán tọa độ hộp cho firstSelection #nếu đây là lần cọn hợp thứ 2 tức là đã có chọn hộp 1 rồi #trường hợp 2 hộp giống nhau thì giữ nguyên không cần xử lý gì thêm #nếu 2 hộp khác nhau thì xử lý
#hàm gán cho danh sách 2 chiều revealedBoxes[] mang giá trị val #hàm sinh ngẫu nhiên ra danh sách hai chiều các icon, màu sắc trả lại danh sách 2 chiều # lấy đủ số icon cần sử dụng = BOARDWIDTH * BOARDHEIGHT /2 với (BOARDWIDTH * BOARDHEIGHT là tổng số hình) #lấy phần tử từ 0->numIconsUsed-1 trong list icons và gấp đôi lên để tạo danh sách chứa từng cặp icon # tạo danh sách 2 chiều chứa các icon, màu sắc # xóa icons[0] đi #trả lại danh sách 2 chiều chứa icon, colors #tách mảng một chiều theLisst thành mảng 2 chiều kích thước groupSize #chuyển hộp icon thành tọa độ pixcel #lấy tọa độ hộp từ tọa độ pixcel #vẽ icon với shape,corlor tại vị trí boxx, boxy def getShapeAndColor(board, boxx, boxy):
#lấy icon, màu sắc của hộp tại box(x,y) #vẽ đa gác hình chữ nhật màu trắng để che icon với mức độ coverage #cập nhật lại màn hình
#vẽ hiệu ứng bao phủ hộp với 8 ô trong boxesToCover #hàm vẽ khung trò chơi bao gồm các icon, và trạng thái đã tiết lộ hay chưa def drawHighlightBox(boxx, boxy): #hàm bắt đầu chơi game #xáo trộn thứ tự các hộp #tách mảng một chiều boxes thành mảng 2 chiều, có khoảng cách nhau 8 bước #vẽ khung trò chơi với board và coveredBoxes #từ boxGroups tạo hiệu ứng tiết lộ các box #trường hợp click đúng 2 hộp giống nhau #hàm kiểm tra xem có tất cả các hộp đã được tiết lộ chưa #chương trình bắt đầu chạy từ đây và gọi hàm main |
Bước 13: Chiến thắng trò chơi, và cho chơi lại
#sử dụng thư viện #hàm chính của chương trình #revealedBoxes lưu trạng thái true/false để biết hộp này đã tiết lộ chưa #tọa độ chuột lúc clicked #tô màu cho nền #gọi hàm game start """ #vòng lặp trò chơi #nếu co tọa độ hộp #kiểm tra xem nếu hộp chưa tiết lộ thì ta vẽ HightlightBox xung quanh hộp #đặt trạng thái tiết lộ tại hộp này là True #nếu đây là lần chọn hộp 1 thì gán tọa độ hộp cho firstSelection #nếu đây là lần cọn hợp thứ 2 tức là đã có chọn hộp 1 rồi #trường hợp 2 hộp giống nhau thì giữ nguyên không cần xử lý gì thêm #nếu 2 hộp khác nhau thì xử lý #kiểm tra xem tất cả các hộp đã được tiết lộ chưa
#hàm gán cho danh sách 2 chiều revealedBoxes[] mang giá trị val #hàm sinh ngẫu nhiên ra danh sách hai chiều các icon, màu sắc trả lại danh sách 2 chiều # lấy đủ số icon cần sử dụng = BOARDWIDTH * BOARDHEIGHT /2 với (BOARDWIDTH * BOARDHEIGHT là tổng số hình) #lấy phần tử từ 0->numIconsUsed-1 trong list icons và gấp đôi lên để tạo danh sách chứa từng cặp icon # tạo danh sách 2 chiều chứa các icon, màu sắc # xóa icons[0] đi #trả lại danh sách 2 chiều chứa icon, colors #tách mảng một chiều theLisst thành mảng 2 chiều kích thước groupSize #chuyển hộp icon thành tọa độ pixcel #lấy tọa độ hộp từ tọa độ pixcel #vẽ icon với shape,corlor tại vị trí boxx, boxy def getShapeAndColor(board, boxx, boxy):
#lấy icon, màu sắc của hộp tại box(x,y) #vẽ đa gác hình chữ nhật màu trắng để che icon với mức độ coverage #cập nhật lại màn hình
#vẽ hiệu ứng bao phủ hộp với 8 ô trong boxesToCover #hàm vẽ khung trò chơi bao gồm các icon, và trạng thái đã tiết lộ hay chưa def drawHighlightBox(boxx, boxy): #hàm bắt đầu chơi game #xáo trộn thứ tự các hộp #tách mảng một chiều boxes thành mảng 2 chiều, có khoảng cách nhau 8 bước #vẽ khung trò chơi với board và coveredBoxes #từ boxGroups tạo hiệu ứng tiết lộ các box #trường hợp click đúng 2 hộp giống nhau #hàm kiểm tra xem có tất cả các hộp đã được tiết lộ chưa #chương trình bắt đầu chạy từ đây và gọi hàm main |
Cám ơn bạn đã xem bài viết.

