Làm cách nào để tạo Sudoku bằng Python?

Hãy xây dựng một bộ giải sudoku bằng Python ngay hôm nay. Sudoku Puzzle là một câu đố rất phổ biến xuất hiện trên các tờ báo hàng ngày thu hút sự quan tâm của rất nhiều người. Có rất nhiều bài toán khó, chưa có lời giải về câu đố sudoku và cách khái quát hóa của chúng khiến câu đố này trở nên thú vị, đặc biệt đối với nhiều người yêu thích toán học


Câu đố Sudoku là gì?

Trong câu đố Sudoku, chúng ta cần điền vào mỗi ô trống một số nguyên từ 1 đến 9 sao cho mỗi số từ 1 đến 9 xuất hiện một lần ở mỗi hàng, mỗi cột và mỗi ô nhỏ trong 3 nhân 3

Độ khó của câu đố này có thể thay đổi. Mức độ khó của các câu đố Sudoku càng cao, vấn đề nghiên cứu càng trở nên thách thức hơn đối với các nhà khoa học máy tính. Các câu đố khó hầu hết có ít biểu tượng quy định hơn

Các câu đố Sudoku được xuất bản để giải trí có các giải pháp độc đáo. Một câu đố Sudoku được cho là đúng nếu nó có một giải pháp duy nhất. Một vấn đề nghiên cứu đầy thách thức khác là xác định cần điền bao nhiêu ô để câu đố Sudoku được hình thành tốt. Sudoku được hình thành tốt với 17 biểu tượng tồn tại. Không biết liệu có tồn tại một câu đố được hình thành tốt chỉ với 16 manh mối hay không. Càng ít manh mối, cơ hội có nhiều giải pháp càng cao


Các bước để giải Câu đố Sudoku bằng Python

  • Trong phương pháp giải câu đố sudoku này, đầu tiên, chúng ta gán kích thước của ma trận 2D cho một biến M (M*M)
  • Sau đó, chúng tôi gán chức năng tiện ích (câu đố) để in lưới
  • Sau đó, nó sẽ gán num cho hàng và col
  • Nếu chúng tôi tìm thấy cùng một số trong cùng một hàng hoặc cùng một cột hoặc trong ma trận 3*3 cụ thể, 'false' sẽ được trả về
  • Sau đó, chúng tôi sẽ kiểm tra xem chúng tôi đã đến hàng thứ 8 và cột thứ 9 chưa và trả về giá trị true để dừng quay lui thêm
  • Tiếp theo chúng ta sẽ kiểm tra nếu giá trị cột trở thành 9 thì chúng ta chuyển sang hàng và cột tiếp theo
  • Hơn nữa, bây giờ chúng ta xem vị trí hiện tại của lưới có giá trị lớn hơn 0 hay không, sau đó chúng ta lặp lại cho cột tiếp theo
  • Sau khi kiểm tra xem có an toàn hay không, chúng ta chuyển sang cột tiếp theo rồi gán số ở vị trí (hàng, cột) hiện tại của lưới. Sau đó, chúng tôi kiểm tra khả năng tiếp theo với cột tiếp theo
  • Vì giả định của chúng tôi là sai, chúng tôi loại bỏ số được chỉ định và sau đó chúng tôi chuyển sang giả định tiếp theo với một giá trị số khác

Triển khai Trình giải Sudoku trong Python

Chúng tôi sẽ sử dụng phương pháp quay lui để tạo trình giải sudoku của chúng tôi trong Python. Quay lui có nghĩa là quay lại bước trước đó ngay khi chúng tôi xác định rằng giải pháp hiện tại của chúng tôi không thể tiếp tục thành một giải pháp hoàn chỉnh. Chúng tôi sử dụng nguyên tắc quay lui này để thực hiện thuật toán sudoku. Nó còn được gọi là cách thuật toán brute force để giải câu đố sudoku

M = 9
def puzzle(a):
	for i in range(M):
		for j in range(M):
			print(a[i][j],end = " ")
		print()
def solve(grid, row, col, num):
	for x in range(9):
		if grid[row][x] == num:
			return False
		    
	for x in range(9):
		if grid[x][col] == num:
			return False


	startRow = row - row % 3
	startCol = col - col % 3
	for i in range(3):
		for j in range(3):
			if grid[i + startRow][j + startCol] == num:
				return False
	return True

def Suduko(grid, row, col):

	if (row == M - 1 and col == M):
		return True
	if col == M:
		row += 1
		col = 0
	if grid[row][col] > 0:
		return Suduko(grid, row, col + 1)
	for num in range(1, M + 1, 1): 
	
		if solve(grid, row, col, num):
		
			grid[row][col] = num
			if Suduko(grid, row, col + 1):
				return True
		grid[row][col] = 0
	return False

'''0 means the cells where no value is assigned'''
grid = [[2, 5, 0, 0, 3, 0, 9, 0, 1],
        [0, 1, 0, 0, 0, 4, 0, 0, 0],
	[4, 0, 7, 0, 0, 0, 2, 0, 8],
	[0, 0, 5, 2, 0, 0, 0, 0, 0],
	[0, 0, 0, 0, 9, 8, 1, 0, 0],
	[0, 4, 0, 0, 0, 3, 0, 0, 0],
	[0, 0, 0, 3, 6, 0, 0, 7, 2],
	[0, 7, 0, 0, 0, 0, 0, 0, 3],
	[9, 0, 3, 0, 0, 0, 6, 0, 4]]

if (Suduko(grid, 0, 0)):
	puzzle(grid)
else:
	print("Solution does not exist:(")

đầu ra

====================== RESTART: C:/Users/SIDDHI/sudoku.py ===========
2 5 8 7 3 6 9 4 1 
6 1 9 8 2 4 3 5 7 
4 3 7 9 1 5 2 6 8 
3 9 5 2 7 1 4 8 6 
7 6 2 4 9 8 1 3 5 
8 4 1 6 5 3 7 2 9 
1 8 4 3 6 9 5 7 2 
5 7 6 1 4 2 8 9 3 
9 2 3 5 8 7 6 1 4 

Phần kết luận

Đó là tất cả để xây dựng bộ giải sudoku trong Python. Tôi hy vọng bạn đã vui vẻ khi đọc qua bài viết và tìm hiểu cách chúng tôi triển khai mã

Psst… cũng có một cách dễ dàng hơn để xây dựng bộ giải sudoku trong Python

Bạn có thể nhập sudoku py-sudoku. Mô-đun PyPI từ https. //pypi. tổ chức/dự án/py-sudoku/. Đây là một chương trình Python đơn giản tạo và giải các câu đố Sudoku m x n

Blog này sẽ xem xét cách tạo một trò chơi gọi là sudoku trong python. Bài đăng này không phải là tất cả và cuối cùng của trò chơi sudoku nhưng nó sẽ là điểm khởi đầu tốt cho bất kỳ ai đang tìm kiếm một dự án mới để xây dựng và bạn cũng có thể sử dụng nó trong sơ yếu lý lịch của mình. Bạn cũng có thể sử dụng trò chơi Sudoku trong mã nguồn Python để cập nhật và tạo trò chơi cho 10×10, 12×12, v.v.

Chúng tôi sẽ xây dựng một trò chơi sudoku bằng Python và PyGame. Nó sẽ có một GUI cơ bản sẽ tải các câu đố được tải sẵn từ API, sau đó người dùng có thể điền vào các hàng và cột bằng cách nhấn vào các khối.

nội dung

Trò chơi sudoku là gì?

Sudoku là một trò chơi dựa trên logic và mục tiêu là điền các số vào lưới 9×9. Mỗi hàng phải chứa các số từ 1 đến 9. Và mỗi cột và ô con của lưới phải chứa số lần xuất hiện của số 1 bằng số lần xuất hiện của số 9

Những điều chúng ta cần làm để xây dựng sudoku trong Python

  1. Cài đặt thư viện pygame
  2. Tạo khung cửa sổ cho game
  3. Thêm lưới 9×9 cho các số
  4. Đặt số lượng bắt đầu của lưới trò chơi bằng API
  5. Chúng tôi sẽ thêm chức năng nhập liệu được sử dụng để nhập các chữ số vào khoảng trống

Trước khi bắt đầu lập trình, hãy cài đặt một thư viện có tên là Pygame cho Python. Sử dụng Terminal / Command Prompt của bạn, nhập lệnh sau Lệnh này sẽ tải xuống và cài đặt mô-đun Pygame mà chúng tôi sẽ sử dụng trong suốt dự án của mình

pip3 install pygame

Lệnh này sẽ hoạt động trong tất cả các hệ điều hành (Windows, Linux và Mac)

Bây giờ hãy bắt đầu lập trình

# importing the pygame
import pygame
# importing request library
import requests

# setting up the width and the background color of the window
WIDTH = 550
background_color = (38, 38, 38)
original_grid_element_color = (255, 255, 255)
buffer = 5

Trong phần mã này, chúng tôi đã nhập thư viện pygame, thư viện yêu cầu (thư viện yêu cầu được sử dụng trong python để nhận và đăng cuộc gọi) và chúng tôi cũng đã xác định kích thước màu nền của khung cửa sổ và màu lưới

#adding API in our sudoku game
response = requests.get("https://sugoku.herokuapp.com/board?difficulty=easy")
grid = response.json()['board']
grid_original = [[grid[x][y] for y in range(len(grid[0]))] for x in range(len(grid))]

Ở đây, trong phần này, chúng tôi sẽ sử dụng API và tìm nạp các số bắt đầu trong lưới và để làm được điều đó, chúng tôi cần API sudoku, lý do là chúng tôi không thể sử dụng bất kỳ số ngẫu nhiên nào mà chúng tôi cần có một bộ số phù hợp cho người dùng .

#adding the functionality that can add the number on user bases
def insert(win, position):
    i,j = position[1], position[0]
    #adding the font and its size
    myfont = pygame.font.SysFont('Comic Sans MS', 35)
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return
            if event.type == pygame.KEYDOWN:
                   
                if(grid_original[i-1][j-1] != 0):
                    return
                if(event.key == 48): #checking with 0
                    grid[i-1][j-1] = event.key - 48
                    pygame.draw.rect(win, background_color, (position[0]*50 + buffer, position[1]*50+ buffer,50 -2*buffer , 50 - 2*buffer))
                    pygame.display.update()
                    return
                if(0 < event.key - 48 <10):  #We are checking for valid input
                    pygame.draw.rect(win, background_color, (position[0]*50 + buffer, position[1]*50+ buffer,50 -2*buffer , 50 - 2*buffer))
                    value = myfont.render(str(event.key-48), True, (179, 179, 179))
                    win.blit(value, (position[0]*50 +15, position[1]*50))
                    grid[i-1][j-1] = event.key - 48
                    pygame.display.update()
                    return
                return

Trong phần mã này, chúng tôi đã thêm chức năng của trò chơi sudoku.

  • Thêm chức năng người dùng có thể thêm số vào khoảng đen để hoàn thành trò chơi
  • Người dùng sẽ không thể chỉnh sửa số ban đầu được tạo bởi API
  • Người dùng sẽ có thể chỉnh sửa các số do người dùng thêm vì người ta có thể nhận thấy các lỗi đã mắc phải và muốn sửa lỗi đó
  • Người dùng sẽ có thể thêm bất kỳ số nào vào khoảng trống

Và chúng tôi cũng đã thêm kiểu phông chữ và cỡ chữ cho chữ số

#initializing pygame
def main():   
    pygame.init()
    win = pygame.display.set_mode((WIDTH, WIDTH)) # creating the window
    pygame.display.set_caption("Sudoku")#giving caption
    win.fill(background_color) # filling the window with background color
    myfont = pygame.font.SysFont('Comic Sans MS', 35)  #adding the font and its size

Trong phần mã này, chúng tôi khởi tạo thư viện pygame và tạo khung cửa sổ, đặt chú thích cho nó và thêm màu nền vào khung cửa sổ.

# creating grid
    for i in range(0,10):
        if(i%3 == 0):
            #drwaing the block line (vertical)
            pygame.draw.line(win, (255, 255, 255), (50 + 50*i, 50), (50 + 50*i ,500 ), 4 )
            #(Horizontal)
            pygame.draw.line(win, (255, 255, 255), (50, 50 + 50*i), (500, 50 + 50*i), 4 )

        #drwaing vertical line
        pygame.draw.line(win, (166, 166, 166), (50 + 50*i, 50), (50 + 50*i ,500 ), 2 )
        #drwaing horizental line
        pygame.draw.line(win, (166, 166, 166), (50, 50 + 50*i), (500, 50 + 50*i), 2 )
    pygame.display.update()
   
    for i in range(0, len(grid[0])):
        for j in range(0, len(grid[0])):
            if(0<grid[i][j]<10):
                value = myfont.render(str(grid[i][j]), True, original_grid_element_color)
                win.blit(value, ((j+1)*50 + 15, (i+1)*50 ))
    pygame.display.update()

Trong phần này, chúng tôi đã thêm lưới 9×9 xác định độ dày của đường kẻ kích thước và cũng thêm các đường kẻ đậm cho các khối sudoku

________số 8_______

Và cuối cùng, chúng tôi thêm chức năng nếu chúng tôi nhấn phím thoát thì cửa sổ pygame sẽ đóng lại.  

đầu ra

Làm cách nào để tạo Sudoku bằng Python?

Sau khi bạn đã hoàn thành tất cả các bước cần thiết để xây dựng trò chơi Sudoku của mình, trò chơi này sẽ trông giống như hình trên và sẽ có mọi tính năng mà chúng tôi đã thêm vào trong quá trình này. Người dùng không thể chỉnh sửa các chữ số ban đầu được đặt vào vị trí của họ. Người dùng có thể nhập một số mới vào khoảng trống bằng cách nhấp vào khoảng trống và nhấn bất kỳ chữ số nào từ 0 – 9 trên bàn phím của họ. Người dùng chỉ có thể chỉnh sửa chữ số do chính họ thêm vào.

Từ cuối cùng

Sudoku, trò chơi một người chơi hoặc câu đố. Nó bắt đầu với một lưới 9×9 bao gồm các ô, một số trống và những ô khác đã có số từ 1 đến 9. 81 ô có thể được chia thành chín ô 3×3. Khi mỗi ô, cột và hàng chứa chính xác số như trước, câu đố đã hoàn thành. Chúng tôi đã chia sẻ Trò chơi Sudoku hoàn chỉnh bằng Mã nguồn Python mà bạn có thể sử dụng trong các dự án của mình

Và trong bài viết này, chúng tôi đã giải thích cách bạn có thể tạo trò chơi đó. Chúng tôi đã trình bày mọi thứ bạn cần biết về cách tạo trò chơi sudoku trong python. Chúng tôi đã xem qua logic cơ bản của trò chơi và cách bắt đầu và cũng đã xem qua một số cách khác nhau để bắt đầu. Từ cài đặt đến sáng tạo thực tế. Không cần phải nói, giờ đây bạn đã có các kỹ năng để tạo trò chơi sudoku của riêng mình bằng Python. Mặc dù luôn có nhiều điều để học nhưng thật tuyệt khi hiểu sâu hơn về những gì tạo ra một số trò chơi thú vị. Chúng tôi hy vọng bạn thích hướng dẫn này, nếu bạn có bất kỳ câu hỏi hoặc đề xuất nào, vui lòng để lại nhận xét bên dưới. Cảm ơn bạn rất nhiều cho việc đọc

Làm thế nào để làm Sudoku?

Sử dụng bút chì và thước kẻ của bạn, vẽ ba đường cách đều nhau trên mỗi hình vuông, sau đó vẽ ba đường cách đều nhau xuống mỗi hình vuông. Xem câu đố Sudoku hiện có nếu bạn cần tham khảo. Theo dõi các đường bút chì bằng bút đánh dấu. Thật dễ dàng để xóa đi bút chì và bạn không muốn bảng của mình bị phai màu

Làm cách nào để tạo Sudoku trong Java?

Bắt đầu với một câu đố đã giải, thêm một số ngẫu nhiên vào tất cả các ô; . Bắt đầu với câu đố đã giải, hoán đổi hàng/cột giữa 1-2-3, 4-5-6, 7-8-9. Gán ngẫu nhiên 9 giá trị cho đường chéo chính sao cho mỗi ô có 3 giá trị khác nhau, sau đó tạo các giá trị còn lại bằng bộ giải

Quy tắc Sudoku là gì?

Luật chơi sudoku rất đơn giản. Một hình vuông 9×9 phải được điền các số từ 1-9 và không lặp lại các số trên mỗi dòng, theo chiều ngang hoặc chiều dọc . Để thử thách bạn nhiều hơn, có các ô vuông 3×3 được đánh dấu trong lưới và mỗi ô vuông này cũng không được có bất kỳ số lặp lại nào.