最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python打造視覺精美的數(shù)獨小游戲實戰(zhàn)記錄

 更新時間:2026年05月26日 10:12:10   作者:xcLeigh  
數(shù)獨是一種基于邏輯推理的數(shù)字填充謎題,目標是在9×9網(wǎng)格中填入1–9的數(shù)字,使得每行、每列及每個3×3子宮格內(nèi)均無重復,這篇文章主要介紹了Python打造視覺精美的數(shù)獨小游戲的相關資料,需要的朋友可以參考下

一、前言

Python作為一門簡潔、易讀、功能強大的編程語言,其基礎語法是入門學習的核心。掌握好基礎語法,能為后續(xù)的編程實踐打下堅實的基礎。本文將全面講解Python3的基礎語法知識,適合編程初學者系統(tǒng)學習。Python以其簡潔優(yōu)雅的語法和強大的通用性,成為當今最受歡迎的編程語言。本專欄旨在系統(tǒng)性地帶你從零基礎入門到精通Python核心。無論你是零基礎小白還是希望進階的專業(yè)開發(fā)者,都將通過清晰的講解、豐富的實例和實戰(zhàn)項目,逐步掌握語法基礎、核心數(shù)據(jù)結構、函數(shù)與模塊、面向對象編程、文件處理、主流庫應用(如數(shù)據(jù)分析、Web開發(fā)、自動化)以及面向對象高級特性,最終具備獨立開發(fā)能力和解決復雜問題的思維,高效應對數(shù)據(jù)分析、人工智能、Web應用、自動化腳本等廣泛領域的實際需求。

數(shù)獨是一款經(jīng)典的邏輯推理數(shù)字游戲,通過填充數(shù)字1-9到9x9的網(wǎng)格中,使得每行、每列和每個3x3子網(wǎng)格都包含1-9的所有數(shù)字,不重復。本文將帶大家使用Python的Pygame庫實現(xiàn)一個視覺精美、交互友好的數(shù)獨小游戲。

二、開發(fā)準備

2.1 所需環(huán)境

  • Python 3.6+
  • Pygame庫(用于圖形界面和交互)

2.2安裝依賴

首先確保安裝了Pygame庫,如果沒有安裝,可以使用pip命令安裝:

pip install pygame

三、項目結構設計

我們將項目分為兩個主要文件:

  • main.py:負責游戲界面渲染和用戶交互
  • build.py:負責數(shù)獨謎題的生成和驗證邏輯

這種分離設計使代碼結構更清晰,便于維護和擴展。

四 、核心功能實現(xiàn)

4.1. 數(shù)獨謎題生成與驗證(build.py)

首先實現(xiàn)數(shù)獨的核心邏輯,包括數(shù)獨生成、驗證等功能:

import random

def print_matrix(matrix):
    """打印矩陣,用于調(diào)試"""
    print('—'*19)
    for row in matrix:
        print('|'+' '.join([str(col) for col in row])+'|')
    print('—'*19)

def shuffle_number(_list):
    """隨機打亂列表,用于生成不同的數(shù)獨"""
    random.shuffle(_list)
    return _list

def check(matrix, i, j, number):
    """
    檢查數(shù)字是否可以放置在指定位置
    規(guī)則:行、列、3x3子網(wǎng)格中不能有重復數(shù)字
    """
    # 檢查行
    if number in matrix[i]:
        return False
    # 檢查列
    if number in [row[j] for row in matrix]:
        return False
    # 檢查3x3子網(wǎng)格
    group_i, group_j = int(i/3), int(j/3)
    if number in [matrix[i][j] for i in range(group_i*3, (group_i+1)*3) 
                 for j in range(group_j*3, (group_j+1)*3)]:
        return False
    return True

def build_game(matrix, i, j, number):
    """遞歸構建完整數(shù)獨矩陣"""
    if i > 8 or j > 8:
        return matrix
    if check(matrix, i, j, number):
        # 創(chuàng)建矩陣副本進行修改
        _matrix = [[col for col in row] for row in matrix]
        _matrix[i][j] = number
        # 計算下一個位置
        next_i, next_j = (i+1, 0) if j == 8 else (i, j+1)
        # 嘗試下一個位置的所有可能數(shù)字
        for _number in shuffle_number(number_list):
            __matrix = build_game(_matrix, next_i, next_j, _number)
            # 驗證是否生成了完整有效的數(shù)獨
            if __matrix and sum([sum(row) for row in __matrix]) == (sum(range(1,10)) * 9):
                return __matrix
    return None

def give_me_a_game(blank_size=9):
    """生成帶空白的數(shù)獨游戲"""
    # 生成完整數(shù)獨
    matrix_all = build_game(matrix, 0, 0, random.choice(number_list))
    # 隨機生成要空白的位置
    set_ij = set()
    while len(list(set_ij)) < blank_size:
        set_ij.add(f"{random.choice(range(9))},{random.choice(range(9))}")
    
    # 創(chuàng)建帶空白的數(shù)獨
    matrix_blank = [[col for col in row] for row in matrix_all]
    blank_ij = []
    for ij in list(set_ij):
        i, j = int(ij.split(',')[0]), int(ij.split(',')[1])
        blank_ij.append((i, j))
        matrix_blank[i][j] = 0
    
    return matrix_all, matrix_blank, blank_ij

# 全局變量
number_list = [1,2,3,4,5,6,7,8,9]
matrix = [([0]*9) for i in range(9)]

if __name__ == "__main__":
    # 測試生成數(shù)獨
    print_matrix(build_game(matrix, 0, 0, random.choice(number_list)))

4.2. 游戲界面與交互(main.py)

接下來實現(xiàn)游戲的可視化界面和用戶交互邏輯:

import sys
import pygame
from pygame.color import THECOLORS as COLORS
from build import print_matrix, give_me_a_game, check

def draw_background():
    """繪制游戲背景和網(wǎng)格"""
    # 白色背景
    screen.fill(COLORS['white'])
    
    # 繪制9x9網(wǎng)格,加粗繪制3x3大格子邊界
    # 垂直線
    for i in range(10):
        line_width = 5 if i % 3 == 0 else 2
        pygame.draw.line(screen, COLORS['black'], 
                         (i*100, 0), (i*100, 900), line_width)
    
    # 水平線
    for i in range(10):
        line_width = 5 if i % 3 == 0 else 2
        pygame.draw.line(screen, COLORS['black'], 
                         (0, i*100), (900, i*100), line_width)

def draw_choose():
    """繪制當前選中的單元格高亮框"""
    # 繪制藍色高亮框,留出邊框
    pygame.draw.rect(screen, COLORS['blue'], 
                    (cur_j*100+5, cur_i*100+5, 100-10, 100-10), 0)

def check_win(matrix_all, matrix):
    """檢查是否完成數(shù)獨"""
    return matrix_all == matrix

def check_color(matrix, i, j):
    """檢查數(shù)字是否符合規(guī)則,返回對應的顏色"""
    _matrix = [[col for col in row] for row in matrix]
    _matrix[i][j] = 0  # 臨時清空當前位置以便檢查
    if check(_matrix, i, j, matrix[i][j]):
        return COLORS['green']  # 合法數(shù)字顯示綠色
    return COLORS['red']      # 非法數(shù)字顯示紅色

def draw_number():
    """繪制數(shù)獨中的數(shù)字"""
    for i in range(len(MATRIX)):
        for j in range(len(MATRIX[0])):
            # 空白格子的數(shù)字顏色根據(jù)合法性變化,固定數(shù)字顯示灰色
            _color = check_color(MATRIX, i, j) if (i,j) in BLANK_IJ else COLORS['gray']
            # 渲染數(shù)字,空值不顯示
            txt = font80.render(
                str(MATRIX[i][j] if MATRIX[i][j] not in [0, '0'] else ''), 
                True, _color)
            x, y = j*100 + 30, i*100 + 10  # 居中顯示
            screen.blit(txt, (x, y))

def draw_context():
    """繪制游戲狀態(tài)信息"""
    txt = font100.render(
        f'Blank: {cur_blank_size}   Changes: {cur_change_size}', 
        True, COLORS['black'])
    screen.blit(txt, (10, 900))  # 顯示在底部

if __name__ == "__main__":
    # 初始化pygame
    pygame.init()
    
    # 常量定義
    SIZE = [900, 1000]  # 窗口大小,額外100像素顯示狀態(tài)信息
    font80 = pygame.font.SysFont('Times', 80)   # 數(shù)字字體
    font100 = pygame.font.SysFont('Times', 90)  # 狀態(tài)信息字體
    
    # 創(chuàng)建窗口
    screen = pygame.display.set_mode(SIZE)
    pygame.display.set_caption("數(shù)獨小游戲")  # 設置窗口標題
    
    # 變量初始化
    cur_i, cur_j = 0, 0  # 當前選中的單元格
    cur_blank_size = int(sys.argv[1]) if len(sys.argv) > 1 else 10  # 空白數(shù)量,可通過命令行參數(shù)設置
    cur_change_size = 0  # 已修改次數(shù)
    
    # 生成數(shù)獨游戲
    MATRIX_ANSWER, MATRIX, BLANK_IJ = give_me_a_game(blank_size=cur_blank_size)
    print(BLANK_IJ)
    print_matrix(MATRIX)
    
    # 主游戲循環(huán)
    running = True
    while running:
        # 事件處理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                break
            elif event.type == pygame.MOUSEBUTTONDOWN:
                # 鼠標點擊選擇單元格
                x, y = event.pos
                cur_j, cur_i = int(x / 100), int(y / 100)
                # 確保選擇在有效范圍內(nèi)
                cur_i = max(0, min(8, cur_i))
                cur_j = max(0, min(8, cur_j))
            elif event.type == pygame.KEYUP:
                # 鍵盤輸入數(shù)字
                if chr(event.key) in ['1','2','3','4','5','6','7','8','9'] and (cur_i, cur_j) in BLANK_IJ:
                    MATRIX[cur_i][cur_j] = int(chr(event.key))
                    # 更新空白數(shù)量
                    cur_blank_size = sum(1 for row in MATRIX for col in row if col in [0, '0'])
                    cur_change_size += 1
        
        # 繪制游戲元素
        draw_background()
        draw_choose()
        draw_number()
        draw_context()
        
        # 刷新屏幕
        pygame.display.flip()
        
        # 檢查是否完成
        if check_win(MATRIX_ANSWER, MATRIX):
            print('恭喜你,完成了數(shù)獨挑戰(zhàn)!')
            break
    
    # 退出游戲
    pygame.quit()

運行效果圖:

五 、 功能解析

5.1. 數(shù)獨生成邏輯

  • build_game() 函數(shù)使用遞歸回溯算法生成完整的數(shù)獨矩陣
  • give_me_a_game() 函數(shù)從完整數(shù)獨中隨機挖去指定數(shù)量的數(shù)字作為謎題
  • check() 函數(shù)驗證數(shù)字放置是否符合數(shù)獨規(guī)則

5.2. 游戲界面設計

  • 9x9的網(wǎng)格布局,使用不同粗細的線條區(qū)分3x3子網(wǎng)格
  • 選中的單元格會顯示藍色高亮框
  • 固定數(shù)字顯示為灰色,玩家輸入的數(shù)字根據(jù)合法性顯示綠色(合法)或紅色(非法)
  • 底部狀態(tài)欄顯示剩余空白數(shù)量和已修改次數(shù)

5.3. 用戶交互

  • 鼠標點擊選擇單元格
  • 鍵盤輸入1-9數(shù)字填充選中的空白單元格
  • 自動檢查輸入合法性并通過顏色提示
  • 完成數(shù)獨后自動提示成功

六、游戲玩法

  1. 運行程序,可通過命令行參數(shù)指定空白格數(shù)量(難度):

    python main.py 20  # 生成有20個空白格的數(shù)獨
    
  2. 鼠標點擊要填充的單元格(藍色高亮顯示)

  3. 按鍵盤1-9數(shù)字鍵填入數(shù)字

  4. 綠色數(shù)字表示符合數(shù)獨規(guī)則,紅色數(shù)字表示有沖突

  5. 填滿所有空白且全部正確后,游戲結束并提示成功

七、優(yōu)化建議

  1. 增加難度選擇界面,無需通過命令行參數(shù)設置
  2. 添加計時器功能,記錄完成時間
  3. 增加錯誤次數(shù)限制
  4. 添加提示功能
  5. 優(yōu)化UI,增加更精美的背景和動畫效果
  6. 保存游戲進度功能

八、總結

本項目通過Pygame實現(xiàn)了一個功能完整的數(shù)獨游戲,包含了數(shù)獨生成、規(guī)則驗證、用戶交互等核心功能。代碼結構清晰,注釋完善,便于理解和擴展。

通過這個項目,我們學習了遞歸回溯算法在數(shù)獨生成中的應用,以及如何使用Pygame構建圖形界面和處理用戶交互。希望這個教程能幫助你入門Python游戲開發(fā),也歡迎在此基礎上進行更多創(chuàng)新和改進!

附錄:擴展學習資源

  1. 官方資源

到此這篇關于Python打造視覺精美的數(shù)獨小游戲的文章就介紹到這了,更多相關Python數(shù)獨小游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

邯郸县| 余姚市| 上杭县| 黄石市| 崇仁县| 井陉县| 昌邑市| 海门市| 长治市| 定陶县| 荥经县| 永嘉县| 开阳县| 启东市| 绩溪县| 布尔津县| 丹阳市| 汉寿县| 镇坪县| 阿坝| 佛学| 府谷县| 阿拉尔市| 加查县| 年辖:市辖区| 微博| 酒泉市| 满城县| 怀安县| 衡阳市| 许昌县| 高邮市| 佛冈县| 平度市| 綦江县| 哈巴河县| 万安县| 衡南县| 邵阳县| 定结县| 中西区|