哈嘍大家好,我是鵬哥。
今天想記錄的是 —— 用python編程24點遊戲。
~~~上課鈴~~~
1
寫在前面
目前還處於武漢新型冠狀病毒肆虐中,爲了響應國家號召,不得別人添亂的原則,不出門,不聚會,不訪友,所以只能在家一直葛優躺,感覺要閒慌(shuang)了。
外加今天又被公司通知要延長假期到2/2,真的是好難(kai)受(xin)呀!
既然如何無聊,那就寫個手機遊戲玩玩吧!以我目前的水平,自然是從最簡單的24點入手了。
2
效果展示
3
知識串講(敲黑板啦)
和之前一樣,這次的24點遊戲也是在iphone上基於pythonista 3 APP編程的。如果對pythonista 3不熟悉的同學,可以參考之前的文章:
【Python成長之路】如何用python開發自己的iphone應用程序,並添加至siri指令
(1)界面設計:
pythonista 3目前不支持pyqt5,因此無法通過QT Designer來快速設計GUI界面。但是Pythonista 3裏有自己的GUI圖形設計,可以通過創建script with UI來完成簡單的界面設計。
目前pythonista 3支持的控件比較少,只有以下幾種:
我這邊只用了Label和Button兩個控件。在界面添加控件後,可以選擇控件進行詳情查看,從而進入控件的參數設置界面(控件座標、控件大小、背景顏色、字體大小/顏色/形式、文本內容等),如下:
針對button控件,我們還要添加對控件點擊後的方法關聯,因此需要設置下控件關聯方法,Result按鈕對應的方法是get_result方法,如:
關於界面設計的功能/設置等功能,就簡單介紹下,自己也是初學,有些高級功能也要研究下才行。
我的界面結果如下:
(2)界面代碼實現
1、label控件初始化定義
label1 = sender.superview['label1']
2、加載pyui文件
在pythonista 3中,通過load_view(xx.pyui)即可加載對應的UI界面,這點使用起來還是蠻方便的。當然我這邊通過get_screen_size()來進行了屏幕判斷,從而根據ipad/iphone進行界面自適應。
v = ui.load_view()
v.present('sheet')
3、24點計算
這段代碼是參考大神的超簡短24點算法:
python 窮舉法 算24點(史上最簡短代碼):https://www.cnblogs.com/hhh5460/p/6926909.html
大致原理也是蠻簡單的,通過permutations方法對輸入的4個數字進行所有排列組合,通過product方法實現+-/*運算法的笛卡爾積的元組(簡單來說,就是隨機組合三個運算法)。
爲了加深理解,我們對這兩個方法進行個簡單地示例:
import itertools
a = [1,2,3,4]
result = itertools.permutations(a)
print(type(result))
for i in result:
print(i)
結果是:
<class 'itertools.permutations'>
(1, 2, 3, 4)
(1, 2, 4, 3)
(1, 3, 2, 4)
(1, 3, 4, 2)
(1, 4, 2, 3)
(1, 4, 3, 2)
(2, 1, 3, 4)
(2, 1, 4, 3)
(2, 3, 1, 4)
(2, 3, 4, 1)
(2, 4, 1, 3)
(2, 4, 3, 1)
(3, 1, 2, 4)
(3, 1, 4, 2)
(3, 2, 1, 4)
(3, 2, 4, 1)
(3, 4, 1, 2)
(3, 4, 2, 1)
(4, 1, 2, 3)
(4, 1, 3, 2)
(4, 2, 1, 3)
(4, 2, 3, 1)
(4, 3, 1, 2)
(4, 3, 2, 1)
從對結果的打印可以看到,result是個迭代器。
同理,對product方法是對兩個列表進行排列組合,示例代碼中只是用到了repeat參數。
如果最後打印是*i,那就返回元組內的元素;如果打印是i,則返回元組。
import itertools
a = [1,2]
b = ['c','d']
result = itertools.product(a,b)
print(type(result))
for i in result:
print(i)
結果是:
<class 'itertools.product'>
(1, 'c')
(1, 'd')
(2, 'c')
(2, 'd')
4
示例代碼
# coding=utf-8
# @公衆號 : "鵬哥賊優秀"
# @Date : 2020/1/28
# @Software : PyCharm
# @Python version: Pythonista 3
import ui
import random
import itertools
# 通過遍歷進行計算24點
def calculate_twenty_four(cards):
for nums in itertools.permutations(cards): # 四個數
for ops in itertools.product('+-*/', repeat=3): # 三個運算符(可重複!)
# 構造三種中綴表達式 (bsd)
bds1 = '({0}{4}{1}){5}({2}{6}{3})'.format(*nums, *ops) # (a+b)*(c-d)
bds2 = '(({0}{4}{1}){5}{2}){6}{3}'.format(*nums, *ops) # (a+b)*c-d
bds3 = '{0}{4}({1}{5}({2}{6}{3}))'.format(*nums, *ops) # a/(b-(c/d))
for bds in [bds1, bds2, bds3]: # 遍歷
try:
if abs(eval(bds) - 24.0) < 1e-10: # eval函數
return bds
except ZeroDivisionError: # 零除錯誤!
continue
return 'Not found!'
def get_next_number(sender):
label_list = init_ui(sender)
for label in label_list[:4]:
label.text = str(random.randint(1,9))
label_list[4].text = 'Please click OK to get the result!'
def get_result(sender):
label_list = init_ui(sender)
card = [label.text for label in label_list[:4]]
result = calculate_twenty_four(card)
if result != 'Not found!':
label_list[4].text = 'Result is : ' + result + '=24'
else:
label_list[4].text = 'Not found!'
def reset(sender):
label_list = init_ui(sender)
for label in label_list:
if label != 'label5':
label.text = ''
else:
label.text = 'Please click Start to start game!'
def init_ui(sender):
label1 = sender.superview['label1']
label2 = sender.superview['label2']
label3 = sender.superview['label3']
label4 = sender.superview['label4']
label5 = sender.superview['label5']
return [label1,label2,label3,label4,label5]
v = ui.load_view()
if min(ui.get_screen_size()) >= 768:
# iPad
v.frame = (0, 0, 360, 400)
v.present('sheet')
else:
# iPhone
v.present(orientations=['portrait'])
5
總結
最後來個我蠻喜歡的抖音結尾吧,哈哈。
~~~下課鈴~~~
【往期熱門文章】:
【Python成長之路】10行代碼教你免費觀看無廣告版的《慶餘年》騰訊視頻
【Python成長之路】如何用python開發自己的iphone應用程序,並添加至siri指令
【Python成長之路】從 零做網站開發 -- 基於Flask和JQuery,實現表格管理平臺
點擊下方詩句,可以留言互動喔
【關注“鵬哥賊優秀”公衆號,回覆“python學習材料”,將會有python基礎學習、機器學習、數據挖掘、高級編程教程等100G視頻資料,及100+份python相關電子書免費贈送!】
掃描二維碼
與鵬哥一起
學python吧!