【Python成長之路】沒法出門玩?那就自己寫個手機遊戲吧

哈嘍大家好,我是鵬哥。

 

今天想記錄的是 —— 用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 itertoolsa = [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 itertoolsa = [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 uiimport randomimport 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吧!

 

發佈了38 篇原創文章 · 獲贊 17 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章