1. 程式人生 > >撲克程式 Python

撲克程式 Python

是Udacity課程的第一個專案。

先從巨集觀把握一下思路,目的是做一個比較德州撲克大小的問題
首先,先抽象出一個處理的函式,它根據返回值的大小給出結果。

之後我們在定義如何比較兩個或者多個手牌的大小,為方便比較大小,我們先對5張牌進行預處理,將其按照降序排序,如下:

def card_ranks(hand):

    ranks = ['--23456789TJQKA'.INDEX(r) for r, s in hand]
    ranks.sort(reverse=True)
    return ranks

然後我們可以枚舉出一共有9種情況,並用數字代表每一種情況的等級,利用Python的比較功能,將等級放在第一位,如果等級相同,那麼再比較後面的。

def hand_rank(hand):
    "Return a value indicating the ranking of a hand."
    ranks = card_ranks(hand) 
    if straight(ranks) and flush(hand):
        return (8, max(ranks))
    elif kind(4, ranks):
        return (7, kind(4, ranks), kind(1, ranks))
    elif kind(3, ranks) and kind(2, ranks):
        return
(6, kind(3, ranks), kind(2, ranks)) elif flush(hand): return (5, ranks) elif straight(ranks): return (4, max(ranks)) elif kind(3, ranks): return (3, kind(3, ranks), ranks) elif two_pair(ranks): return (2, two_pair(ranks), ranks) elif kind(2, ranks): return
(1, kind(2, ranks), ranks) else: return (0, ranks)

可以看到,如果等級相同,接下來比較的是每套牌中牌的大小了。同時我們需要三個函式,代表同花,順子,以及kind(n, ranks),代表ranks有n張牌的點數。這裡的三個函式實現非常巧妙,利用了set去重的特性。

def straight(ranks):
    return (max(ranks) - min(ranks)) == 4 and len(set(ranks)) == 5

def flush(hand):
    suit = [s, for r, s in hand]
    return len(set(suit)) == 1
def kind(n, ranks):
    for s in ranks:
        if ranks.count(s) == n : return s
    return None

我們發現,有一種情況是含有兩個對,於是需要一個函式來判斷是否是這種情況,這個函式中呼叫了kind()函式,由於kind()函式滿足短路特性,只會返回先得到的滿足情況的點數,於是將其翻轉後,在呼叫一邊kind,若得到的結果相同,那麼就只有一個對(或者沒有),否則就有兩個。

def two_pairs(ranks):
    pair = kind(2, ranks)
    lowpair = kind(2, list(reverse(ranks)))
    if pair != lowpair:
        return (pair, lowpair)
    else:
        return None

好了,整體的骨架算是搭完了,接下來處理會產生bug的情況,首先是A2345,當排序時由於A被算作14,所以針對這個問題需要單獨列一個if


處理A是最低:
def card_ranks(hand):
    ranks = ['--23456789TJQKA'.INDEX(r) for r, s in hand]
    ranks.sort(reverse=True)
    return  [5, 4, 3, 2, 1] if (ranks = [14, 5, 4, 3, 2] else ranks

之後就是進一步的簡化了,思路挺好的

def poker(hands):
    return allmax(hands, key=hand_ranks)


def allmax(iterable, key=None):
    result, maxval = [], None
    ket = key or lambda(x): x
    for x in iterable:
        xval = key(x)
        if not result or xval > maxval:
            result, maxval = [x], xval
        elif:
            result.append(x)
    return result
"""大於就取代,等於就加入,小於不作處理"""

import random

mydeck = [r+s for r in '23456789TJKQA' for s in'SHDC]
def deal(numhands, n=5, deck = [r+s for r in '23456789TJKQA' for s in'SHDC]):
    random.shuffle(deck)
    return [deck[n*i:n*(i + 1)] for i in range(numhands)]



def hand_ranks(hand):
    groups = group['--23456789TJQKA'.index(r) for r, s in hand]
    counts, ranks = unzip(groups)
    if rnaks == (14, 5, 4, 3, 2, 1):
        ransk = (5, 4, 3, 2, 1)

    straight = len(ranks) == 5 and max(ranks) - min(ranks) == 4
    flush = len(set([s for r, s in hand])) ==1
    return(9 if (5,) == count else
          8 if straight and flush else
          7 if (4, 1) == counts else
          6 if (3, 2) == counts else
          5 if flush else
          4 if straight else
          3 if (3, 1, 1) == counts else
          2 if (5, 1, 1) == counts else
          1 if (2, 1, 1, 1) == counts else
          0), ranks
def group(items):
    groups = [(items.count(x), x) for x in set(items)]
    return sorted(groups, reverse = True)
def unzips(pairs):return zip(*pairs)

def hand_ranks(hand):
     groups = group['--23456789TJQKA'.index(r) for r, s in hand]
    counts, ranks = unzip(groups)
    if rnaks == (14, 5, 4, 3, 2, 1):
        ransk = (5, 4, 3, 2, 1)

    straight = len(ranks) == 5 and max(ranks) - min(ranks) == 4
    flush = len(set([s for r, s in hand])) ==1
    return max(count_ranks[counts], 4*straight + 5 * flush), ranks
count_rankings = {(5,):10, (4, 1):7, (3,2):6, (3,1,1):3, (2,2,1):2,
(2,1,1,1): 1,(1,1,1,1,1):0}

總結下,面對一個問題的思維步驟:

started:understand problems look at specification See if it make sense
define the piece of problem reuse the piece you have test! >explore
最後是是的程式在各個方面達到均衡
correctness elegance efficienct featrues

相關推薦

撲克程式 Python

是Udacity課程的第一個專案。 先從巨集觀把握一下思路,目的是做一個比較德州撲克大小的問題 首先,先抽象出一個處理的函式,它根據返回值的大小給出結果。 之後我們在定義如何比較兩個或者多個手牌的大小,為方便比較大小,我們先對5張牌進行預處理,將其按照降序

轉:模擬洗牌(撲克)程式

// Illustrates : Shuffle algorithm, srand, rand. // Improvements: Use classes for Card and Deck. // Author      : Fred Swartz 2003-08-24, shuffle

Cron 的在ubuntu 定時執行自己的程式&& Python獲取當前 指令碼檔案的路徑。

首先 crontab -e 在裡面加入自己的 要執行的語句。 上面的含義是 每隔15分鐘執行一次。。 後面的命令 我用的是 絕對路徑。 修改完 這裡之後 需要重啟 cron,重啟的命令是 sudo service cron restart crontab -l 可以打印出

公司年會抽獎程式-python

發一下自己寫的公司抽獎程式。。 需求:公司年會要一個抽獎程式,轉盤上的每一個人名是隨機中獎的,中獎後的人不可以再次中獎,按住抽獎,就會一直在轉,放開後,要再轉一兩圈才停。 呵,剛好自己在學python cocos2d, 就用這個剛學的東東,雖然只學了點皮毛..直接上原始碼

簡單的郵件傳送程式-python

from email.mime.text import MIMETextfrom email.header import Headerfrom email.utils import parseaddr,formataddrimport smtplibdef _format_a

黑龍江大學 校園網 師生服務 身份驗證 查成績 查績點等 API 以及示例程式 (Python 驗證碼自動識別)

特性:python 圖片降噪之後 利用 pytesseract, tesseract-ocr 自動識別驗證碼 不斷更新各種 API 應有盡有 點x校園網:) 地址: htt

第一個python程式——即時動態時鐘(程式碼解讀)

程式碼資源來自: http://n.miaopai.com/media/K9Qlou7rdPc5TxpPaL1VDvwfv5hP~lHK   (執行有錯誤,缺少date,week和結尾部分) https://blog.csdn.net/yangxing2/article/details

Python入門》第一個Python Web程式——簡單的Web伺服器

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Python程式打包之PyInstaller

1、背景說明 【Python版本】Python 2.7.14 【系統平臺】Windows 7 【優缺點描述】據說PyInstaller 比較慢,但是PyInstaller打包出來的exe簡潔(就一個檔案),沒有一堆的dll和配置檔案等。 2、安裝方式 pip install PyInstall

python程式效能優化

最近工作中有個任務,就是優化一個模型的實時性。從有到無,主要完成了以下內容。 0.模型的邏輯 1.演算法邏輯 2.程式碼重構 3.程式的效能優化,包括編譯、多執行緒、多程序、numba 4.語言 numba包,經測試,比較適用於陣列、矩陣等數值計算,其他的型別操作,容易報錯。

python列表、迴圈、判斷小練習——購物車小程式

程式要求: 1.商品資訊儲存在檔案中。 2.列印商品資訊,包括名稱及編號,價格 3.輸入工資 4.選擇商品編號將商品放入購物車,並計算剩餘工資。 5.工資不夠時提醒餘額不足 6.將已購商品,餘額記錄長久儲存 7.列印已購商品名單 8.可以新增商品及價格   流程圖 &nbs

python程式:猜數字

寫的比較簡單 import random def main(): """請輸入一個最小值和一個最大值,讓計算機自動生成一個隨機數字""" smaller=int(input("請輸入一個較小的數字:")) larger=int(input("請輸入一個較大的數字:"))

Python程式打包成exe的一些坑

今天寫了一個專案,Python專案,需要在win7上跑起來,我想,這不是簡單的不行麼,直接上Pyinstaller不就完了? 但是後來,我發覺我真是too young too simple。 為什麼這麼說呢,因為我是堅定的Linux黨,沒Windows!!!!!這就說明什麼呢,當你在linux上Pyins

python 入門級程式演算法

條件語句的基礎程式 # 設定條件的時候,一般從少數的地方入手 count = 1 while count <= 3: print(count) #可替代內容 count +=1 # 求和 count = 1 sum = 0 while count <101:

Python漢諾塔問題遞迴演算法與程式

漢諾塔問題: 問題來源:漢諾塔來源於印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從上往下從小到大順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動一個圓盤,只能移動在最頂端的圓盤。有預言說

python基於併發與socket實現遠端檔案傳輸程式

FTP程式 Client: * bin/start.py 程式入口 * conf/配置檔案存放 * core/ * auth.py 登陸,註冊以及上傳下載檢視當前資料夾下檔案以及刪除功能存放 * cline.py 與服務端通訊 * home 本地使用者目錄 Server: * bin/

Python 使用pyinstaller將py檔案釋出成exe程式

一. Pyinstaller簡介 Python是一個指令碼語言,被直譯器解釋執行。它的釋出方式: .py檔案:對於開源專案或者原始碼沒那麼重要的,直接提供原始碼,需要使用者自行安裝Python並且安裝依賴的各種庫。(Python官方的各種安裝包就是這樣做的) .pyc檔案:有些公司或個人因

Python全棧學習筆記day 17:遞迴函式之:二分法(老男孩Python全棧學習s9 day17 二分法程式有些問題)

遞迴函式 遞迴 : 在函式中呼叫自身函式 最大遞迴深度預設是997/998 —— 是python從記憶體角度出發做得限制 二分法: 實現程式: 最基礎版:(很多問題:切分導致出現了新列表,無法返回元素在 l 中的位置) l = [2,3,5,10,15,16,

入門python程式:分支迴圈,break和continue使用示例

分支迴圈是用腦示例 score = int(input("請輸入一個分數:")) if 100 > score >=90 : print("A") elif 90 > score >=80: print("B") elif 80 > scor

程式猿推送利器:使用Python+Server醬打造微信通知推送利器

你是否經歷過伺服器掛掉卻渾然不知的彷徨?你是否感受過服務停止很久後才發現事情的嚴重的感覺?是的,你急需一款輕量級的推送通知系統! Server醬正是這麼一款程式猿的好幫手,她通過提供一個超輕量級的API介面就可以讓你的訊息推送到你的微信上,達到以下效果: 那麼如何實現訊息