猜數字游戲:從數學原理到交互體驗的完整設計指南

目錄

  • 猜數字游戲:從數學原理到交互體驗的完整設計指南
    • 引言
    • 第一章 游戲數學原理
      • 1.1 均勻分布與隨機生成
      • 1.2 最優猜測策略
    • 第二章 游戲系統設計
      • 2.1 核心架構
      • 2.2 動態難度系統
    • 第三章 交互設計細節
      • 3.1 輸入驗證系統
      • 3.2 漸進式提示機制
    • 第四章 進階功能設計
      • 4.1 智能輔導系統
      • 4.2 數據驅動平衡
    • 第五章 性能優化
      • 5.1 內存管理策略
      • 5.2 實時反饋優化
    • 第六章 測試與調試
      • 6.1 自動化測試矩陣
      • 6.2 蒙特卡洛測試
    • 結語
    • 附錄:部分代碼

猜數字游戲:從數學原理到交互體驗的完整設計指南

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

引言

猜數字游戲作為編程教學中的"Hello World"級項目,其看似簡單的表象下蘊含著精妙的數學原理和交互設計哲學。本文將深入解析一個專業級猜數字游戲的設計過程,揭示其背后的概率論基礎、算法優化策略以及用戶體驗設計原則。


第一章 游戲數學原理

1.1 均勻分布與隨機生成

游戲核心依賴的隨機數生成遵循離散均勻分布原理:

P ( X = k ) = 1 N , k ∈ [ 1 , N ] P(X=k) = \frac{1}{N},\quad k \in [1,N] P(X=k)=N1?,k[1,N]

其中 N N N表示數字范圍上限。現代編程語言通常采用梅森旋轉算法(Mersenne Twister)生成偽隨機數,其周期長度達 2 19937 ? 1 2^{19937}-1 219937?1,通過以下步驟實現理想隨機性:

  1. 系統時間播種: s e e d = ? t i m e s t a m p × 1 0 3 ? seed = \lfloor timestamp \times 10^3 \rfloor seed=?timestamp×103?
  2. 范圍映射: t a r g e t = ? r a n d ( ) × ( m a x ? m i n ) ? + m i n target = \lfloor rand() \times (max-min) \rfloor + min target=?rand()×(max?min)?+min

1.2 最優猜測策略

采用二分查找算法時,最大猜測次數滿足:

T m a x = ? log ? 2 N ? T_{max} = \lceil \log_2 N \rceil Tmax?=?log2?N?

N = 100 N=100 N=100時,理論最小次數為7次。實際游戲中玩家平均嘗試次數為:

E ( T ) = ∑ k = 1 log ? 2 N 2 k ? 1 N k E(T) = \sum_{k=1}^{\log_2 N} \frac{2^{k-1}}{N}k E(T)=k=1log2?N?N2k?1?k


第二章 游戲系統設計

2.1 核心架構

進行中
勝利
失敗
游戲引擎
隨機生成模塊
輸入處理模塊
反饋生成模塊
游戲狀態機
游戲狀態
等待輸入
顯示結果
展示答案

2.2 動態難度系統

通過實時監測玩家表現調整參數:

指標調節策略數學表達式
連續失敗次數縮小數字范圍 N n e w = ? 0.8 N ? N_{new} = \lfloor 0.8N \rfloor Nnew?=?0.8N?
平均響應時間調整倒計時長度 t l i m i t = m a x ( 10 , 30 ? T  ̄ ) t_{limit} = max(10, 30-\overline{T}) tlimit?=max(10,30?T)
歷史勝率動態平衡隨機分布 μ = μ ± σ / 2 \mu = \mu \pm \sigma/2 μ=μ±σ/2

第三章 交互設計細節

3.1 輸入驗證系統

建立多層防護體系:

  1. 類型過濾:正則表達式^[1-9]\d*$
  2. 范圍檢查 i n p u t ∈ [ l a s t L o w , l a s t H i g h ] input \in [lastLow, lastHigh] input[lastLow,lastHigh]
  3. 歷史檢測 i n p u t ? H i s t o r y S e t input \notin HistorySet input/?HistorySet

3.2 漸進式提示機制

根據嘗試次數動態釋放提示:

嘗試次數提示類型觸發條件
1-3范圍指示條每次猜測后更新
4-5質數高亮涉及質數時觸發
≥6數字熱度圖累計數據超過20條

第四章 進階功能設計

4.1 智能輔導系統

采用貝葉斯推理實時分析玩家策略:

P ( S t r a t e g y ∣ A c t i o n s ) = P ( A c t i o n s ∣ S t r a t e g y ) P ( S t r a t e g y ) P ( A c t i o n s ) P(Strategy|Actions) = \frac{P(Actions|Strategy)P(Strategy)}{P(Actions)} P(StrategyActions)=P(Actions)P(ActionsStrategy)P(Strategy)?

系統可識別的典型策略模式包括:

  • 隨機猜測(熵值>3.5)
  • 線性搜索(猜測差值標準差<2)
  • 二分法(符合 μ = 0.5 N \mu=0.5N μ=0.5N分布)

4.2 數據驅動平衡

收集以下指標進行游戲平衡:

metrics = {'attempt_dist': [],    # 嘗試次數分布'time_heatmap': [],    # 時段活躍度'dropoff_point': [],   # 玩家流失節點'pattern_cluster': []  # 策略聚類
}

第五章 性能優化

5.1 內存管理策略

采用環形緩沖區存儲游戲記錄:

B u f f e r S i z e = ? log ? 2 N ? × 2 BufferSize = \lceil \log_2 N \rceil \times 2 BufferSize=?log2?N?×2

實現O(1)時間復雜度的歷史查詢操作。

5.2 實時反饋優化

通過插值算法實現流暢動畫:

x t = x 0 + ( x t a r g e t ? x 0 ) × 1 ? ( 1 ? t ) 4 x_{t} = x_{0} + (x_{target}-x_{0}) \times \sqrt{1-(1-t)^4} xt?=x0?+(xtarget??x0?)×1?(1?t)4 ?

R G B c u r r e n t = l e r p ( R G B s t a r t , R G B e n d , t T ) RGB_{current} = lerp(RGB_{start}, RGB_{end}, \frac{t}{T}) RGBcurrent?=lerp(RGBstart?,RGBend?,Tt?)


第六章 測試與調試

6.1 自動化測試矩陣

構建參數組合測試:

test_cases = [{'range': (1,10), 'strategy': 'random'},{'range': (1,100), 'strategy': 'binary'},{'range': (1,1000), 'strategy': 'linear'}
]

6.2 蒙特卡洛測試

進行10,000次模擬運行驗證穩定性:

S u c c e s s R a t e = ∑ i = 1 1 0 4 I ( w i n i ) 1 0 4 SuccessRate = \frac{\sum_{i=1}^{10^4} I(win_i)}{10^4} SuccessRate=104i=1104?I(wini?)?


結語

通過本文的深度解析,我們揭示了猜數字游戲設計背后復雜的系統工程。從數學公式推導到交互細節打磨,每個環節都體現著軟件工程的基本原則。這種經典游戲的設計方法論,可延伸應用于各類交互系統的開發實踐。

延伸思考

  • 如何將設計原則遷移到其他猜謎類游戲?
  • 在保證公平性的前提下引入社交元素
  • 基于玩家畫像的個性化游戲調整

附錄:部分代碼

import sys
import time
import math
import random
from typing import Dict, Any, List, Optional
from PyQt6.QtWidgets import (QApplication, QMainWindow, QPushButton, QLineEdit, QLabel, QVBoxLayout, QHBoxLayout, QWidget, QSpinBox,QProgressBar, QGroupBox, QGridLayout, QSlider, QMessageBox,QTabWidget, QComboBox, QTextEdit, QRadioButton, QButtonGroup)
from PyQt6.QtCore import Qt, QTimer, pyqtSignal, QThread, QObject
from PyQt6.QtGui import QFont, QColor, QPalette, QIntValidator, QPixmap, QIcon
from game_engine import GameEngine, GameStateManager, GameState
from game_config import GameConfig
from player_analytics import PlayerAnalytics, StrategyType
from advanced_features import InterpolationUtilclass NumberGuessGame(QMainWindow):"""猜數字游戲GUI主窗口"""def __init__(self):super().__init__()# 設置窗口屬性self.setWindowTitle("猜數字游戲 - 從數學原理到交互體驗")self.setMinimumSize(800, 600)# 初始化游戲配置和引擎self.config = GameConfig()self.engine = GameEngine(self.config)self.analytics = PlayerAnalytics()# 游戲狀態變量self.game_active = Falseself.start_time = 0self.last_guess_time = 0self.timer = QTimer(self)self.timer.timeout.connect(self.update_game_timer)# 搭建界面self.setup_ui()# 連接信號和槽self.connect_signals()# 準備新游戲self.prepare_new_game()def setup_ui(self):"""設置用戶界面"""# 創建中央窗口部件central_widget = QWidget()self.setCentralWidget(central_widget)# 主布局main_layout = QVBoxLayout(central_widget)# 標題title_label = QLabel("猜數字游戲")title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)title_label.setFont(QFont("Arial", 20, QFont.Weight.Bold))main_layout.addWidget(title_label)# 設置選項組settings_group = QGroupBox("游戲設置")settings_layout = QHBoxLayout()# 最小值設置min_layout = QVBoxLayout()min_label = QLabel("最小值:")self.min_spinbox = QSpinBox()self.min_spinbox.setRange(1, 999)self.min_spinbox.setValue(1)min_layout.addWidget(min_label)min_layout.addWidget(self.min_spinbox)settings_layout.addLayout(min_layout)# 最大值設置max_layout = QVBoxLayout()max_label = QLabel("最大值:")self.max_spinbox = QSpinBox()self.max_spinbox.setRange(10, 1000)self.max_spinbox.setValue(100)max_layout.addWidget(max_label)max_layout.addWidget(self.max_spinbox)settings_layout.addLayout(max_layout)# 嘗試次數設置attempts_layout = QVBoxLayout()attempts_label = QLabel("最大嘗試次數:")self.attempts_spinbox = QSpinBox()self.attempts_spinbox.setRange(3, 20)self.attempts_spinbox.setValue(7)self.attempts_spinbox.setSpecialValueText("自動")  # 表示自動計算最優嘗試次數attempts_layout.addWidget(attempts_label)attempts_layout.addWidget(self.attempts_spinbox)settings_layout.addLayout(attempts_layout)# 難度設置difficulty_layout = QVBoxLayout()difficulty_label = QLabel("難度:")self.difficulty_combo = QComboBox()self.difficulty_combo.addItems(["簡單", "中等", "困難", "極難"])self.difficulty_combo.setCurrentIndex(1)  # 默認中等難度difficulty_layout.addWidget(difficulty_label)difficulty_layout.addWidget(self.difficulty_combo)settings_layout.addLayout(difficulty_layout)# 設置選項按鈕options_layout = QVBoxLayout()self.dynamic_difficulty_check = QRadioButton("動態難度")self.dynamic_difficulty_check.setChecked(True)self.fixed_difficulty_check = QRadioButton("固定難度")difficulty_group = QButtonGroup(self)difficulty_group.addButton(self.dynamic_difficulty_check)difficulty_group.addButton(self.fixed_difficulty_check)options_layout.addWidget(self.dynamic_difficulty_check)options_layout.addWidget(self.fixed_difficulty_check)settings_layout.addLayout(options_layout)# 設置組完成settings_group.setLayout(settings_layout)main_layout.addWidget(settings_group)# 游戲狀態區域game_group = QGroupBox("游戲狀態")game_layout = QVBoxLayout()# 當前狀態顯示status_layout = QHBoxLayout()self.status_label = QLabel("準備開始")self.status_label.setFont(QFont("Arial", 12))self.timer_label = QLabel("時間: 0秒")self.attempts_label = QLabel("嘗試: 0/0")status_layout.addWidget(self.status_label)status_layout.addStretch()status_layout.addWidget(self.timer_label)status_layout.addWidget(self.attempts_label)game_layout.addLayout(status_layout)# 范圍指示條range_layout = QVBoxLayout()range_label = QLabel("當前范圍:")self.range_progress = QProgressBar()self.range_progress.setTextVisible(False)self.range_min_label = QLabel("1")self.range_max_label = QLabel("100")range_labels_layout = QHBoxLayout()range_labels_layout.addWidget(self.range_min_label)range_labels_layout.addStretch()range_labels_layout.addWidget(self.range_max_label)range_layout.addWidget(range_label)range_layout.addWidget(self.range_progress)range_layout.addLayout(range_labels_layout)game_layout.addLayout(range_layout)# 輸入區域input_layout = QHBoxLayout()guess_label = QLabel("你的猜測:")self.guess_input = QLineEdit()self.guess_input.setPlaceholderText("輸入一個數字")self.guess_input.setValidator(QIntValidator())self.guess_button = QPushButton("猜測")self.guess_button.setDefault(True)input_layout.addWidget(guess_label)input_layout.addWidget(self.guess_input)input_layout.addWidget(self.guess_button)game_layout.addLayout(input_layout)# 歷史記錄history_layout = QVBoxLayout()history_label = QLabel("猜測歷史:")self.history_text = QTextEdit()self.history_text.setReadOnly(True)self.history_text.setMaximumHeight(150)history_layout.addWidget(history_label)history_layout.addWidget(self.history_text)game_layout.addLayout(history_layout)# 提示區域hint_layout = QVBoxLayout()hint_label = QLabel("提示:")self.hint_text = QLabel("使用二分法策略可以最快猜到正確數字")self.hint_text.setWordWrap(True)self.hint_text.setStyleSheet("color: blue;")self.hotness_bar = QProgressBar()self.hotness_bar.setRange(0, 10)self.hotness_bar.setValue(0)hint_layout.addWidget(hint_label)hint_layout.addWidget(self.hint_text)hint_layout.addWidget(self.hotness_bar)game_layout.addLayout(hint_layout)# 游戲組完成game_group.setLayout(game_layout)main_layout.addWidget(game_group)# 按鈕區域button_layout = QHBoxLayout()self.start_button = QPushButton("開始游戲")self.new_game_button = QPushButton("新游戲")self.statistics_button = QPushButton("查看統計")button_layout.addWidget(self.start_button)button_layout.addWidget(self.new_game_button)button_layout.addWidget(self.statistics_button)main_layout.addLayout(button_layout)# 初始狀態設置self.new_game_button.setEnabled(False)self.guess_button.setEnabled(False)self.guess_input.setEnabled(False)def connect_signals(self):"""連接信號和槽"""self.start_button.clicked.connect(self.start_game)self.new_game_button.clicked.connect(self.prepare_new_game)self.guess_button.clicked.connect(self.process_guess)self.guess_input.returnPressed.connect(self.process_guess)self.statistics_button.clicked.connect(self.show_statistics)self.difficulty_combo.currentIndexChanged.connect(self.update_difficulty)self.min_spinbox.valueChanged.connect(self.update_range)self.max_spinbox.valueChanged.connect(self.update_range)def update_difficulty(self):"""根據難度設置更新游戲參數"""index = self.difficulty_combo.currentIndex()# 根據難度調整參數if index == 0:  # 簡單self.max_spinbox.setValue(50)self.attempts_spinbox.setValue(8)elif index == 1:  # 中等self.max_spinbox.setValue(100)self.attempts_spinbox.setValue(7)elif index == 2:  # 困難self.max_spinbox.setValue(500)self.attempts_spinbox.setValue(9)elif index == 3:  # 極難self.max_spinbox.setValue(1000)self.attempts_spinbox.setValue(10)def update_range(self):"""更新范圍設置"""# 確保最小值比最大值小if self.min_spinbox.value() >= self.max_spinbox.value():self.max_spinbox.setValue(self.min_spinbox.value() + 10)# 更新嘗試次數 (如果是自動模式)if self.attempts_spinbox.value() == 3:  # 特殊值表示自動min_val = self.min_spinbox.value()max_val = self.max_spinbox.value()optimal = math.ceil(math.log2(max_val - min_val + 1))self.attempts_spinbox.setValue(optimal)def prepare_new_game(self):"""準備新游戲"""# 更新UI狀態self.start_button.setEnabled(True)self.new_game_button.setEnabled(False)self.guess_button.setEnabled(False)self.guess_input.setEnabled(False)# 清空游戲記錄self.history_text.clear()self.hint_text.setText("使用二分法策略可以最快猜到正確數字")self.hotness_bar.setValue(0)# 更新狀態self.game_active = Falseself.status_label.setText("準備開始")self.timer_label.setText("時間: 0秒")self.attempts_label.setText("嘗試: 0/0")# 重置范圍條min_val = self.min_spinbox.value()max_val = self.max_spinbox.value()self.range_progress.setRange(min_val, max_val)self.range_progress.setValue(min_val)self.range_progress.setFormat(f"{min_val} - {max_val}")self.range_min_label.setText(str(min_val))self.range_max_label.setText(str(max_val))# 停止計時器self.timer.stop()def start_game(self):"""開始新游戲"""# 更新配置self.config.min_number = self.min_spinbox.value()self.config.max_number = self.max_spinbox.value()self.config.max_attempts = self.attempts_spinbox.value()self.config.enable_dynamic_difficulty = self.dynamic_difficulty_check.isChecked()# 初始化引擎self.engine = GameEngine(self.config)self.engine.start_new_game()# 更新UI狀態self.start_button.setEnabled(False)self.new_game_button.setEnabled(True)self.guess_button.setEnabled(True)self.guess_input.setEnabled(True)self.guess_input.setFocus()# 更新游戲狀態self.game_active = Trueself.status_label.setText("游戲進行中")self.attempts_label.setText(f"嘗試: 0/{self.config.max_attempts}")# 更新范圍min_val = self.config.min_numbermax_val = self.config.max_numberself.range_progress.setRange(min_val, max_val)self.range_progress.setValue(min_val)self.range_min_label.setText(str(min_val))self.range_max_label.setText(str(max_val))# 開始計時self.start_time = time.time()self.last_guess_time = self.start_timeself.timer.start(100)  # 100毫秒更新一次# 清空歷史記錄self.history_text.clear()# 添加初始提示optimal = math.ceil(math.log2(max_val - min_val + 1))self.hint_text.setText(f"理論最優猜測次數: {optimal}。首次猜測建議從中間值 {(min_val + max_val) // 2} 開始。")def process_guess(self):"""處理用戶猜測"""if not self.game_active:return# 獲取輸入try:guess = int(self.guess_input.text())except ValueError:self.show_message("錯誤", "請輸入一個有效的整數!")self.guess_input.clear()return# 驗證猜測validation = self.engine.validate_guess(guess)if not validation['valid']:self.show_message("無效猜測", validation['error'])return# 處理猜測feedback = self.engine.process_guess(guess)# 更新分析系統self.analytics.update_strategy_analysis(guess, self.engine.game_state)# 更新界面self.update_ui_after_guess(feedback)# 清空輸入框self.guess_input.clear()self.guess_input.setFocus()# 檢查游戲是否結束if not self.engine.game_state.is_active():self.end_game()def update_ui_after_guess(self, feedback: Dict[str, Any]):"""猜測后更新UI"""guess = feedback['guess']diff = feedback['diff']attempts = self.engine.game_state.attemptsmax_attempts = self.config.max_attempts# 更新嘗試次數self.attempts_label.setText(f"嘗試: {attempts}/{max_attempts}")# 添加歷史記錄history_entry = f"猜測 {attempts}: {guess} "if diff == 0:history_entry += "? 正確!"history_entry = f"<span style='color:green; font-weight:bold;'>{history_entry}</span>"elif diff > 0:history_entry += "↑ 太小了"history_entry = f"<span style='color:blue;'>{history_entry}</span>"else:history_entry += "↓ 太大了"history_entry = f"<span style='color:red;'>{history_entry}</span>"self.history_text.append(history_entry)# 更新范圍條curr_min = self.engine.game_state.current_mincurr_max = self.engine.game_state.current_maxself.range_min_label.setText(str(curr_min))self.range_max_label.setText(str(curr_max))# 計算動畫self.animate_range_indicator(curr_min, curr_max)# 更新提示self.update_hints(feedback)# 計算熱度self.update_hotness(feedback)def animate_range_indicator(self, min_val: int, max_val: int):"""動畫更新范圍指示條"""self.range_progress.setRange(self.config.min_number, self.config.max_number)full_range = self.config.max_number - self.config.min_numbercurrent_range = max_val - min_val# 計算百分比percent_left = (min_val - self.config.min_number) / full_range * 100percent_right = (max_val - self.config.min_number) / full_range * 100# 設置自定義樣式style = f"""QProgressBar::chunk {{background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0,stop:0 transparent,stop:{percent_left/100} transparent,stop:{percent_left/100} rgba(0, 120, 210, 200),stop:{percent_right/100} rgba(0, 120, 210, 200),stop:{percent_right/100} transparent,stop:1 transparent);}}"""self.range_progress.setStyleSheet(style)self.range_progress.setValue(max_val)  # 只是為了觸發刷新def update_hints(self, feedback: Dict[str, Any]):"""更新提示信息"""attempts = self.engine.game_state.attemptscurr_min = self.engine.game_state.current_mincurr_max = self.engine.game_state.current_max# 范圍提示始終顯示range_hint = f"當前范圍: {curr_min} - {curr_max},共 {curr_max - curr_min + 1} 個可能的數字。"# 根據嘗試次數提供漸進式提示if attempts >= 1 and attempts <= 3:# 基本提示optimal_guess = (curr_min + curr_max) // 2hint = f"{range_hint}<br>二分法建議: 嘗試猜測 {optimal_guess}"elif attempts >= 4 and attempts <= 5:# 質數提示target = self.engine.game_state.target_numberif target in self.engine.primes:hint = f"{range_hint}<br>提示: 目標數字是一個質數"else:# 找到最近的質數closest_primes = sorted([p for p in self.engine.primes if curr_min <= p <= curr_max],key=lambda x: abs(x - target))if closest_primes:closest = closest_primes[0]diff = abs(closest - target)hint = f"{range_hint}<br>提示: 目標數字距離質數 {closest} 相差 {diff}"else:hint = f"{range_hint}<br>提示: 在當前范圍內沒有質數"elif attempts >= 6:# 更詳細的提示target = self.engine.game_state.target_numberlast_guess = feedback['guess']if target % 2 == 0:parity = "偶數"else:parity = "奇數"# 提供數字特性提示if target < 10:size_hint = "個位數"elif target < 100:size_hint = "兩位數"else:size_hint = "三位數或更大"hint = f"{range_hint}<br>提示: 目標是一個{parity}。<br>提示: 目標是{size_hint}。"# 如果還沒猜到,給出更多提示if attempts >= self.config.max_attempts - 1:# 最后的提示digit_sum = sum(int(d) for d in str(target))hint += f"<br>最終提示: 目標數字的各位數字之和是 {digit_sum}。"else:hint = range_hint# 設置提示文本self.hint_text.setText(hint)def update_hotness(self, feedback: Dict[str, Any]):"""更新熱度指示器"""# 只有在嘗試次數足夠時顯示熱度if self.engine.game_state.attempts < 3:self.hotness_bar.setValue(0)returntarget = self.engine.game_state.target_numberlast_guess = feedback['guess']# 計算溫度 (0-10),接近目標溫度越高max_diff = self.config.max_number - self.config.min_numbertemp = 10 - min(10, int(abs(last_guess - target) / max_diff * 100))# 設置熱度條顏色if temp < 3:self.hotness_bar.setStyleSheet("QProgressBar::chunk { background-color: blue; }")elif temp < 7:self.hotness_bar.setStyleSheet("QProgressBar::chunk { background-color: orange; }")else:self.hotness_bar.setStyleSheet("QProgressBar::chunk { background-color: red; }")# 設置值self.hotness_bar.setValue(temp)def update_game_timer(self):"""更新游戲計時器"""if not self.game_active:returnelapsed = time.time() - self.start_timeself.timer_label.setText(f"時間: {int(elapsed)}秒")def end_game(self):"""結束游戲"""self.game_active = Falseself.timer.stop()# 計算總時間total_time = time.time() - self.start_time# 禁用猜測self.guess_button.setEnabled(False)self.guess_input.setEnabled(False)# 更新UIif self.engine.game_state.is_won():self.status_label.setText("游戲勝利!")self.status_label.setStyleSheet("color: green; font-weight: bold;")# 顯示勝利信息target = self.engine.game_state.target_numberattempts = self.engine.game_state.attemptsmessage = f"恭喜你猜對了! 目標數字是 {target}。\n"message += f"你用了 {attempts} 次嘗試,耗時 {total_time:.1f} 秒。\n"# 評價表現optimal = math.ceil(math.log2(self.config.max_number - self.config.min_number + 1))if attempts <= optimal:message += f"太棒了! 你達到了理論最優解 ({optimal} 次)!"elif attempts <= optimal + 2:message += f"表現優秀! 接近最優解 ({optimal} 次)!"else:message += f"還不錯! 最優解應該是 {optimal} 次。"# 檢測策略strategy = self.analytics.detect_strategy()if strategy == StrategyType.BINARY:message += "\n\n你使用了二分法策略,這是最有效的策略!"elif strategy == StrategyType.LINEAR:message += "\n\n你使用了線性搜索策略,試試二分法會更快!"elif strategy == StrategyType.RANDOM:message += "\n\n你的猜測看起來很隨機,有策略會更有效!"else:self.status_label.setText("游戲失敗!")self.status_label.setStyleSheet("color: red; font-weight: bold;")# 顯示失敗信息target = self.engine.game_state.target_numberattempts = self.engine.game_state.attemptsmessage = f"很遺憾,你沒有猜出正確數字。\n"message += f"目標數字是 {target}。\n"message += f"你已經嘗試了 {attempts} 次,達到了最大嘗試次數限制。\n"message += "要不要再來一局,嘗試使用二分法策略?"# 顯示結果對話框QMessageBox.information(self, "游戲結束", message)# 記錄游戲結果game_result = {'target_number': self.engine.game_state.target_number,'attempts': self.engine.game_state.attempts,'history': self.engine.game_state.guess_history,'duration': total_time,'success': self.engine.game_state.is_won(),'strategy': self.analytics.detect_strategy()}self.analytics.record_game(game_result)def show_statistics(self):"""顯示游戲統計數據"""stats = self.analytics.get_statistics()# 構建統計信息if stats['total_games'] == 0:QMessageBox.information(self, "統計", "還沒有游戲記錄!")returnmessage = "===== 游戲統計 =====\n\n"message += f"總游戲次數: {stats['total_games']}\n"message += f"勝率: {stats['win_rate']:.1f}%\n"message += f"平均嘗試次數: {stats['avg_attempts']:.1f}\n"message += f"平均游戲時長: {stats['avg_duration']:.1f}秒\n"message += f"檢測到的主要策略: {stats['main_strategy']}\n\n"# 策略分布message += "策略分布:\n"for strategy, count in stats['strategy_distribution'].items():if count > 0:message += f"- {strategy}: {count} 次\n"QMessageBox.information(self, "游戲統計", message)def show_message(self, title: str, message: str):"""顯示消息對話框"""QMessageBox.information(self, title, message)def main():app = QApplication(sys.argv)game = NumberGuessGame()game.show()sys.exit(app.exec())if __name__ == "__main__":main()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78011.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78011.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78011.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025工業大模型白皮書 | 螞蟻工廠北京航空航天大學聯合出品

由螞蟻工廠與北京航空航天大學聯合發布的《2025工業大模型白皮書》是一部針對工業領域大模型技術發展的前瞻性研究報告。該白皮書系統梳理了工業大模型的技術演進、核心應用場景、關鍵挑戰及未來發展趨勢&#xff0c;旨在為制造業數字化轉型提供理論支撐和實踐指南。作為產學研…

JavaWeb:后端web基礎(TomcatServletHTTP)

一、今日內容 二、Tomcat 介紹與使用 介紹 基本使用 小結 配置 配置 查找進程 三、Servlet 什么是Servlet 快速入門 需求 步驟 1.新建工程-模塊&#xff08;Maven&#xff09; 2.修改打包方式-war 3.編寫代碼 /*** 可以選擇繼承HttpServlet*/ WebServlet("/hello&q…

構建現代分布式云架構的三大支柱:服務化、Service Mesh 與 Serverless

目錄 前言1. 服務化架構模式&#xff1a;構建可擴展的基礎單元1.1 服務化的定義與演進1.2 在分布式云中的價值1.3 面臨的挑戰 2. Service Mesh 架構&#xff1a;服務通信的治理中樞2.1 什么是 Service Mesh&#xff1f;2.2 功能與優勢2.3 在分布式云中的角色2.4 落地難點 3. Se…

嵌入式C語言的運算符與輸入輸出

目錄 1. 運算符 1.1 位運算符 1.1.1 位運算 ~ 1.1.2 位邏輯與 & 1.1.3 位邏輯或 | 1.1.4 位邏輯異或 ^ 1.1.5 位移位運算 1.1.6 將無符號位的某位快速置 1 1.2 三目運算符 1.3 逗號運算符 1.4 運算符優先級 2. 輸出 2.1 字符輸出函數 2.2 格式輸出函數 2.3 字符…

IPD研學:76頁頁基于IPD思想-華為需求管理培訓方案【附全文閱讀】

適應人群 本方案適用于企業中參與產品研發、市場、銷售、項目管理等部門的人員,尤其是負責需求管理工作的相關從業者;致力于提升產品競爭力,對優化需求管理流程、提高產品開發質量感興趣的企業管理者;以及希望了解行業前沿需求管理方法,尋求突破和創新的相關人士。…

米酒的功能和優缺點

米酒&#xff08;又稱甜酒、酒釀&#xff09;是一種以糯米或其他谷物為原料&#xff0c;經發酵制成的傳統發酵飲品&#xff0c;酒精度較低&#xff08;通常1%-10%&#xff09;。以下是其功能、優點及缺點分析&#xff1a; 一、米酒的功能 營養補充 富含B族維生素&#xff08;B1…

注冊登錄頁面項目

關系型數據庫地址&#xff1a;C:\Users\ASUS\AppData\Local\Temp\HuaweiDevEcoStudioDatabases\rdb #注冊頁面register.ets import dataRdb from ohos.data.rdbconst STORE_CONFIG {name: weather4.db } const TABLE_NAME weather_info const SQL_CREATE_TABLE CREATE TAB…

yum源配置文件CentOS-Base.repo完整內容

1.CentOS Yum 源配置文件 CentOS-Base.repo 的完整內容示例&#xff1a; 以下是適用于不同版本 CentOS 系統的 CentOS-Base.repo 文件的標準模板。這些模板基于常見的國內鏡像源&#xff08;如阿里云、清華大學等&#xff09;&#xff0c;可以幫助解決倉庫配置失敗的問題。 適…

深度學習基礎--目標檢測入門簡介

博主簡介&#xff1a;努力學習的22級本科生一枚 &#x1f31f;? 博客主頁&#xff1a;羊小豬~~-CSDN博客 內容簡介&#xff1a;探索AI算法&#xff0c;C&#xff0c;go語言的世界&#xff1b;在迷茫中尋找光芒?&#x1f338;? 往期回顧&#xff1a;yolov5基礎–一步一步教…

雅思寫作--70個高頻表達

文章目錄 1. learn new skills學生通過戶外活動學到很多新技2. take immediate action to do各國采取有效行動以保護環境政府采取了必要行動以減少失業。你應該立即采取行動來解3. communication skills4. grow significantly5. have many advantages1. learn new skills “lea…

深入理解虛擬機與容器:原理、對比與應用場景分析

目錄 前言1 虛擬機技術詳解1.1 虛擬機的基本原理1.2 虛擬機的優勢與局限 2 容器技術詳解2.1 容器的運行機制2.2 容器的優勢與局限 3 虛擬機與容器的核心差異對比3.1 架構對比3.2 啟動速度與資源消耗3.3 安全性與隔離性3.4 兼容性與遷移性 4 實際應用場景分析4.1 適合使用虛擬機…

SQL Server數據庫提權的幾種方法——提權教程

SQL Server數據庫提權的幾種方法——提權教程 一、簡介 在利用系統溢出漏洞沒有效果的情況下,可以采用數據庫進行提權。 數據庫提權的前提條件: 1、服務器開啟數據庫服務 2、獲取到最高權限用戶密碼 (除Access數據庫外,其他數據庫基本都存在數據庫提權的可能) 二、使用x…

【第19節 信息加解密技術】

本章目錄: 一、節概述二、知識詳解1. 信息加密的基本分類2. 對稱加密算法詳解3. 非對稱加密算法詳解4. 密鑰控制技術5. 密鑰分發機制6. 公鑰體系的密鑰管理機制7. 密鑰分類與生成 三、關鍵點提煉四、考試提示五、總結與建議 一、節概述 在信息安全體系中&#xff0c;信息加解密…

記錄搭建自己的應用中心-需求看板搭建

記錄搭建自己的應用中心-需求看板搭建 人員管理新增用戶組織用戶登錄和操作看板狀態看板任務通知任務詳情 人員管理 由于不是所有人都有應用管理權限&#xff0c;所以額外做了一套應用登錄權限&#xff0c;做了一個新的組織人員表&#xff0c;一個登錄賬戶下的所有應用人員共享…

Java從入門到精通 - Java入門

Java 入門 此筆記參考黑馬教程&#xff0c;僅學習使用&#xff0c;如有侵權&#xff0c;聯系必刪 文章目錄 Java 入門01 Java快速入門1. Java 是什么&#xff1f;能干什么&#xff1f;1.1 Java 背景知識1.2 Java 能做什么&#xff1f;1.3 Java 技術體系 2. 如何使用 Java&…

MySQL-排序

介紹 在MySQL中&#xff0c;排序查詢結果可以使用 ORDER BY 子句來實現。這個子句允許你根據一個或多個列進行排序&#xff0c;并且可以選擇升序&#xff08;ASC&#xff09;或者降序&#xff08;DESC&#xff09;的方式。以下是基本的語法結構&#xff1a; SELECT column1, …

當插入排序遇上“凌波微步“——希爾排序的奇幻漂流

文章目錄 一、排序江湖的隱藏高手二、分而治之的魔法1. 核心思想拆解2. 動態演示&#xff08;腦補版&#xff09; 三、C語言實現大揭秘代碼要點解析&#xff1a; 四、性能分析與實戰技巧1. 時間復雜度迷思2. 實測性能對比 五、為什么說它永不過時&#xff1f;六、進階思考題 一…

一種導彈追蹤算法的MATLAB仿真實現

代碼說明&#xff1a; 參數設置&#xff1a;設定時間步長、總模擬時間、初始位置和速度等參數。空氣動力學模型&#xff1a;利用簡化的空氣阻力公式來計算兩個導彈所受的阻力。追蹤算法&#xff1a;采用比例導引算法&#xff0c;讓防空導彈追蹤機動變軌導彈。機動變軌模擬&…

日語學習-日語知識點小記-構建基礎-JLPT-N4階段(13): ておきます ています & てあります

日語學習-日語知識點小記-構建基礎-JLPT-N4階段&#xff08;13&#xff09;&#xff1a; ておきます &ています &#xff06; てあります 。 1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰 2、知識點&#xff08;1&#xff09;&#x…

基于tabula對pdf中多個excel進行識別并轉換成word中的優化(五)

優化地方&#xff1a;處理合并的單元格內容。 1、修改為stream"complex" 2、增加換行符f"{table_data[i - 1][j]}\n{table_data[i][j]}".strip() 一、pdf中excel樣例 二、完整代碼 import tabula import numpy as np from docx import Document from docx…