【写在前面:其实我也不知道这是不是面向对象,感觉上是吧= =毕竟非计算机专业的课教得太浅,比较深的计算机专业课一方面没时间去蹭课,另一方面也怕听不懂……】
最近一不小心沉迷于某个卡牌游戏,奈何游戏内的玩家有点少,尤其是半夜很难凑成一房(而且没有开挂的乐趣),于是就想试着给自己写个陪玩。
游戏名叫“炸弹猫”,规则大致是这样的:
- 各个玩家轮流摸牌,摸到炸弹如果没有“解除”卡牌,即出局。
- 各个卡牌有不同的作用。
- 最后未出局的玩家获胜。
卡牌有很多种,包括解除(解除炸弹)、跳过(跳过本轮摸牌)、反转(跳过本轮摸牌并改变顺逆时针)、攻击(叠加摸牌次数转移给某人)、侦察(查看牌堆顶X张牌)、洗牌、抽底(抽牌堆底部)、乞讨(向其他玩家索要一张)……当然,还有炸弹(没有解除的情况下摸到就出局)。
正好学了一个学期的python,于是就打算从零开始先完成游戏的基本逻辑,再写个AI陪玩。
整体思路是这样的:一共三个类,一个牌堆类,用于控制牌堆和玩家的手牌(堆);一个玩家类,用于存一些玩家状态;一个游戏控制类,呃……我也不知道怎么说这个部分,反正整个游戏的判断逻辑都写在这个里面。其实我也不知道为什么要这么分= =好像一开始写的时候没这么打算的,写着写着就这样了……好在最后能跑起来。所以这样应该算是面向对象了吧……
至于AI部分,原计划是打算写在一个AI控制类里的,但是不知道怎么就写到游戏控制逻辑里面去了= =而且还有很严重的bug(比如AI明明使用了侦查看到了下一张牌是炸弹,还去摸这张牌死了)。由于当时没有很清楚地理清AI的逻辑,先一股脑儿写然后就成这坨烂代码了……改也改不好……记录一下以此为戒!
这应该是我第一次面向对象程序设计的尝试,可以说是有点失败了233没能达到自己的预期。不过至少自己和自己斗智斗勇还是可以的,还可以加几个弱智AI陪玩2333
最后附上github地址和游戏效果图(懒得写GUI了,命令行凑合一下):https://github.com/RainbowHerry/boomcat

import random
class Card:
cardlist=["0解除","1跳过","2反转","3攻击","4侦察","5洗牌","6抽底","7乞讨","8自爆","9炸弹"]
def __init__(self,num,pile=False):
self.num=num
if(pile):
self.lst=[random.randint(0,8) for ovo in range(self.num-1)]+[9]*(pile-1)+[7]*pile
random.shuffle(self.lst)
else:
self.lst=[0]+[random.randint(1,8) for ovo in range(self.num-1)]
def _showlist(self):
for i in self.lst:
print(self.cardlist[i],end=" ")
print()
def delwhere(self,where):
del self.lst[where]
def delwhat(self,what):
loc=self.lst.index(what)
del self.lst[loc]
def foreseelist(self,where):
print("你看到了:",end="")
if(where>=len(self.lst)):
where=len(self.lst)-1
for i in range(where-1):
print(self.cardlist[self.lst[i]],end=",")
print(self.cardlist[self.lst[where]],end="!\n")
def shufflelist(self):
random.shuffle(self.lst)
def takeone(self,up=True):
if(up):
cardtaken=self.lst[0]
del self.lst[0]
else:
cardtaken=self.lst[-1]
del self.lst[-1]
return cardtaken
def addone(self,crd):
self.lst.append(crd)
def addwhere(self,crd,where):
self.lst.insert(where,crd)
def locate9(self):
return self.lst.index(9)
def locatewhat(self,what):
try:
return self.lst.index(what)
except:
return False
def takewhere(self,where):
cardtaken=self.lst[where]
del self.lst[where]
return cardtaken
def __str__(self):
res=""
for i in self.lst:
res+=self.cardlist[i]+" "
return res
class Player:
num=0
#There are some bugs in AI part. If you need to play with AI, change "ai=False" to "ai=True"
def __init__(self,ai=False):
self.num=Player.num
Player.num+=1
self.card=Card(5)
self.alive=True
self.times=0
self.ai=ai
def __str__(self):
return str(self.num)+";"+str(self.card)+";"+str(self.alive)+";"+str(self.times)
def isalive(self):
return self.alive
def isai(self):
return self.ai
class GameCtrl:
def __init__(self,playernum):
self.playernum=playernum
self.pile=Card(playernum*7,pile=playernum)
self.playerlst=[]
self.alivelst=[]
self.runing=True
self.winner=""
self.r=False
for i in range(self.playernum-1):
self.playerlst.append(Player())
self.playerlst.append(Player(ai=False))
self.alivelst=self.playerlst.copy()
self.turn=random.randint(0,playernum-1)
def _showall(self):
print("self.playernum:",self.playernum)
print("self.pile:",self.pile)
for i in self.playerlst:
print("self.player:",i)
def showbasicinfo(self):
print(r"牌堆还有{0}张牌,抽中炸弹的几率为{1}%;".format(len(self.pile.lst),int((100*(len(self.alivelst)-1))/len(self.pile.lst))),end="")
for i in self.alivelst:
print(i.num,"号玩家还有",len(i.card.lst),"张牌;",sep="",end="")
print()
def nextturn(self):
print("-"*10)
alives=0
for i in self.playerlst:
if(i.isalive()):
self.winner=i.num
alives+=1
if(alives==1):
self.runing=False
if(self.r):
for ovo in range(self.playernum):
if(self.turn<self.playernum-1):
self.turn+=1
else:
self.turn=self.turn+1-self.playernum
try:
if(self.playerlst[self.turn].isalive()):
break
except:
self.turn=0
else:
for ovo in range(self.playernum):
if(self.turn>0):
self.turn-=1
else:
self.turn=self.turn-1+self.playernum
try:
if(self.playerlst[self.turn].isalive()):
break
except:
self.turn=self.playernum
def dointurn(self):
self.playerlst[self.turn].times+=1
def aidointurn():
def aitakeone():
self.playerlst[self.turn].times-=1
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)牌堆摸了一张牌!")
tko=self.pile.takeone()
if(tko==9):
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)摸到了炸弹!")
if "0" in str(self.playerlst[self.turn].card):
self.playerlst[self.turn].card.delwhat(0)
wh=random.randint(0,len(self.pile.lst)-1)
self.pile.addwhere(9,wh)
return False
else:
self.playerlst[self.turn].alive=False
del self.alivelst[self.alivelst.index(self.playerlst[self.turn])]
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)阵亡!")
return True
else:
self.playerlst[self.turn].card.addone(tko)
while self.playerlst[self.turn].times>0:
atkus=False
if(self.pile.locate9()-1>self.playerlst[self.turn].times):
if(self.playerlst[self.turn].card.locatewhat(8)):
if(random.randint(1,100)%4!=1):
self.playerlst[self.turn].card.delwhat(8)
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)打出[自爆]!")
self.playerlst[self.turn].times+=2
if(aitakeone()):
break
else:
continue
else:
if(self.playerlst[self.turn].card.locatewhat(4)):
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)使用了[侦察]!")
self.playerlst[self.turn].card.delwhat(4)
if(self.pile.locate9()>1):
if(random.randint(1,100)%2==1):
if(aitakeone()):
break
else:
continue
if(random.randint(1,100)%2==1):
if(aitakeone()):
break
else:
continue
if(self.playerlst[self.turn].times):
seed=random.randint(1,100)
if(seed%2==0):
if(self.playerlst[self.turn].card.locatewhat(1)):
self.playerlst[self.turn].card.delwhat(1)
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)打出[跳过]!")
self.playerlst[self.turn].times-=1
continue
if(seed%2==1):
if(self.playerlst[self.turn].card.locatewhat(2)):
self.playerlst[self.turn].card.delwhat(2)
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)打出[反转]!")
self.r=not(self.r)
self.playerlst[self.turn].times-=1
continue
if(seed%2==1):
if(self.playerlst[self.turn].card.locatewhat(5)):
self.playerlst[self.turn].card.delwhat(5)
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)打出[洗牌]!")
self.pile.shufflelist()
continue
if(seed%2==0):
if(self.playerlst[self.turn].card.locatewhat(6)):
if(self.pile.lst[-1]!=9):
self.playerlst[self.turn].card.delwhat(6)
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)打出[抽底]!")
crd=self.pile.takeone(up=False)
if(crd!=9):
self.playerlst[self.turn].card.addone(crd)
self.playerlst[self.turn].times-=1
continue
else:
if "0" in str(self.playerlst[self.turn].card):
self.playerlst[self.turn].card.delwhat(0)
wh=random.randint(0,len(self.pile.lst)-1)
self.pile.addwhere(9,wh)
continue
else:
self.playerlst[self.turn].alive=False
del self.alivelst[self.alivelst.index(self.playerlst[self.turn])]
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)阵亡!")
break
if(seed%5!=4):
if(self.playerlst[self.turn].card.locatewhat(7)):
self.playerlst[self.turn].card.delwhat(7)
qt=self.alivelst[random.randint(1,100)%len(self.alivelst)]
while(qt==self.playerlst[self.turn]):
qt=self.alivelst[random.randint(1,100)%len(self.alivelst)]
qt=qt.num
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)向"+str(qt)+"号玩家打出[乞讨]!")
self.playerlst[self.turn].card.addone(self.playerlst[qt].card.takewhere(-1))
continue
while(self.pile.locate9()<=1):
a=self.playerlst[self.turn].card.locatewhat(1)
b=self.playerlst[self.turn].card.locatewhat(2)
c=self.playerlst[self.turn].card.locatewhat(3)
if(a and b):
self.playerlst[self.turn].card.delwhat(1)
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)打出[跳过]!")
atkus=True
self.playerlst[self.turn].times-=1
break
elif(a):
self.playerlst[self.turn].card.delwhat(1)
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)打出[跳过]!")
atkus=True
self.playerlst[self.turn].times-=1
break
elif(b):
self.playerlst[self.turn].card.delwhat(2)
print(str(self.playerlst[self.turn].num)+"号玩家(BOT)打出[反转]!")
atkus=True
self.r=not(self.r)
self.playerlst[self.turn].times-=1
break
else:
if(c):
self.playerlst[self.turn].card.delwhat(3)
atk=self.alivelst[random.randint(1,100)%len(self.alivelst)]
while(atk==self.playerlst[self.turn]):
atk=self.alivelst[random.randint(1,100)%len(self.alivelst)]
atk=atk.num
atkus=True
tmp=self.playerlst[self.turn].times
self.playerlst[self.turn].times=0
self.playerlst[atk].times=tmp+2
self.turn=atk
break
if(atkus):
continue
else:
if(aitakeone()):
break
else:
continue
if(self.playerlst[self.turn].isai()):
aidointurn()
else:
self.showbasicinfo()
while self.playerlst[self.turn].times>0:
usecard=input("你是"+str(self.turn)+"号玩家("+str(self.playerlst[self.turn].times)+"次),手牌有:"+str(self.playerlst[self.turn].card)+"\n你要使用:")
if(usecard=="" or (int(usecard) in self.playerlst[self.turn].card.lst)):
if(usecard=="0"):
print("解除不可主动打出!")
if(usecard=="1"):
self.playerlst[self.turn].card.delwhat(1)
self.playerlst[self.turn].times-=1
if(usecard=="2"):
self.playerlst[self.turn].card.delwhat(2)
self.r=not(self.r)
self.playerlst[self.turn].times-=1
if(usecard=="3"):
self.playerlst[self.turn].card.delwhat(3)
atk=input("你要攻击0-"+str(self.playernum-1)+"号玩家:")
try:
if(self.playerlst[int(atk)].alive):
tmp=self.playerlst[self.turn].times
self.playerlst[self.turn].times=0
self.playerlst[int(atk)].times=tmp+2
self.turn=int(atk)
self.dointurn()
except:
print("玩家无效!")
continue
if(usecard=="4"):
self.playerlst[self.turn].card.delwhat(4)
self.pile.foreseelist(3)
if(usecard=="5"):
self.playerlst[self.turn].card.delwhat(5)
self.pile.shufflelist()
if(usecard=="6"):
self.playerlst[self.turn].card.delwhat(6)
crd=self.pile.takeone(up=False)
if(crd!=9):
self.playerlst[self.turn].card.addone(crd)
self.playerlst[self.turn].times-=1
continue
else:
if "0" in str(self.playerlst[self.turn].card):
self.playerlst[self.turn].card.delwhat(0)
wh=input("BOOM!你要把炸弹放在第0-"+str(len(self.pile.lst)-1)+"张:")
try:
self.pile.addwhere(9,int(wh))
except:
self.pile.addwhere(9,0)
continue
else:
self.playerlst[self.turn].alive=False
print("你("+str(self.turn)+"号玩家)摸到炸弹阵亡了!")
del self.alivelst[self.alivelst.index(self.playerlst[self.turn])]
break
self.playerlst[self.turn].times-=1
if(usecard=="7"):
self.playerlst[self.turn].card.delwhat(7)
#
qt=input("你要向0-"+str(self.playernum-1)+"号玩家乞讨:")
try:
if(self.playerlst[int(qt)].alive):
self.playerlst[self.turn].card.addone(self.playerlst[int(qt)].card.takewhere(-1))
except:
print("玩家无效!")
continue
if(usecard=="8"):
self.playerlst[self.turn].card.delwhat(8)
self.playerlst[self.turn].times+=2
if(usecard==""):
self.playerlst[self.turn].times-=1
tko=self.pile.takeone()
if(tko==9):
if "0" in str(self.playerlst[self.turn].card):
self.playerlst[self.turn].card.delwhat(0)
wh=input("BOOM!你要把炸弹放在第0-"+str(len(self.pile.lst)-1)+"张:")
try:
self.pile.addwhere(9,int(wh))
except:
self.pile.addwhere(9,0)
continue
else:
self.playerlst[self.turn].alive=False
print("你("+str(self.turn)+"号玩家)摸到炸弹阵亡了!")
del self.alivelst[self.alivelst.index(self.playerlst[self.turn])]
break
else:
self.playerlst[self.turn].card.addone(tko)
else:
print("此卡不存在!")
continue
gc=GameCtrl(4)
while(gc.runing):
#gc._showall()
gc.dointurn()
gc.nextturn()
print("游戏结束!获胜的是",gc.winner,"号玩家。",sep="")




Warning: A non-numeric value encountered in /www/wwwroot/i.pegasi.top/wp-content/themes/begin/inc/function/comment-template.php on line 31
2019年07月24日 15:21 -49楼
Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/wwwroot/i.pegasi.top/wp-content/themes/begin/inc/function/setting.php on line 1367