之前發過用Eclipse 開發 Android 二到九位數的 ?A?B猜數字遊戲,當時的程式碼更新為 Android Studio 版本,弄出如下圖的功能:
而本篇要用 Python + Tkinter 來實作,UI的Layout設計方式如下:
程式實際執行畫面如下:
程式碼:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# ?A?B猜數字遊戲 | |
# 可選擇一到九位數來進行猜數字,數字可重複 | |
from tkinter import Tk, Label, Entry, Spinbox, Button, messagebox, StringVar | |
from random import randint | |
answer = "" | |
playerGuess = "" | |
nOfDigits = 1 | |
''' | |
產生n位數的數字,例如 n = 3 會輸出 100 ~ 999 三位數的數值。 | |
''' | |
def nDigitNumber(n): | |
start = 10**(n-1) | |
end = (10**n)-1 | |
return str( randint(start, end) ) | |
def newGame(): | |
print("newGame") | |
global nOfDigits | |
nOfDigits = int( digitsSpinBox.get() ) | |
global answer | |
answer = nDigitNumber(nOfDigits) | |
print( answer ) | |
def checkUserGuess(): | |
global playerGuess | |
global answer | |
global nOfDigits | |
playerGuess = guessNum.get() | |
if len(playerGuess) == nOfDigits: | |
a = calA(playerGuess) | |
b = calB(playerGuess) | |
showResult(a, b) | |
else: | |
messagebox.showinfo("提醒", "位數要為" + str(nOfDigits) ) | |
def calA(guess): | |
global answer | |
a = 0 | |
for i in range( len(answer) ): | |
if guess[i] == answer[i]: | |
a = a + 1 | |
return a | |
def calB(guess): | |
global answer | |
b = 0 | |
k = len(answer) | |
for i in range(k): | |
for j in range(k): | |
if(i != j): | |
if guess[i] == answer[j]: | |
b = b + 1 | |
return b | |
def showResult(a, b): | |
if a == nOfDigits: | |
result = "You Win" | |
else: | |
result = "結果:" + str(a) + "A" + str(b) + "B" | |
resultLabel.config(text = result) | |
mainWin = Tk() | |
# 視窗標題 | |
mainWin.title("雲林SONG:猜數字") | |
# 視窗大小 | |
mainWin.geometry("300x100") | |
# 建立猜數字的GUI元件 | |
digitsLabel = Label( mainWin, text = "幾位數:" ) | |
guessLabel = Label( mainWin, text = "要猜的數字:" ) | |
resultLabel = Label( mainWin, text = "結果:" ) | |
var = StringVar(mainWin) | |
var.set(str(randint(1, 9))) | |
digitsSpinBox = Spinbox( mainWin, from_ = 1, to_ = 10, textvariable=var, command = newGame ) | |
guessNum = Entry( mainWin ) | |
guessBtn = Button( mainWin, text = "Guess", command = checkUserGuess ) | |
newGameBtn = Button( mainWin, text = "New Game", command = newGame ) | |
# 版面配置 | |
digitsLabel.grid(row=0, column=0) | |
digitsSpinBox.grid(row=0, column=1) | |
guessLabel.grid(row=1, column=0) | |
resultLabel.grid(row=2, column=0) | |
guessNum.grid(row=1, column=1) | |
guessBtn.grid(row=1, column=2) | |
newGameBtn.grid(row=2, column=2) | |
newGame() | |
mainWin.mainloop() |
此版本為數字可重複,那要如何改成數字不重複的版本呢?