Hàm đánh giá của cờ caro6

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Pick a username Email Address Password

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Các bạn học sinh hẳn đã rất quen thuộc với trò chơi caro truyền thống. Cách chơi trò này rất đơn giản, 2 người chơi đại diện cho 2 quân X và O. Mỗi lượt đi, người chơi lần lượt đánh quân của họ lên bàn cờ. Trò chơi chỉ xác định người thắng bại khi mà có 5 quân cờ của họ cùng nằm liên tiếp trên một hàng ngang hoặc một hàng dọc hoặc một đường chéo.

Trước tiên các bạn hãy chơi thử game nhé! //replit.com/@STEAM4VNOfficial/Caro

  1. Bắt tay vào lập trình thôi nào!
  1. Thuật toán

Chúng ta sẽ chọn một bảng kích cỡ khá lớn để bắt đầu. Ở đây các bạn học sinh hãy chọn bảng 33×64 là dễ nhìn và tiện thao tác nhất.

Bảng ở đây sẽ biểu diễn dưới dạng mảng 2 chiều. Mỗi khi chúng ta click chuột vào một ô để đánh dấu thì sẽ xem lại cả bảng để kiểm tra các điều kiện về đường dọc, đường ngang, đường chéo. Khi đó các bạn sẽ biết được mình có chiến thắng không. Không chỉ vậy, các bạn sẽ dùng vòng lặp để đếm các ô trong mảng 2 chiều, chỉ khi nào mà 5 ô cùng màu được tô liên tiếp theo hàng dọc hoặc hàng ngang hoặc hàng chéo chúng ta sẽ in ra kết quả người chơi chiến thắng.

Nếu có người thắng cuối, trò chơi sẽ in ra kết quả người thắng cuộc và kết thúc trò chơi, còn không, trò chơi vẫn tiếp tục. Nếu trong trường hợp 2 người chơi đã tô hết cả bảng mà vẫn không xác định trò chơi, máy sẽ thông báo kết quả hòa và kết thúc trò chơi.

  1. Các bước triển khai dự án

Bước 1: Khai báo thư viện sử dụng để code trò chơi.

Ở đây ngoài các hàm tiêu chuẩn có sẵn của ngôn ngữ lập trình python ra, ta sẽ sử dụng thêm 2 thư viện đó là pygame và sys. Thư viện pygame là một thư viện python giúp chúng ta có thể code các trò chơi dễ dàng hơn. Còn thư viện sys liên quan đến điều khiển các chương trình trên máy tính. Để khai báo chương trình, ta dùng 2 câu lệnh sau.

import pygame
import sys

Bước 2: Khai báo một số yếu tố cơ bản trong trò chơi

Đầu tiên, chúng ta sẽ định nghĩa một số màu hiển thị trong trò chơi theo bảng mã RGB.

BLACK = [0, 0, 0]
WHITE = [255, 255, 255]
GREEN = [0, 255, 0]
RED = [255, 0, 0]
BLUE = [0,0,255]

Trong bảng mã RGB, mỗi một màu sẽ được biểu diễn bằng 3 phần tử tương ứng cường độ của 3 màu cơ bản: đỏ [Red], xanh lá [Green], xanh dương [Blue]. Hoà trộn 3 màu này lại, chúng ta sẽ được một màu mới.

Ta sẽ giả định con x là con đi trước và khởi tạo FPS – Frames Per Second [độ mượt của game] là 120

XO = 'x'
FPS = 120

Tiếp đó, chúng ta sẽ khởi tạo các kích cỡ bảng và ô caro. Biến WIDTH và HEIGHT chỉ chiều dài và chiều rộng mỗi ô caro là 28×28. Biến MARGIN chỉ độ dày cạnh mỗi ô caro là 2. Biến rownum và colnum lần lượt là số hàng và số cột của bảng caro. Chúng ta có 33 hàng và 64 cột.

# This sets the WIDTH and HEIGHT of each board location

WIDTH = 28
HEIGHT = 28
# This sets the distance between each cell
MARGIN = 2
rownum = 33
colnum = 64

Các bạn học sinh hãy biểu bảng caro dưới dạng mảng 2 chiều với rownum hàng và colnum cột. Đầu tiên khởi tạo grid là một mảng đơn. Sau đó, chúng ta dùng vòng lặp với số lần lặp tương ứng với số hàng [rownum] để khởi tạo mỗi phần tử của grid là một mảng, ứng với một hàng trong bảng caro. Chúng ta tiếp tục sử dụng vòng lặp thứ hai với số lần lặp tương ứng với số cột [colnum]. Chúng ta sử dụng 2 vòng lặp để tạo một mảng hai chiều, giống như bảng caro hoặc mê cung trong bài 6 của khoá CS 101. Giá trị ở mỗi vị trí trong bảng là 0. Vậy là các bạn học sinh đã khởi tạo được bảng caro với kích cỡ rownum * colnum rồi đấy!

# Create a 2 dimensional array. A two dimensional
# array is simply a list of lists.
grid = []
for row in range[rownum]:
    # Add an empty array that will hold each cell
    # in this row
    grid.append[[]]
    for column in range[colnum]:
        grid[row].append[0]  # Append a cell

Giờ thì các bạn phải khởi tạo trò chơi. Muốn chạy một trò chơi thì trước tiên các bạn hãy dùng hàm pygame.init[]. Ngoài ra để game hiển thị chúng ta phải khởi tạo về cửa sổ game: Biến WINDOW_SIZE chứa 2 kích cỡ chiều dài và chiều rộng của màn hình game ở đây sẽ để kích cỡ là 1920 * 990. Khi đó, biến screen chính là màn hình game trong python. Chúng ta sẽ khởi tạo nó bằng cách khai báo screen = pygame.display.set_mode[WINDOW_SIZE]. Vậy chúng ta đã khởi tạo xong cửa sổ game với kích cỡ chúng ta yêu cầu.

# Set the HEIGHT and WIDTH of the screen
WINDOW_SIZE = [1920,990]
screen = pygame.display.set_mode[WINDOW_SIZE]

Về yếu tố hình ảnh, chúng ta có hình ảnh quân X và quân O trên bàn cờ. Ở đây, chúng ta chuẩn bị hình ảnh quân X là file ảnh X_modified-100×100.png và quân O là o_modified-100×100.png. [Các bạn học sinh có thể lấy hình ở link]. Sau đó, ta sẽ đưa hai hình ảnh đó vào trò chơi bằng các câu lệnh sau:

x_img = pygame.transform.smoothscale[pygame.image.load["X_modified-100x100.png"].convert[],[28,28]]
o_img = pygame.transform.smoothscale[pygame.image.load["o_modified-100x100.png"].convert[],[28,28]]

Ở đây, ta có thể thấy hàm pygame.transform.smoothscale chính là hàm giúp chúng ta chuyển đổi các hình ảnh thành các phần tử ta muốn trong game. Còn hàm pygame.image.load[] sẽ đưa hình ảnh vào. Hàm convert[] sẽ giúp ta chuyển hình ảnh thành các ô pixel. Và cuối cùng [28,28] chính là kích cỡ một ô vuông trong bảng caro ta đã nói ở trên.

Bước 3: Viết hàm kiểm tra điều kiện thắng của trò chơi

Làm thế nào để các bạn học sinh có thể biết trò chơi kết thúc và kết quả người chiến thắng?

Như các bạn đã biết, trò chơi chỉ có người chiến thắng khi tồn tại 5 quân cùng loại cùng nằm trên một hàng ngang hoặc một hàng dọc hoặc một đường chéo. Vậy trên một bảng, điều kiện đó sẽ được biểu diễn như thế nào?

Chúng ta gọi ô [i, j] là ô có địa chỉ tại hàng thứ i và cột thứ j. Khi đó, ta giả sử ô [i, j] là ô bắt đầu hàng ngang thì các ô tiếp theo của hàng ngang đó sẽ là [i, j + 1], [i, j + 2], [i, j + 3], [i, j + 4]. Nếu ô đó là ô bắt đầu một hàng dọc thì các ô tiếp theo sẽ là [i + 1,j], [i + 2, j], [i + 3, j], [i + 4, j]. Chúng ta có 2 loại đường chéo. Với loại đường chéo thứ nhất thì các ô tiếp theo sẽ là [i + 1, j – 1], [i + 2, j – 2], [i + 3, j – 3], [i + 4, j – 4]. Còn lại với loại đường chéo thứ 2 thì là [i + 1, j + 1], [i + 2, j + 2], [i + 3, j + 3], [i + 4, j + 4]. Chúng ta đã được học cách để lấy địa chỉ cho một ô trong mảng hai chiều ở bài 6 trong khoá CS 101.

Như vậy để kiểm tra điều kiện thắng thì ta có thể kiểm tra các ô cùng hàng, cùng cột, cùng đường chéo một cách dễ dàng hơn. Ta có hàm kiểm tra như sau:

def checkwin[board]:
    indices = [i for i,x in enumerate[board] if 'x' in x]
    for index in indices:
        xrowindices = [i for i, x in enumerate[board[index]] if x == "x"]
        for xs in xrowindices:
            if xs

Chủ Đề