Python+numpy實現(xiàn)一個蜘蛛紙牌游戲
1.過程
蜘蛛紙牌大家玩過沒有?之前的電腦上自帶的游戲,用他來摸魚過的舉個手。
但是現(xiàn)在的電腦上已經(jīng)沒有蜘蛛紙牌了。所以……
可不可以自己做一個呢?
想法有了,實踐開始。
首先,應(yīng)該怎么寫?首選的方案就是pygame和numpy。
最后選了numpy。一是因為作者用電腦的時間比較短,沒有時間力,而手機(jī)的在線編譯器可以用numpy,不能用pygame。二是因為之前了解過numpy,但是pygame當(dāng)時都沒安裝,是昨天才安裝完畢的三是因為想挑戰(zhàn)一下自己。下次可以試試用pygame。
所以一個動都沒動過numpy的小白開始努(作)力(死)。
從10月30日寫到11月9日,中間提問了14個問題,查詢了大約五十多個資料,修復(fù)了20多個bug,很感謝回答我的問題的人。
numpy有一個缺點就是只能輸入輸出,自己要移動哪些牌,移動到哪里,很耗費(fèi)時間,于是把三次輸入硬生生壓縮成了一次,有些難理解,并且對于被蓋住的牌,只能用數(shù)字99表示了。整體有些出入。
中間有一次寫了四五個小時代碼,結(jié)果手殘點到返回主頁了沒保存,心態(tài)崩了
還好還是完成了。如果程序運(yùn)行有bug,可以指出
游戲規(guī)則見代碼里
2.思路
整體思路:
1,創(chuàng)造空矩陣a,在0,1,2,3行和第四行的0,1,2,3列變成99牌,定義函數(shù)qipai來起一列牌。創(chuàng)建列表pai,并通過詢問難度來定義不同的牌。
2,定義函數(shù)shan0,為了美觀和不占地方,將矩陣a的全0行刪除
3,操作移動,用input詢問要移動的牌,信息:移動的牌在第幾列?第幾行到第幾行?要移動到哪一列?之后將范圍里的牌存儲到列表yidong里并清0,再依次賦值到移動到的那一列。期間的錯誤操作如移動的牌順序不相接,移動之后的位置不相接等,通過扣得分處罰(絕對不是因為作者懶不想再返回原位置)
4,操作看規(guī)則,print無腦就行
5,操作翻99牌,循環(huán)從下往上偵測,當(dāng)偵測到99牌將這個位置在pai里隨機(jī)賦值,做出錯誤操作處理
6,操作起牌,調(diào)用函數(shù)就行
7,操作收牌,從下往上偵測是否有x.01,如果有,則開始偵測上面的牌是否按規(guī)律排列,按照規(guī)律則依次變成0,否則繼續(xù)偵測x.01作出沒有可收牌的處理
8,完善,修改bug,設(shè)置開始和結(jié)束語
3.配置
首先要python是必不可少的,其次是numpy模塊。
快捷鍵win+R,輸入cmd進(jìn)入終端。如果沒有pip包給爺上網(wǎng)查下載(bushi,輸入pip install numpy安裝,安裝完成之后輸入:
import numpy ???????numpy.zeros((3,3))
如果報錯則是沒安裝,輸出了一個3x3的矩陣則成功安裝了。
4.代碼
import random#導(dǎo)入隨機(jī)數(shù)模塊 import numpy as np#導(dǎo)入numpy模塊 def qipai():#定義函數(shù)qipai,用來起一行牌 xunhuan=40 jiange=1 for xunhuan1 in range(0,10):#一列一列偵測 while xunhuan == xunhuan:#死循環(huán) xunhuan=xunhuan-1#xunhuan自減, if a[xunhuan][xunhuan1] != 0:#如果xunhuan行不是零,偵測到其他數(shù)字 chu=a[xunhuan+1][xunhuan1]=random.choice(pai)#將他的上一行變成pai里面的任意一個并用變量儲存 pai.remove(chu)#刪除這一個數(shù) break#偵測下一列 if xunhuan == 0:#如果檢測到了最后還沒有數(shù)字就是這一列沒有數(shù)字 chu=a[0][xunhuan1]=random.choice(pai)#在0行隨機(jī)發(fā)放數(shù)字并用變量儲存 pai.remove(chu)#刪除這一個數(shù) break#偵測下一列 xunhuan=40#變量變換 def shan0():#刪除矩陣中所有0行 o = np.sum(a == 0, axis=1) liebiao = [] for xunhuan2 in range(len(o)): q = o.tolist()[xunhuan2] if q == 10: liebiao.append(xunhuan2)#問的大佬,我也看不懂 global newa#全局變量 newa=np.delete(a,liebiao,0)#newa為刪除零行后的a,僅僅是顯示作用,改變在a上改變 print("正在發(fā)牌") a=np.zeros((40,10))#40x10的全0矩陣 nandu=int(input("請選擇難度,簡單輸入1,中等輸入2,困難輸入3"))#選擇難度 if nandu == 1:#簡單難度 pai=[1.01,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.10,1.11,1.12,1.13]#一種花色 pai=pai*8#自乘 elif nandu == 2:#中等難度 pai=[1.01,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.10,1.11,1.12,1.13,2.01,2.02,2.03,2.04,2.05,2.06,2.07,2.08,2.09,2.10,2.11,2.12,2.13]#兩種花色 pai=pai*4#自乘 elif nandu == 3:#困難難度 pai=[1.01,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.10,1.11,1.12,1.13,2.01,2.02,2.03,2.04,2.05,2.06,2.07,2.08,2.09,2.10,2.11,2.12,2.13,3.01,3.02,3.03,3.04,3.05,3.06,3.07,3.08,3.09,3.10,3.11,3.12,3.13,4.01,4.02,4.03,4.04,4.05,4.06,4.07,4.08,4.09,4.10,4.11,4.12,4.13]#四種花色 pai=pai*2#自乘 print("難度設(shè)置完畢") for xunhuan in range(0,10): a[0][xunhuan]=99 xunhuan=0 for xunhuan in range(0,10): a[1][xunhuan]=99 xunhuan=0 for xunhuan in range(0,10): a[2][xunhuan]=99 xunhuan=0 for xunhuan in range(0,10): a[3][xunhuan]=99 a[4][0]=99 a[4][1]=99 a[4][2]=99 a[4][3]=99#設(shè)置99牌站位 dh=0 s=0 chu=0 t=0 xunhuan=0 jiange=0 xunhuan1=0 zuobi=0 defen=1000 qi=5 lie3=0 ktsfwl=0 wuyong=0 zuobima=0 #初始化變量 qipai()#開局起牌 while 1 == 1:#死循環(huán) shan0()#刪除0行 if defen <= 0:#得分變成0時游戲失敗 print("得分為0,游戲失敗?。?!") print(3/0)#沒啥好方法了,讓他自己報錯吧 print(newa,"\n")#輸出牌局 print(" 0 1 2 3 4 5 6 7 8 9")#輸出索引間距 print("目前得分:",defen)#說目前的得分 if np.where(a!=0)[0].shape[0]==0:#如果矩陣為全0 break#游戲成功,退出死循環(huán) caozuo,lie1,hang1,hang2,lie2 =map(int,input("輸入5個數(shù)字,不知道規(guī)則請輸入2 0 0 0 0(用索引形式)\n").split())#詢問操作并執(zhí)行命令,規(guī)則見上 if caozuo == 1: #要移動牌 if a[hang1][lie1] != 0 and a[hang2+1][lie1] == 0:#hang1和hang2不等于零且hang2的下面沒有牌才執(zhí)行移動 if a[hang2][lie1] != 0: xunhuan=hang1#將hang1到hang2的牌保存到y(tǒng)idong yidong=[]#空列表 while xunhuan <= hang2:#開始偵測 yidong.append(a[xunhuan][lie1])#添加這個數(shù) a[xunhuan][lie1]=0#將這個數(shù)變成0 xunhuan=xunhuan+1#自增 xunhuan=0 if len(yidong) != 1:#yidong的長度不是1才執(zhí)行規(guī)律偵測 while xunhuan < len(yidong)-1:#-1是因為后面有yidong[xunhuan+1],為了不越界 wuyong=yidong[xunhuan]-yidong[xunhuan+1]-0.01 sxc=f'{wuyong:.3f}'#大佬教的浮點數(shù)四舍五入三位,前面的牌-后面的牌-0.01=x.00時 if str(sxc)[:-3]!='000': defen=defen-50#defen減50 print("移動的牌不按規(guī)律排列,作弊次數(shù)+1") break#偵測到作弊 xunhuan=xunhuan+1 xunhuan=0 while xunhuan == xunhuan:#死循環(huán)偵測,從上往下 if a[xunhuan][lie2] != 0:#偵測到不為0 xunhuan=xunhuan+1#偵測下一行 else:#此時xunhuan是該列最后一個數(shù)字所在行數(shù)的下一行 xunhuan=xunhuan-1#切換到上一行,該數(shù)字 if a[0][lie2] != 0:#矩陣這一列的0行不是0 ktsfwl=0 dh=a[xunhuan][lie2]#dh變成該數(shù)字在的位置 else:#若是0,則是直接移動 ktsfwl=1 xunhuan1=0 while xunhuan1 < len(yidong):#xunhuan1為yidong的長度時 geduan=yidong[xunhuan1]#賦值 a[xunhuan+1+xunhuan1][lie2]=geduan xunhuan1=xunhuan1+1#xunhuan自增 if ktsfwl == 1:#0行是0,取消偵測,直接退出 print("移動成功") defen=defen-5 break wuyong=dh-a[xunhuan+1][lie2]-0.01 sxc=f'{wuyong:.3f}'#這一行減移動的首個數(shù)字減0.01的差為x.00 if str(sxc)[-3:] =='000': print("移動成功") defen=defen-5#移動成功 break elif str(a[xunhuan+1][lie2])[:-2] =='.1' and str(dh)[:-3]=='.11':#如果是.11和.1相接也是移動成功 defen=defen-5 print("移動成功") break else:#兩種情況都不是 print("移動的位置不相接,作弊次數(shù)加一") defen=defen-50 zuobi=zuobi+1#判斷作弊 break continue#下一次操作 else: print("請輸入正確的范圍") defen=defen-10 continue else: print("請輸入正確的范圍") defen=defen-10 continue if caozuo == 2:#查看規(guī)則時 print("規(guī)則:共有104個數(shù)字,10組,數(shù)字的小數(shù)點前代表花色,小數(shù)點后代表點數(shù),牌只能放在比他數(shù)值大0.01,花色任意 的牌上,將一樣花色的牌按照13到1的順序排列再輸入5即可消除這一組牌") print("下面的x指輸入的第二個數(shù)字,y是第三個,z是第四個,w是第五個") print("將8組牌全部消除則勝利。其中移動牌是將在第x列的第y到第z行的牌移動到第w列,翻99牌則是翻x列標(biāo)注99的牌,下面沒牌之后才能翻。起一行牌則是起一行備用的牌,一行牌會覆蓋在下面,共5組。消除牌則是將x列13到1順序排列并同樣花色的牌全部消除") print("第一個數(shù)字如果移動牌輸入1,看規(guī)則輸入2,翻99牌輸入3,起牌輸入4,消除牌輸入5") print("按照上面的要求輸入五個數(shù)字,用空格隔開,輸入行列要用索引形式,如果用不到第2,3,4,5個數(shù)字輸入0") print("得分初始為1000,正常操作-5,犯規(guī)操作-50,錯誤操作-10,若得分為0則游戲失敗,消除一次牌+500") print("索引是啥給爺自己查,懶得寫") continue#下一次操作 if caozuo == 3:#翻99牌時 xunhuan=6#因為只有5行上面會有99牌,節(jié)省時間 if a[0][lie1] != 99:#0行都不是99牌,錯誤操作 print("該列沒有99牌") defen=defen-10 continue#下一次操作 while xunhuan >= 0:#循環(huán)檢測第一個99牌 print("a") xunhuan=xunhuan-1#自減 if a[xunhuan][lie1] == 99:#檢測到99牌 chu=a[xunhuan][lie1]=random.choice(pai)#將99牌的位置隨機(jī)發(fā)放牌 pai.remove(chu)#刪除該數(shù)字 print("已經(jīng)揭牌") defen=defen-5 break#跳出循環(huán) elif a[xunhuan][lie1] != 0:#檢測到不是0也不是99的數(shù) print("99牌下面還有其他的牌")#下面還有其他的牌 defen=defen-10 break continue#下一次操作 if caozuo == 4:#起牌 if qi == 0:#如果牌堆沒牌了 print("已經(jīng)沒有牌可以起了") defen=defen-10 else:#牌堆有牌 qipai()#執(zhí)行函數(shù)qipai print("已經(jīng)為您起牌") qi=qi-1#自減牌堆數(shù)量 defen=defen-5 continue#下一次操作 if caozuo == 5:#消除牌 xunhuan=40#從40行往下檢測 jiange=2#定義 while xunhuan == xunhuan:#開始檢測 jiange=0 if xunhuan==11:#已經(jīng)不夠13張牌時還沒有x.01 print("沒有可以消除的牌") defen=defen-10 break xunhuan=xunhuan-1#自減 wuyong=a[xunhuan][lie1]-0.01 sxc=f'{wuyong:.3f}'#sxc為上減下減0.01 if str(sxc)[-3:] == '000':#出現(xiàn)x.01 xunhuan1=xunhuan#此時xunhuan為x.01所在行數(shù) while xunhuan1 == xunhuan1:#死循環(huán)檢測上-下是否為0.01 if xunhuan1==xunhuan-12:#12次后沒有發(fā)現(xiàn)錯誤 xunhuan2=0#消除成功 while xunhuan2<=12:#依次消除 a[xunhuan-xunhuan2][lie1]=0#x.01在的行數(shù)依次減1,2…后的行數(shù)為0 xunhuan2=xunhuan2+1#自增 jiange=0#jiange為0,是因為正確運(yùn)行跳出循環(huán)的 break wuyong=a[xunhuan1-1][lie1]-a[xunhuan1][lie1]-0.01 sxc=f'{wuyong:.3f}' if str(sxc)[-5:]=='0.000':#循環(huán)偵測上下差值-0.01是否為0 xunhuan1=xunhuan1-1#自減 else:#這個0.01上面并不按規(guī)律排列 jiange=1#是因為不按規(guī)律排列而退出循環(huán) break if jiange == 0:#偵測是因為什么跳出循環(huán),如果因為正確操作 print("已經(jīng)移除") defen=defen+500 break #非正確操作接著檢測 continue#檢測結(jié)束后繼續(xù)下一次操作 #退出循環(huán),游戲勝利 print("恭喜獲勝") print("您目前的得分為",defen,"作弊了",zuobi,"次,游戲結(jié)束!")#報成績
四.效果圖
到此這篇關(guān)于Python+numpy實現(xiàn)一個蜘蛛紙牌游戲的文章就介紹到這了,更多相關(guān)Python numpy蜘蛛紙牌游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Python學(xué)習(xí)RabbitMQ消息隊列
RabbitMQ和郵局的主要區(qū)別就是RabbitMQ接收、存儲和發(fā)送的是二進(jìn)制數(shù)據(jù)----消息,本篇文章給大家介紹利用Python學(xué)習(xí)RabbitMQ消息隊列,對python消息隊列相關(guān)知識感興趣的朋友參考下2015-11-11Python量化交易實戰(zhàn)之使用Resample函數(shù)轉(zhuǎn)換“日K”數(shù)據(jù)
resample函數(shù)是Python數(shù)據(jù)分析庫Pandas的方法函數(shù),它主要用于轉(zhuǎn)換時間序列的頻次,今天通過本文給大家分享python使用Resample函數(shù)轉(zhuǎn)換時間序列的相關(guān)知識,感興趣的朋友一起看看吧2021-06-06Python3 使用cookiejar管理cookie的方法
今天小編就為大家分享一篇Python3 使用cookiejar管理cookie的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python如何統(tǒng)計函數(shù)調(diào)用的耗時
這篇文章主要為大家詳細(xì)介紹了如何使用Python實現(xiàn)統(tǒng)計函數(shù)調(diào)用的耗時,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04