欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用Python還原方陣游戲詳解

 更新時(shí)間:2023年01月04日 09:30:07   作者:??????  
這篇文章的靈感來(lái)源于我玩游戲的時(shí)候,看見(jiàn)一個(gè)大佬在游戲里面建造了“還原方陣游戲”,就感覺(jué)很牛掰,就想著python不是有矩陣嗎,可以還原一下呢,感興趣的小伙伴可以了解一下

一、前言

寫(xiě)這篇文章的靈感來(lái)源于我玩游戲的時(shí)候(為了避免過(guò)不了審就不說(shuō)是啥游戲了),看見(jiàn)一個(gè)大佬在游戲里面建造了“還原方陣游戲”,就感覺(jué)很牛掰,就想著python不是有矩陣嗎,可不可以還原一下呢?

說(shuō)干就干,我寫(xiě)的那個(gè)蜘蛛紙牌用了一星期,寫(xiě)這玩意兒只用了2小時(shí),估計(jì)是有了經(jīng)驗(yàn)吧。

這篇文章會(huì)手把手教你完成這個(gè)小游戲,算是新手的numpy練手程序了。寫(xiě)作不易,支持一波~

二、游戲規(guī)則

其實(shí)這個(gè)游戲我也不知道叫啥,就是自己瞎編的名字(bushi。

游戲規(guī)則:有一個(gè)方陣,里面有的點(diǎn)位有棋子,有的點(diǎn)位沒(méi)有棋子,我會(huì)給出每行每列的棋子個(gè)數(shù),請(qǐng)復(fù)原這個(gè)方陣。注:如果棋子之間有空位就用空格代替。例如這個(gè)方陣: 

棋 空 空

棋 空 棋

空 空 棋

第一列里面有兩個(gè)連續(xù)的棋子,那我就給出2。第二列里沒(méi)有棋子,那我就啥也不給。第三列里有兩個(gè)連續(xù)棋子,那我就給出2。

第一行里有一個(gè)棋子,那我就給出1。第二行里有一個(gè)棋子,空一格又有一個(gè)棋子,那我就給出1 1。第三行里有一個(gè)棋子,那我就給出1。

通過(guò)給出的信息,請(qǐng)還原方陣。

這個(gè)游戲是對(duì)邏輯思維的推理。為了方便用戶操作,我們給出另一個(gè)矩陣,讓用戶在上面標(biāo)注,當(dāng)標(biāo)注矩陣=正確矩陣就結(jié)束游戲。

三、numpy模塊

寫(xiě)代碼之前,我們先了解一下numpy模塊。

numpy模塊,就是矩陣模塊,其中有很多很多的函數(shù),讓我們完成矩陣的相關(guān)操作。

安裝numpy模塊,首先你要有python,之后要有萬(wàn)能的pip包(沒(méi)有自己網(wǎng)上查怎么下載)。之后,我們win+R,輸入cmd打開(kāi)熟悉的命令行,輸入:

pip install numpy

等一會(huì)兒,如果沒(méi)出現(xiàn)錯(cuò)誤就是安裝成功了。之后輸入:

pip list

來(lái)查看pip包所有安裝的模塊,有numpy就是成功了。

numpy,其實(shí)和嵌套列表差不多,但是人家操作十分方便,有許多函數(shù)都是嵌套列表做不到的。

numpy可以在很多方面發(fā)光發(fā)熱,因?yàn)樗幌衿渌K那樣,專(zhuān)門(mén)做游戲,專(zhuān)門(mén)做網(wǎng)站,專(zhuān)門(mén)爬蟲(chóng)等等啥的,無(wú)論是什么方面,都常常遇到矩陣,可以說(shuō)是個(gè)金牌輔助了。我之前那做的那個(gè)蜘蛛紙牌游戲也是用的他。

numpy的賦值有很多方法,如果你要給其中一個(gè)位置賦值,那就要用二級(jí)索引,在numpy里面第一個(gè)數(shù)字代表第幾行,第二個(gè)代表第幾列。注意要用下標(biāo)數(shù)字哦!例如我們要把一個(gè)叫做a的矩陣的第一行第二列變成0,那我們就a[0][1]=0。

接下來(lái),我們就開(kāi)始寫(xiě)程序吧!

四、第一步:大循環(huán)and獲取規(guī)格

首先,我們?cè)O(shè)置一個(gè)規(guī)則:還原矩陣5次時(shí)候就勝利了。用while把主體程序套進(jìn)大框架里面。

為了能調(diào)整不同的大小,我們可以獲取用戶的輸入來(lái)調(diào)整規(guī)格。

首先,我們要來(lái)幫用戶正骨,就用while True和try-except。

為啥要用他倆兄弟呢?首先,try-except的作用是在用戶輸入不正確或不符合規(guī)定時(shí)作出處理,while True則是為了作出處理之后讓用戶重新來(lái)輸入一遍。

我們現(xiàn)在就規(guī)定:規(guī)格有4種,讓用戶3x3輸入3,4x4輸入4,5x5輸入5,6x6輸入6。用戶的數(shù)字就必須在3到6之間。

但是如果用戶輸入的是其他數(shù)字呢?

沒(méi)事,我們可以用一個(gè)條件判斷,如果數(shù)字不是3~6之間就直接掏出raise,拋出異常,程序轉(zhuǎn)移到except那邊。是不是很完美?

別看這樣寫(xiě)字多了,這是排除所有其他輸入還能正確運(yùn)行的最佳方案。

那么該怎么退出循環(huán)呢?

nonono,不要想太復(fù)雜了,只要程序執(zhí)行完了還沒(méi)有報(bào)錯(cuò)就說(shuō)明輸入正確,直接加break就行了。

win=0#初始化變量
 
while win<=5:#主體程序大循環(huán)
    while True:#while True出山
        try:#try出山
            guige=int(input("輸入規(guī)格,3x3輸入3,4x4輸入4,5x5輸入5,6x6輸入6"))#獲取用戶輸入
            if guige<3 or guige>6:#輸入必須在3到6的數(shù)字之間
                raise(VauleError())#否則直接報(bào)錯(cuò)
            break#如果程序到了最后還沒(méi)有報(bào)錯(cuò)就退出循環(huán),正常執(zhí)行
        except:#如果報(bào)錯(cuò)
            print("請(qǐng)正確輸入")#讓用戶重新輸入

嗯,就是這樣。第一步,我們就做好了。

五、第二步:初始化棋盤(pán)

上文說(shuō)了,我們要用兩個(gè)矩陣,第一個(gè)矩陣是正確的矩陣,我們?nèi)∶鹹es_numpy。第二個(gè)矩陣是嘗試的矩陣,我們?nèi)∶鹴ry_numpy。這里,我們就用1代表棋子,0代表沒(méi)有棋子。

但是try_numpy矩陣沒(méi)有標(biāo)記的位置該怎么弄呢?

這就要用上我們的None了。

None是一個(gè)奇怪的值,轉(zhuǎn)化布爾類(lèi)型為False,他不是0也不是空值,就是啥也沒(méi)有。例如你硬要獲取一個(gè)沒(méi)有返回值的函數(shù)的返回值,那就是None。

矩陣的值雖然不能為字符串,但是可以為None?。?/p>

我們要把矩陣的所有值變?yōu)镹one。用兩個(gè)嵌套for循環(huán)賦值就行了。

yes_numpy矩陣,則是要0和1隨機(jī)。還是用兩個(gè)嵌套for循環(huán),賦值0或1的隨機(jī)數(shù)。

為了方便,我們把numpy取名為np,random取名為r。

正確程序如下:

import random as r#導(dǎo)入random模塊
import numpy as np#導(dǎo)入numpy模塊
print("正在生成題目…")#提示
yes_numpy=np.zeros((guige,guige))#yes_numpy為全0矩陣
try_numpy=np.zeros((guige,guige))#try_numpy為全0矩陣
for i in range(guige):#第一層循環(huán)為行
    for j in range(guige):#第二層循環(huán)為列
        try_numpy[i][j]=None#try_numpy全部賦值為None
print(try_numpy)#輸出try_numpy
    
for i in range(guige):#第一層循環(huán)為行
    for j in range(guige):#第二層循環(huán)為列
        yes_numpy[i][j]=r.choice((1,0))#yes_numpy賦值為1 0隨機(jī)數(shù)

六、第三步:標(biāo)注矩陣功能(難)

接下來(lái)是主要的程序部分了。

首先,我們要獲取用戶進(jìn)行的操作。目前更新5個(gè)操作:標(biāo)注矩陣填1,查看標(biāo)注矩陣填2,勝利偵測(cè)填3,查看行列信息填4,重新開(kāi)始填5。

由于這些操作要重復(fù)執(zhí)行,我們就要用一個(gè)while True擴(kuò)起來(lái)。

獲取用戶操作,還是while True和try-except組合,還有raise和break的使用,和第一步思路一樣。但是我們外層已經(jīng)有一個(gè)循環(huán)了,所以可以省下來(lái)一個(gè)while,break可以換成continue。

我們先來(lái)完成標(biāo)注矩陣功能,就是標(biāo)注try_numpy。如果獲取到的回答是1時(shí)就執(zhí)行以下程序。

之后我們還要讓用戶輸入自己要改變的位置的行、列和改變成0還是1還是None,還要再加一層while True和try-except!

知道為啥讓你們有注釋和減少層級(jí)了吧?寫(xiě)這樣的程序的時(shí)候經(jīng)常循環(huán)套循環(huán),太亂了!寫(xiě)到這里已經(jīng)是第五層程序了。

我這么做也是有原因的,因?yàn)樯弦粋€(gè)寫(xiě)的蜘蛛紙牌程序比較大型,用起來(lái)很卡,時(shí)間也長(zhǎng),容易輸入錯(cuò)誤,并且不知道為啥輸入的時(shí)候總是自動(dòng)彈出來(lái)一個(gè)cde fg,不知道你們有沒(méi)有這種問(wèn)題,導(dǎo)致報(bào)錯(cuò)。這個(gè)程序就長(zhǎng)教訓(xùn)了。

輸入超出矩陣范圍或者修改的不是0或1,這兩個(gè)異常都要考慮到,把異常扼殺在搖籃之中,給用戶的反骨徹底正了。

修改矩陣,很簡(jiǎn)單,弄上對(duì)應(yīng)的修改位置再修改就行。

以上思路可能理解不了,那就結(jié)合著代碼理解吧:

while True:#游戲開(kāi)始
    try:#還是熟悉的try
        caozuo=int(input("輸入操作,標(biāo)注矩陣填1,查看目前改變矩陣填2,勝利偵測(cè)填3,查看行列信息填4,重新開(kāi)始填5。"))#詢問(wèn)操作
        if caozuo<1 or caozuo>4:#必須1到4之內(nèi)
            raise(ValueError())#報(bào)錯(cuò)
    except:#如果錯(cuò)誤
        print("請(qǐng)正確輸入")#提示
        continue#從頭開(kāi)始
        
    if caozuo==1:#如果操作是1
        while True:
            try:#老兩樣
                gai_hang,gai_lie,gai_neirong=map(int,input("輸入標(biāo)注位置的行、列(下標(biāo)),以及改變成0還是1(用空格隔開(kāi)三個(gè)值)\n").split())#詢問(wèn)三個(gè)標(biāo)注信息
                if gai_neirong<0 or gai_neirong>1:#內(nèi)容非0即1
                    print("只能改變成0和1,",end="")#提示
                    raise(ValueError())#報(bào)錯(cuò)
                if gai_hang>=guige or gai_lie>=guige:#行列不能超出矩陣規(guī)格
                    print("輸入超出規(guī)格,",end="")#提示
                    raise(ValueError())#報(bào)錯(cuò)
                break#如果沒(méi)有異常就退出循環(huán)
            except:#如果異常
                print("請(qǐng)正確輸入")#提示
                
        try_numpy[gai_hang][gai_lie]=gai_neirong#賦值
        print("標(biāo)注成功")#提示
        continue#從頭開(kāi)始,節(jié)約時(shí)間

這部分比較難,建議好好理解理解,消化消化。

七、第四步:查看標(biāo)注矩陣功能

接下來(lái)是查看標(biāo)注矩陣的功能。

我們把問(wèn)題轉(zhuǎn)換一下,不就是輸出try_numpy嘛?

if caozuo==2:#如果要查看標(biāo)注矩陣
    print(try_numpy)#直接輸出
    continue#從頭開(kāi)始,節(jié)約時(shí)間

是不是簡(jiǎn)簡(jiǎn)單單?

八、第五步:勝利偵測(cè)

為了節(jié)省運(yùn)行時(shí)間,我們換成當(dāng)輸入3之后才進(jìn)行勝利偵測(cè)。

我們不能直接比較兩個(gè)矩陣是否相等,這時(shí)候就要用上numpy里面的函數(shù)——all()了。放上兩個(gè)矩陣,兩個(gè)等號(hào)連接就可以比較兩個(gè)矩陣是否相等。返回True或者False。

if caozuo==3:#如果要檢測(cè)是否勝利
    if np.all(yes_numpy==try_numpy):#如果兩個(gè)矩陣全部相等
        print("你勝利了!")#提示
        zhuangtai="win"#改變變量
        break#退出循環(huán)
    else:#否則
        print("還不對(duì)哦!")#提示
        continue#從頭開(kāi)始

這些程序都是在那個(gè)while True的循環(huán)里,所以我們可以用break退出,再回到while win<5那個(gè)循環(huán)里。這里建議結(jié)合下面的完整代碼理解。

這里新建變量zhuangtai是因?yàn)楹竺孢€有重新開(kāi)始功能,我們要知道是因?yàn)楂@勝還是重新開(kāi)始退出的大循環(huán)。

九、第六步:查看行列信息(難)

接下來(lái),完成查看行列信息的程序。

由于矩陣全隨機(jī),我們也只能自己去偵測(cè)行列信息。

我們?cè)O(shè)置一個(gè)計(jì)數(shù)變量:shu。

思路如下:如果偵測(cè)到1,則shu自增。

如果偵測(cè)到0且前一項(xiàng)為1,則輸出shu+空格,之后shu清零。

如果偵測(cè)到0且前一項(xiàng)為0,則不輸出,可以不偵測(cè)。

如果結(jié)束之后shu不是0,輸出shu且換行。

一行一行,一類(lèi)一列挨個(gè)偵測(cè)輸出。 

具體程序如下,好好消化消化:

shu=0
 
if caozuo==4:#如果要查看行列信息
    for i in range(guige):#每一行
        print("第",i,"行:")#提示到底是第幾行
        for j in range(guige):#每一列
            if yes_numpy[i][j]==1:#如果矩陣的這一格為1
                shu+=1#shu自增
            if yes_numpy[i][j]==0:#如果矩陣的這一格為0
                if shu!=0:#且前一格不是0(直接偵測(cè)shu的狀態(tài)效果一樣)
                    print(shu,end="")#輸出shu
                shu=0#shu清零
        if shu!=0:#如果結(jié)束之后shu不為0
            print(shu)#輸出shu要換行
        shu=0#shu清零
        print()#輸出空行之后顯示列
    shu=0#初始化變量
    #以下程序是把遍歷行列進(jìn)行交換,來(lái)達(dá)到不用改變主體偵測(cè)矩陣列的效果
    for j in range(guige):
        print("第",j,"列:")
        for i in range(guige):
            if yes_numpy[i][j]==1:
                shu+=1
            if yes_numpy[i][j]==0:
                if shu!=0:
                    print(shu,end="")
                shu=0
        if shu!=0:
            print(shu)
        shu=0
        print()

十、第七步:重新開(kāi)始功能

矩陣重新開(kāi)始,直接break就行,但要改一下zhuangtai。

#內(nèi)層循環(huán)的程序
if caozuo==5:#如果操作是5
        zhuangtai="0"#狀態(tài)區(qū)分
        break#直接退出循環(huán)
#這里是最外層循環(huán)的程序
if zhuangtai=="win":#如果是因?yàn)楂@勝退出的循環(huán)
    win+=1#win自增

十一、得分與完善and完整代碼

我們還可以加上得分功能,再完善一下程序,用變量defen記錄得分,增加一下玩家的優(yōu)越感。

連接以上程序,完善各種bug,最終程序如下:

import numpy as np
import random as r
 
win=0
defen=500
shu=0
 
print("游戲開(kāi)始。游戲規(guī)則:我會(huì)給出一個(gè)矩陣,并且給出每行每列有幾個(gè)1的個(gè)數(shù)信息,如果有兩個(gè)數(shù)字代表有兩個(gè)空,舉個(gè)例子:\n[[ 1,1,1]\n[0,0,1]\n[1,0,0]]\n在這個(gè)列表中,例如第0列為1,0,1,有兩個(gè)間斷的1那我就給出1 1,第1列有1 0 0,那我就給出1,第2列為1,1,0,有兩個(gè)不間斷的1那我就給出2。\p,請(qǐng)復(fù)原這個(gè)矩陣。\n另外還有分?jǐn)?shù)系統(tǒng),標(biāo)注錯(cuò)一次-10分,標(biāo)注對(duì)一次+10分,初始500分,獲勝了+規(guī)格x50分。\n勝5局即可勝利。\n")
    
while win<=5:
    while True:
        try:
            guige=int(input("輸入規(guī)格,3x3輸入3,4x4輸入4,5x5輸入5,6x6輸入6"))
            if guige<3 or guige>6:
                raise(VauleError())
            break
        except:
            print("請(qǐng)正確輸入")
    
    print("正在生成題目…")
    yes_numpy=np.zeros((guige,guige))
    try_numpy=np.zeros((guige,guige))
    for i in range(guige):
        for j in range(guige):
            try_numpy[i][j]=None
    print(try_numpy)
    
    for i in range(guige):
        for j in range(guige):
            yes_numpy[i][j]=r.choice((1,0))
    print(yes_numpy)
    while True:#游戲開(kāi)始
    
        try:
            caozuo=int(input("輸入操作,標(biāo)注矩陣填1,查看目前改變矩陣填2,勝利偵測(cè)填3,查看行列信息填4,重新開(kāi)始填5。"))
            if caozuo<1 or caozuo>4:
                raise(ValueError())
        except:
            print("請(qǐng)正確輸入")
            continue
        
        if caozuo==1:
            
            while True:
                try:
                    gai_hang,gai_lie,gai_neirong=map(int,input("輸入標(biāo)注位置的行、列(下標(biāo)),以及改變成0還是1(用空格隔開(kāi)三個(gè)值)\n").split())
                    if gai_neirong<0 or gai_neirong>1:
                        print("只能改變成0和1,",end="")
                        raise(ValueError())
                    if gai_hang>=guige or gai_lie>=guige:
                        print("輸入超出規(guī)格,",end="")
                        raise(ValueError())
                    break
                except:
                    print("請(qǐng)正確輸入")
                
            try_numpy[gai_hang][gai_lie]=gai_neirong
            if try_numpy[gai_hang][gai_lie]==yes_numpy[gai_hang][gai_lie]:
                defen+=10
            else:
                defen-=10
            print("標(biāo)注成功")
            continue
        
        if caozuo==2:
            print(try_numpy)
            continue
        if caozuo==3:
            if np.all(yes_numpy==try_numpy):
                print("你勝利了!")
                zhuangtai="win"
                defen+=200
                break
            else:
                print("還不對(duì)哦!")
                continue
        if caozuo==4:
            for i in range(guige):
                print("第",i,"行:")
                for j in range(guige):
                    if yes_numpy[i][j]==1:
                        shu+=1
                    if yes_numpy[i][j]==0:
                        if shu!=0:
                            print(shu,end="")
                        shu=0
                if shu!=0:
                    print(shu)
                shu=0
                print()
            shu=0
            for j in range(guige):
                print("第",j,"列:")
                for i in range(guige):
                    if yes_numpy[i][j]==1:
                        shu+=1
                    if yes_numpy[i][j]==0:
                        if shu!=0:
                            print(shu,end="")
                        shu=0
                if shu!=0:
                    print(shu)
                shu=0
                print()
        if caozuo==5:
            zhuangtai= "0 "
            break
    if zhuangtai=="win":
        win+=1
print("獲勝達(dá)到5局!你真厲害!目前的分:",defen)

注:代碼的第26和31行為了方便測(cè)試直接輸出了兩個(gè)矩陣,玩的之后刪了這兩行代碼就行。

到此這篇關(guān)于利用Python還原方陣游戲詳解的文章就介紹到這了,更多相關(guān)Python還原方陣游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python讀取properties配置文件操作示例

    Python讀取properties配置文件操作示例

    這篇文章主要介紹了Python讀取properties配置文件操作,結(jié)合實(shí)例形式分析了Python讀取properties配置文件操作中增加對(duì)鍵值對(duì)支持與使用的相關(guān)技巧,需要的朋友可以參考下
    2018-03-03
  • Pyinstaller打包報(bào)錯(cuò)小結(jié)

    Pyinstaller打包報(bào)錯(cuò)小結(jié)

    本文主要介紹了Pyinstaller打包報(bào)錯(cuò)小結(jié),詳細(xì)的介紹了5種錯(cuò)誤的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • 解決pytorch 損失函數(shù)中輸入輸出不匹配的問(wèn)題

    解決pytorch 損失函數(shù)中輸入輸出不匹配的問(wèn)題

    這篇文章主要介紹了解決pytorch 損失函數(shù)中輸入輸出不匹配的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Python利用socket實(shí)現(xiàn)多進(jìn)程的端口掃描器

    Python利用socket實(shí)現(xiàn)多進(jìn)程的端口掃描器

    作為開(kāi)發(fā)人員經(jīng)常需要查看服務(wù)的端口開(kāi)啟狀態(tài)判斷服務(wù)是否宕機(jī)。特別是部署的服務(wù)比較多的情況下,可能存在幾個(gè)甚至幾十個(gè)服務(wù)端口的占用。所以本文將利用socket實(shí)現(xiàn)多進(jìn)程的端口掃描器,需要的可以參考一下
    2022-12-12
  • 詳解Flask數(shù)據(jù)庫(kù)的連接與使用

    詳解Flask數(shù)據(jù)庫(kù)的連接與使用

    這篇文章主要為大家想想介紹了Python中Flask數(shù)據(jù)庫(kù)的連接與使用,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-02-02
  • 基于python繪制科赫雪花

    基于python繪制科赫雪花

    這篇文章主要為大家詳細(xì)介紹了基于python繪制科赫雪花,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Python3+SQLAlchemy+Sqlite3實(shí)現(xiàn)ORM教程

    Python3+SQLAlchemy+Sqlite3實(shí)現(xiàn)ORM教程

    這篇文章主要介紹了Python3+SQLAlchemy+Sqlite3實(shí)現(xiàn)ORM教程,需要的朋友可以參考下
    2021-02-02
  • Python微醫(yī)掛號(hào)網(wǎng)醫(yī)生數(shù)據(jù)抓取

    Python微醫(yī)掛號(hào)網(wǎng)醫(yī)生數(shù)據(jù)抓取

    今天小編就為大家分享一篇關(guān)于Python微醫(yī)掛號(hào)網(wǎng)醫(yī)生數(shù)據(jù)抓取,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • python3.6之xlwt如何設(shè)置單元格對(duì)齊方式

    python3.6之xlwt如何設(shè)置單元格對(duì)齊方式

    這篇文章主要介紹了python3.6之xlwt如何設(shè)置單元格對(duì)齊方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • python切割圖片的示例

    python切割圖片的示例

    這篇文章主要介紹了利用python切割圖片的示例,幫助大家更好的利用python處理圖片,感興趣的朋友可以了解下
    2020-11-11

最新評(píng)論