最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)帶圖形界面的炸金花游戲

 更新時(shí)間:2022年12月02日 15:29:46   作者:Hann?Yang  
詐金花又叫三張牌,是在全國(guó)廣泛流傳的一種民間多人紙牌游戲,它具有獨(dú)特的比牌規(guī)則。本文將通過(guò)Python語(yǔ)言實(shí)現(xiàn)帶圖形界面的詐金花游戲,需要的可以參考一下

炸金花

題目很簡(jiǎn)單:就是自己寫(xiě)一個(gè)程序,實(shí)現(xiàn)詐金花游戲的發(fā)牌、判斷輸贏。

規(guī)則:

一付撲克牌,去掉大小王,每個(gè)玩家發(fā)3張牌,最后比大小,看誰(shuí)贏。

牌型:

豹子:三張一樣的牌,如3張6.

順金:又稱同花順,即3張同樣花色的順子, 如紅桃 5、6、7

順子:又稱拖拉機(jī),花色不同,但是順子,如紅桃5、方片6、黑桃7,組成的順子

對(duì)子:2張牌一樣

單張:?jiǎn)螐堊畲蟮氖茿

版型大小順序: 豹子>順金>順子>對(duì)子>單張

從網(wǎng)上百科到的詐金花各種牌型的出現(xiàn)概率,一起放進(jìn)代碼中增加一點(diǎn)趣味小知識(shí)。你可能不知道豹子出現(xiàn)的概率比同花順大,實(shí)際打牌時(shí)同花順?lè)炊缺有?;順子出現(xiàn)的概率比金花小,實(shí)際打牌時(shí)順子反而比金花小;最大牌為5、6、7的單張牌型出現(xiàn)的概率都要比金花和順子小,所以有的地方額外規(guī)定同一局中拿到“235”三張牌要比同局的豹子大。

回到正題,直接上代碼,主要2個(gè)函數(shù):一個(gè)計(jì)分、一個(gè)比大小

from random import shuffle as DealCards
 
Players = 5  #人數(shù)
pkPacks = 1  #撲克副數(shù)
W = "單張","對(duì)子","順子","金花","順金","豹子"
X = 74.38, 16.94, 3.26, 4.96, 0.22, 0.24  #出現(xiàn)概率
Y = 0.54, 1.36, 2.44, 3.8, 5.43, 7.33, 9.5, 11.95, 14.66, 17.38 #單張概率
V = *(str(i) for i in range(2,10)),*'TJQKA' #T代表10
F = '?', '?', '?', '?'
P = [f+v for f in F for v in V]*pkPacks 
 
def Scores(pokers):
    f,p = [],[]
    for poker in pokers:
        f.append(F.index(poker[0])+1)
        p.append(V.index(poker[1])+2)
    t = sorted(p)
    if len(set(t))==1:
        return 500_0000+t[0] #豹子
    elif len(set(t))==2: #對(duì)子
        if t[0]==t[1]: #對(duì)子一樣大比較剩下的單張
            return (100+t[1])*10000+t[2]
        else:
            return (100+t[1])*10000+t[0]
    else:
        if t[0]+1==t[1]==t[2]-1:
            if len(set(f))==1:
                return 400_0000+t[2] #順金(同花順)
            else:
                return 200_0000+t[2] #順子
        else:
            if len(set(f))==1:
                return ((300+t[2])*100+t[1])*100+t[0] #金花
            else:
                return (t[2]*100+t[1])*100+t[0] #單張
 
def WhoWins(P):
    Pokers,Winner = [],[]
    for i in range(0,3*Players,3):
        Pokers.append(P[i:i+3])
    for i,p in enumerate(Pokers,1):
        win = Scores(p)
        idx = win//100_0000
        print(f"Player{i}: {*p,} - {W[idx]}")
        Winner.append(win)
    win = max(Winner) #沒(méi)有判斷“一樣大”,如是則誰(shuí)在前誰(shuí)為大
    idx = Winner.index(win)
    big = win//10000
    win = big//100
    per = X[win] if win else Y[big-5]
    pok = W[win] if win else '單'+V[big-2]
    print(f"【Player{idx+1} win!】--> {*Pokers[idx],} {pok}({per}%)\n")
    return P[3*Players:] #去掉每一局已發(fā)的牌
 
if __name__ == '__main__':
    DealCards(P) #以隨機(jī)洗牌來(lái)模擬發(fā)牌
    #Players = int(input('請(qǐng)輸入?yún)⒓拥娜藬?shù)?'))
    PlayersMax = 52*pkPacks//3+1
    if not 0<Players<PlayersMax:
        print(f'請(qǐng)注意:參與人數(shù)的范圍 0 < Players < {PlayersMax} !')
    else:
        count = 1
        while len(P)>=3*Players: #所有牌(52*PokerPairs)發(fā)不夠一局為止
            print(f'第{count}局:')
            count += 1
            P = WhoWins(P)

運(yùn)行結(jié)果:

第1局:
Player1: ('♥Q', '♣2', '♣8') - 單張
Player2: ('♦T', '♥7', '♠6') - 單張
Player3: ('♣4', '♠4', '♦2') - 對(duì)子
Player4: ('♠5', '♠9', '♥6') - 單張
Player5: ('♠7', '♠3', '♣5') - 單張
【Player3 win!】--> ('♣4', '♠4', '♦2') 對(duì)子(16.94%)
第2局:
Player1: ('♥2', '♥8', '♦4') - 單張
Player2: ('♦9', '♦3', '♥A') - 單張
Player3: ('♠J', '♣A', '♦K') - 單張
Player4: ('♠8', '♥9', '♥T') - 順子
Player5: ('♣7', '♣9', '♣T') - 金花
【Player5 win!】--> ('♣7', '♣9', '♣T') 金花(4.96%)
第3局:
Player1: ('♦7', '♦J', '♠2') - 單張
Player2: ('♥J', '♦A', '♥K') - 單張
Player3: ('♥4', '♥5', '♦6') - 順子
Player4: ('♣Q', '♣J', '♠T') - 順子
Player5: ('♣K', '♦8', '♦5') - 單張
【Player4 win!】--> ('♣Q', '♣J', '♠T') 順子(3.26%)

擴(kuò)展

學(xué)習(xí)要舉一反三,做完題目想到把這個(gè)程序的界面圖形化。無(wú)非就是把牌型對(duì)應(yīng)列表下標(biāo)從下圖中索引取出相應(yīng)的圖片來(lái)對(duì)應(yīng)到Image控件上;想要輸出的文字對(duì)應(yīng)到text控件上;再整2個(gè)button控件綁定對(duì)應(yīng)的事件動(dòng)作。(代碼中有第3個(gè)button是我測(cè)試用的)

牌型圖: Pokers.png

初始界面:

發(fā)牌界面:

開(kāi)牌界面:

PokersV1.py 完整源代碼:

import tkinter as tk
from PIL import Image,ImageTk
from time import sleep
from random import shuffle as DealCards
 
Players = 4  #人數(shù)
pkPacks = 1  #撲克副數(shù)
isReady = True
 
W = "單張","對(duì)子","順子","金花","順金","豹子"
X = 74.38, 16.94, 3.26, 4.96, 0.22, 0.24  #出現(xiàn)概率
Y = 0.54, 1.36, 2.44, 3.8, 5.43, 7.33, 9.5, 11.95, 14.66, 17.38 #單張概率
V = *(str(i) for i in range(2,10)),*'TJQKA' #T代表10
F = '?', '?', '?', '?'
 
def loadCards():
    infile = Image.open("pokers.png")
    Images = []
    for j in range(4):
        image = []
        for i in range(15):
            box = infile.crop((i*100,j*150,i*100+100,j*150+150))
            img = ImageTk.PhotoImage(image=box)
            image.append(img)
        Images.append(image)
    infile.close()
    return Images
 
def dealCards():
    global cv,cards,isReady,P,Pokers
    if not isReady:
        return
    cv.itemconfig(txt1, text="")
    cv.itemconfig(txt2, text="")
    if len(Pokers):
        for j in range(3):
            for i in range(4):
                cv.itemconfig(cards[i][j], image=Cards[0][0])
                cv.update()
        sleep(0.5)
    for j in range(3):
        for i in range(4):
            cv.itemconfig(cards[i][j], image=Cards[1][0])
            cv.update()
            sleep(0.3)
    if len(P)==0 or len(P)<12:
        P = [f+v for f in F for v in V]*pkPacks
        DealCards(P)
    isReady = False
 
def playCards():
    global cv,isReady,P,Pokers,cards,Cards
    if isReady:
        return
    P = WhoWins(P)
    for i,pok in enumerate(Pokers):
        for j,p in enumerate(pok):
            x = F.index(p[0])
            y = V.index(p[1])
            #print(x,y,'-',i,j)
            cv.itemconfig(cards[i][j], image=Cards[x][y+2])
            cv.update()
    isReady = True
 
def Scores(pokers):
    f,p = [],[]
    for poker in pokers:
        f.append(F.index(poker[0])+1)
        p.append(V.index(poker[1])+2)
    t = sorted(p)
    if len(set(t))==1:
        return 500_0000+t[0] #豹子
    elif len(set(t))==2: #對(duì)子
        if t[0]==t[1]: #對(duì)子一樣大比較剩下的單張
            return (100+t[1])*10000+t[2]
        else:
            return (100+t[1])*10000+t[0]
    else:
        if t[0]+1==t[1]==t[2]-1:
            if len(set(f))==1:
                return 400_0000+t[2] #順金(同花順)
            else:
                return 200_0000+t[2] #順子
        else:
            if len(set(f))==1:
                return ((300+t[2])*100+t[1])*100+t[0] #金花
            else:
                return (t[2]*100+t[1])*100+t[0] #單張
 
def WhoWins(P):
    global cv,txt1,txt2,Pokers
    Pokers,Winner = [],[]
    for i in range(0,3*Players,3):
        Pokers.append(P[i:i+3])
    for i,p in enumerate(Pokers,1):
        win = Scores(p)
        idx = win//100_0000
        print(f"Player{i}: {*p,} - {W[idx]}")
        Winner.append(win)
    win = max(Winner) #沒(méi)有判斷“一樣大”,如是則誰(shuí)在前誰(shuí)為大
    idx = Winner.index(win)
    big = win//10000
    win = big//100
    per = X[win] if win else Y[big-5]
    pok = W[win] if win else '單'+V[big-2]
    text1 = f"【Player{idx+1} win!】"
    text2 = f"{pok}{*Pokers[idx],} {per}%\n"
    print(text1,'--> ',text2)
    cv.itemconfig(txt1, text=text1)
    cv.itemconfig(txt2, text=text2)
    return P[3*Players:] #去掉每一局已發(fā)的牌
 
def test():
    global Pokers
    print("測(cè)試:",Pokers)
 
if __name__ == '__main__':
    root = tk.Tk()
    root.geometry('1024x768')
    root.title('詐金花')
    cv = tk.Canvas(root, width=1024, height=680, bg='darkgreen')
    cv.pack()
    Pokers = []
    Cards = loadCards()
    cards = [[None]*3 for _ in range(4)]
    P = [f+v for f in F for v in V]*pkPacks
    DealCards(P)
    x1, x2, x3 = 400, 80, 730
    y1, y2, y3 = 100, 550, 320
    dx1,dx2,dy = 105, 105, 0
    imgxy = [[(x1,y1),(x1+dx1,y1),(x1+2*dx1,y1)],[(x3,y3),(x3+dx2,y3+dy),(x3+2*dx2,y3+dy*2)],
             [(x1,y2),(x1+dx1,y2),(x1+2*dx1,y2)],[(x2,y3),(x2+dx2,y3+dy),(x2+2*dx2,y3+dy*2)]]
    for x,lst in enumerate(imgxy):
        for y,coord in enumerate(lst):
            cards[x][y] = cv.create_image(coord, image=Cards[0][0])
            cv.create_rectangle(coord[0]-50,coord[1]-75,coord[0]+50,coord[1]+75)
        tx,ty = coord[0]-100,coord[1]+92
        cv.create_text(tx,ty, text=f'Player{x+1}', fill='white')
    btn = [None]*3
    btn[0] = tk.Button(root,text='發(fā)牌',command=dealCards,width=10)
    btn[1] = tk.Button(root,text='開(kāi)牌',command=playCards,width=10)
    btn[2] = tk.Button(root,text='測(cè)試',command=test,width=10)
    for i in range(3):
        btn[i].place(y=710, x=350+i*110)
    txt1 = cv.create_text(510,300, fill='red', font=("宋體", 16))
    txt2 = cv.create_text(510,360, fill='red', font=("宋體", 10))
    root.mainloop()

【編譯程序】

Windows的Cmd窗口中執(zhí)行如下命令,Mac系統(tǒng)自行百度:

pyinstaller -F exam.py --noconsole

注意:記得把上面的牌型圖保存為Pokers.png和代碼放一起運(yùn)行。

到此這篇關(guān)于Python實(shí)現(xiàn)帶圖形界面的炸金花游戲的文章就介紹到這了,更多相關(guān)Python炸金花游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家

相關(guān)文章

  • 如何用python免費(fèi)看美劇

    如何用python免費(fèi)看美劇

    在本篇文章里小編給大家整理的是關(guān)于如何用python免費(fèi)看美劇的方法內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-08-08
  • Python xmltodict模塊安裝及代碼實(shí)例

    Python xmltodict模塊安裝及代碼實(shí)例

    這篇文章主要介紹了Python xmltodict模塊安裝及代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • python兼容VBA的用法詳解

    python兼容VBA的用法詳解

    這篇文章主要介紹了python兼容VBA的用法詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 最實(shí)用的20個(gè)python小技巧

    最實(shí)用的20個(gè)python小技巧

    大家好,本篇文章主要講的是最實(shí)用的20個(gè)python小技巧,感興趣的同學(xué)快來(lái)看一看吧,希望對(duì)你有幫助
    2021-11-11
  • Python基于QRCode實(shí)現(xiàn)生成二維碼的方法【下載,安裝,調(diào)用等】

    Python基于QRCode實(shí)現(xiàn)生成二維碼的方法【下載,安裝,調(diào)用等】

    這篇文章主要介紹了Python基于QRCode實(shí)現(xiàn)生成二維碼的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python下載,安裝與調(diào)用QRCode實(shí)現(xiàn)生成二維碼功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • Python自定義元類(lèi)的實(shí)例講解

    Python自定義元類(lèi)的實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于Python自定義元類(lèi)的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-03-03
  • Python OpenCV實(shí)現(xiàn)圖片上輸出中文

    Python OpenCV實(shí)現(xiàn)圖片上輸出中文

    這篇文章主要為大家詳細(xì)介紹了Python OpenCV實(shí)現(xiàn)圖片上輸出中文,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • python scrapy重復(fù)執(zhí)行實(shí)現(xiàn)代碼詳解

    python scrapy重復(fù)執(zhí)行實(shí)現(xiàn)代碼詳解

    這篇文章主要介紹了python scrapy重復(fù)執(zhí)行實(shí)現(xiàn)代碼詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • python中bs4.BeautifulSoup的基本用法

    python中bs4.BeautifulSoup的基本用法

    這篇文章主要介紹了python中bs4.BeautifulSoup的基本用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python程序設(shè)計(jì)入門(mén)(5)類(lèi)的使用簡(jiǎn)介

    Python程序設(shè)計(jì)入門(mén)(5)類(lèi)的使用簡(jiǎn)介

    這篇文章主要介紹了Python類(lèi)的使用,需要的朋友可以參考下
    2014-06-06

最新評(píng)論

长宁区| 油尖旺区| 岳阳县| 淮安市| 漾濞| 卢湾区| 青岛市| 富宁县| 筠连县| 衡山县| 天水市| 南康市| 海阳市| 连平县| 九江市| 武山县| 井冈山市| 喀喇| 元氏县| 珲春市| 女性| 南丰县| 金寨县| 突泉县| 元阳县| 东至县| 晴隆县| 乳山市| 方山县| 白朗县| 洛宁县| 秦安县| 图们市| 醴陵市| 松江区| 平顶山市| 博野县| 贵港市| 定襄县| 南澳县| 合江县|