python版大富翁源代码分享
本文实例为大家分享了python版大富翁游戏的具体代码,供大家参考,具体内容如下
#-*-coding:utf-8-*-
#codeby:物网141王璞劼Khalil
#name:理工大富翁beta2.0
#describe:基于python的一个2D大富翁游戏
'''
1.游戏地图为自己使用各种网络素材制作;
各种按钮和选项,小图标等也是使用PS制作。
2.声音效果主要为背景音乐和几种游戏中音效;
3.游戏设定了两个类:玩家和建筑
玩家的参数和方法都在代码中给出;
具体有:移动方法、位置判断方法、
购买房屋方法、添加小房子方法、
事件判断方法。
4.玩家在大富翁的主要操作是投掷骰子,由随机函数
进行判定然后进行移动,进行位置判断,然后开始
进行相关的判定。
5.游戏中的按键有:是、否、和结束回合;
每个按键由没按下与按下两种状态的图片组成,
这个设计花费了一定时间。
还有开始游戏和扔骰子的两个明暗按钮,
由pygame优化后的一个函数实现。
6.玩家的位置与电脑重叠时会将双方的位置进行一定
偏移,防止进行覆盖,分不清自己的位置。
7.游戏基础功能有移动,购买房子,在已经购买的房子下
搭建新的小房子增加过路费,被收费,判断胜负的基础
功能,此外还加入了幸运事件:
财神-免收费一次
衰神-双倍被收费一次
破坏神-直接破坏一个建筑无论敌我
土地神-强占对面建筑
这四项功能在位置处于左上角和右下角的时候会被触发,
添加了很多游戏乐趣哦~~~^_^
8.游戏基于python的一个模块pygame实现,给我提供了很
多快乐的时光,谢谢老师的阅览与郭宁同学的协助答辩
:)
'''
#####################准备工作##################
#初始化各种模块
importpygame
importrandom
importsys
#定义类
classPlayer():
def__init__(self,image,name,isPlayer):
self.name=name
self.money=10000
self.isGoingToMove=False
self.movable=True
self.image=image
self.position=0
self.temp_position=False
self.dice_value=0
self.locatedBuilding=0
self.showText=[]
self.isPlayer=isPlayer
self.ownedBuildings=[]
self.isShowText=False
self.soundPlayList=0
self.caishen=0
self.shuaishen=0
self.tudishen=0
self.pohuaishen=0
defjudgePosition(self,buildings):#位置判断返回值是所在位置的建筑
foreachinbuildings:
foreveryineach.location:
ifself.position==every:
returneach
#当使用元组时当元组中只有一个元素时发现该元素不可迭代
#出现错误换成列表后解决
'''
try:
foreveryineach.location:
ifself.position==every:
print(each.name)
except:
ifself.position==every:
print(each.name)
'''
defbuyaBuilding(self,isPressYes):#购买方法
ifisPressYesandself.locatedBuilding.owner!=self.name:
self.locatedBuilding.owner=self.name
self.locatedBuilding.wasBought=True
self.ownedBuildings.append(self.locatedBuilding)
self.money-=self.locatedBuilding.price
self.showText=[self.name+'购买了'+self.locatedBuilding.name+'!']
self.soundPlayList=1
returnTrue
else:
returnFalse
defaddaHouse(self,isPressYes):#在建筑物上添加一个房子
try:
ifisPressYesandself.locatedBuilding.owner==self.name:
self.locatedBuilding.builtRoom+=1
self.money-=self.locatedBuilding.payment
self.showText=[self.name+'在'+self.locatedBuilding.name+'上!','盖了一座房子!',\
'有%d'%self.locatedBuilding.builtRoom+'个房子了!',\
"它的过路费是%d"%(self.locatedBuilding.payment*\
(self.locatedBuilding.builtRoom+1))]
self.soundPlayList=2
returnTrue
else:
returnFalse
except:
pass
defmove(self,buildings,allplayers):#移动方法返回值是所在的建筑位置
self.dice_value=random.randint(1,6)
self.position+=self.dice_value
ifself.position>=16:
self.position-=16
self.locatedBuilding=self.judgePosition(buildings)
self.isShowText=True
returnself.eventInPosition(allplayers)
defeventInPosition(self,allplayers):#判断在建筑位置应该发生的事件
building=self.locatedBuilding
ifbuilding.name!='空地':
ifself.locatedBuilding.wasBought==False:#未购买的时候显示建筑的数据!
ifself.isPlayer==True:
textLine0=self.name+'扔出了'+'%d'%self.dice_value+'点!'
textLine1=self.name+'来到了'+building.name+'!'
textLine2='购买价格:%d'%building.price
textLine3='过路收费:%d'%building.payment
textLine4='是否购买?'
self.showText=[textLine0,textLine1,textLine2,textLine3,textLine4]
returnTrue
else:
self.addaHouse(notself.buyaBuilding(True))
#-----动画-------
#-----是否购买------
elifbuilding.owner==self.name:#路过自己的房子开始加盖建筑!
ifself.pohuaishen==1:
textLine0=self.name+'破坏神附体!'
textLine1='摧毁了自己的房子!'
building.owner='no'
building.wasBought=False
self.showText=[textLine0,textLine1]
self.pohuaishen=0
else:
ifself.isPlayer==True:
textLine0=self.name+'扔出了'+'%d'%self.dice_value+'点!'
textLine1='来到了ta的'+self.locatedBuilding.name+'!'
textLine2='可以加盖小房子!'
textLine3='加盖收费:%d'%building.payment
textLine4='是否加盖?'
self.showText=[textLine0,textLine1,textLine2,textLine3,textLine4]
returnTrue
#-----动画-------
else:
self.addaHouse(True)
else:
foreachinallplayers:#被收费!
ifself.locatedBuilding.owner==each.nameandeach.name!=self.name:
ifself.caishen==1:
textLine0=self.name+'财神附体!'
textLine1='免除过路费%d!'%(building.payment*(building.builtRoom+1))
self.showText=[textLine0,textLine1]
self.caishen=0
else:
ifself.tudishen==1:
textLine0=self.name+'土地神附体!'
textLine1='强占土地!'
textLine2=building.name+'现在属于'+self.name
self.locatedBuilding.owner=self.name
self.showText=[textLine0,textLine1,textLine2]
self.tudishen=0
else:
ifself.pohuaishen==1:
textLine0=self.name+'破坏神附体!'
textLine1='摧毁了对手的房子!'
building.owner='no'
building.wasBought=False
self.showText=[textLine0,textLine1]
self.pohuaishen=0
else:
textLine0=self.name+'扔出了'+'%d'%self.dice_value+'点!'
textLine1=self.name+'来到了'+each.name+'的:'
textLine2=building.name+',被收费!'
ifself.shuaishen==1:
textLine3='过路收费:%d*2!'%(building.payment*(building.builtRoom+1)*2)
self.shuaishen=0
else:
textLine3='过路收费:%d'%(building.payment*(building.builtRoom+1))
textLine4='哦!'+self.name+'好倒霉!'
self.showText=[textLine0,textLine1,textLine2,textLine3,textLine4]
#收费!
self.money-=building.payment*(building.builtRoom+1)
each.money+=building.payment*(building.builtRoom+1)
self.soundPlayList=3
#-----动画-------
else:
#发现不能处理在空地上的情况于是使用try&except来解决!然后加入了幸运事件功能!
#后来发现tryexcept弊端太大找不到错误的根源换为ifelse嵌套。。
whichone=self.dice_value%4
ifwhichone==0:
self.caishen=1
textLine2='遇到了财神!'
textLine3='免一次过路费!'
ifwhichone==1:
self.shuaishen=1
textLine2='遇到了衰神!'
textLine3='过路费加倍一次!'
ifwhichone==2:
self.tudishen=1
textLine2='遇到了土地神!'
textLine3='强占一次房子!'
ifwhichone==3:
self.pohuaishen=1
textLine3='摧毁路过的房子!'
textLine2='遇到了破坏神!'
textLine0=self.name+'扔出了'+'%d'%self.dice_value+'点!'
textLine1='来到了运气地点!'
self.showText=[textLine0,textLine1,textLine2,textLine3]
classBuilding():#好像所有功能都在Player类里实现了=_=
def__init__(self,name,price,payment,location):
self.name=name
self.price=price
self.payment=payment
self.location=location
self.wasBought=False#是否被购买
self.builtRoom=0#小房子建造的数目
self.owner='no'
#带透明度的绘图方法byturtle2333
defblit_alpha(target,source,location,opacity):
x=location[0]
y=location[1]
temp=pygame.Surface((source.get_width(),source.get_height())).convert()
temp.blit(target,(-x,-y))
temp.blit(source,(0,0))
temp.set_alpha(opacity)
target.blit(temp,location)
########################主函数#########################
defmain():
pygame.init()
clock=pygame.time.Clock()
#初始化屏幕
size=(1270,768)
screen=pygame.display.set_mode(size)
pygame.display.set_caption("理工大大富翁-madeby王璞劼")
#读取字体以及有关数据
textColorInMessageBox=(141,146,152)
white=(255,255,255)
black=(0,0,0)
red=(255,0,0)
font=pygame.font.Font('resource\\font\\myfont.ttf',30)
#读取资源
backgroud=pygame.image.load("resource\\pic\\GameMap.png")
chess=pygame.image.load("resource\\pic\\chess.png")
chess_com=pygame.image.load("resource\\pic\\chess1.png")
bigdice_image=pygame.image.load("resource\\pic\\dice.png").convert_alpha()
dice_1=pygame.image.load("resource\\pic\\dice_1.png")
dice_2=pygame.image.load("resource\\pic\\dice_2.png")
dice_3=pygame.image.load("resource\\pic\\dice_3.png")
dice_4=pygame.image.load("resource\\pic\\dice_4.png")
dice_5=pygame.image.load("resource\\pic\\dice_5.png")
dice_6=pygame.image.load("resource\\pic\\dice_6.png")
dices=[dice_1,dice_2,dice_3,dice_4,dice_5,dice_6]
yes=pygame.image.load("resource\\pic\\yes.png")
yes2=pygame.image.load("resource\\pic\\yes2.png")
no=pygame.image.load("resource\\pic\\no.png")
no2=pygame.image.load("resource\\pic\\no2.png")
GameStart=pygame.image.load("resource\\pic\\GameStart.png")
StartGameButton=pygame.image.load("resource\\pic\\StartGameButton.png").convert_alpha()
turnover=pygame.image.load("resource\\pic\\turnover.png")
turnover2=pygame.image.load("resource\\pic\\turnover2.png")
shuaishen=pygame.image.load("resource\\pic\\shuaishen.png").convert_alpha()
tudishen=pygame.image.load("resource\\pic\\tudishen.png").convert_alpha()
caishen=pygame.image.load("resource\\pic\\caishen.png").convert_alpha()
pohuaishen=pygame.image.load("resource\\pic\\pohuaishen.png").convert_alpha()
rollDiceSound=pygame.mixer.Sound("resource\\sound\\rolldicesound.wav")
bgm=pygame.mixer.music.load("resource\\sound\\bgm.ogg")
throwcoin=pygame.mixer.Sound("resource\\sound\\throwcoin.wav")
moneysound=pygame.mixer.Sound("resource\\sound\\moneysound.wav")
aiyo=pygame.mixer.Sound("resource\\sound\\aiyo.wav")
didong=pygame.mixer.Sound("resource\\sound\\didong.wav")
#PlayList在对象中设置应该播放的声音
playList=[moneysound,throwcoin,aiyo]
#各种Surface的rect
bigdice_rect=bigdice_image.get_rect()
bigdice_rect.left,bigdice_rect.top=50,600
yes_rect=yes.get_rect()
yes_rect.left,yes_rect.top=500,438
no_rect=no.get_rect()
no_rect.left,no_rect.top=630,438
button_rect=StartGameButton.get_rect()
button_rect.left,button_rect.top=1003,30
turnover_rect=turnover.get_rect()
turnover_rect.left,turnover_rect.top=1035,613
#实例化对象
players=[]
computers=[]
allplayers=[]
player_1=Player(chess,'玩家',True)
player_com1=Player(chess_com,'电脑',False)
players.append(player_1)
computers.append(player_com1)
allplayers.append(player_1)
allplayers.append(player_com1)
presentPlayer=player_com1
#初始化建筑物数据
gate=Building('大门',1000,200,[1,2])
fountain=Building('喷泉',2000,400,[3,4])
path=Building('小道',800,160,[5])
library=Building('图书馆',2000,400,[6,7])
kongdi1=Building('空地',0,0,[8])
classroomTen=Building('教十',1200,240,[9,10])
classroomNine=Building('教九',1200,240,[11,12])
resOne=Building('三餐厅',800,160,[13])
resTwo=Building('二餐厅',800,160,[14])
resThree=Building('一餐厅',800,160,[15])
kongdi2=Building('空地',0,0,[0])
buildings=[gate,fountain,path,library,classroomNine,\
classroomTen,resOne,resThree,resTwo,kongdi1,kongdi2]
#坐标数据同时处理坐标数据使之合适
MapXYvalue=[(435.5,231.5),(509.5,231.5),(588.5,231.5),(675.5,231.5),(758.5,231.5),\
(758.5,317.0),(758.5,405.5),(758.5,484.5),(758.5,558.5),(679.5,558.5),\
(601.5,558.5),(518.5,556.5),(435.5,556.5),(435.5,479.5),(435.5,399.0),\
(435.5,315.5)
]
MapChessPosition_Player=[]
MapChessPosition_Com=[]
MapChessPosition_Original=[]
MapChessPosition_Payment=[]
MapMessageBoxPosition=(474.1,276.9)
YesNoMessageBoxPosition=[(500,438),(630,438)]
StartGameButtonPosition=(1003,30)
TurnOvwrButtonPosition=(1035,613)
#调整位置
foriinrange(0,16):
MapChessPosition_Original.append((MapXYvalue[i][0]-50,MapXYvalue[i][1]-80))
MapChessPosition_Player.append((MapXYvalue[i][0]-70,MapXYvalue[i][1]-60))
MapChessPosition_Com.append((MapXYvalue[i][0]-30,MapXYvalue[i][1]-100))
MapChessPosition_Payment.append((MapXYvalue[i][0]-30,MapXYvalue[i][1]-15))
#循环时所用的一些变量
running=True
image_alpha=255
button_alpha=255
half_alpha=30
showdice=True
showYes2=False
showNo2=False
showYes_No=False
pressYes=False
whetherYes_NoJudge=False
gameStarted=False
showButton2=False
#播放背景音乐
pygame.mixer.music.play(100)
#################进入游戏循环!########################
#循环开始!
whilerunning:
ifnotgameStarted:
foreventinpygame.event.get():
ifevent.type==pygame.QUIT:
sys.exit()
#明暗触发鼠标位置判断
ifevent.type==pygame.MOUSEMOTION:
ifbutton_rect.collidepoint(event.pos):
button_alpha=255
else:
button_alpha=120
ifevent.type==pygame.MOUSEBUTTONDOWN:
ifbutton_rect.collidepoint(event.pos):#按下按钮
didong.play()
gameStarted=True
screen.blit(GameStart,(0,0))
blit_alpha(screen,StartGameButton,StartGameButtonPosition,button_alpha)
ifgameStarted:
foreventinpygame.event.get():
ifevent.type==pygame.QUIT:
sys.exit()
#明暗触发鼠标位置判断
ifevent.type==pygame.MOUSEMOTION:
ifbigdice_rect.collidepoint(event.pos):
image_alpha=255
else:
image_alpha=190
ifevent.type==pygame.MOUSEBUTTONDOWN:
ifbigdice_rect.collidepoint(event.pos):#按骰子
ifpresentPlayer!=player_1:
rollDiceSound.play(1,2000)
pygame.time.delay(2000)
showYes_No=player_1.move(buildings,allplayers)
whetherYes_NoJudge=showYes_No
presentPlayer=player_1
else:
presentPlayer.showText=['还没到你的回合!']
ifturnover_rect.collidepoint(event.pos):#按回合结束
showButton2=True
ifpresentPlayer!=player_com1:
showYes_No=player_com1.move(buildings,allplayers)
presentPlayer=player_com1
else:
presentPlayer.showText=['还没到你的回合!']
else:
showButton2=False
#不显示Yes_No的时候不能点击它们!
ifwhetherYes_NoJudge==True:
ifyes_rect.collidepoint(event.pos):#按是否
showYes2=True
ifno_rect.collidepoint(event.pos):#按是否
showNo2=True
ifevent.type==pygame.MOUSEBUTTONUP:
ifturnover_rect.collidepoint(event.pos):#按回合结束
showButton2=False
ifyes_rect.collidepoint(event.pos):#按是否
showYes2=False
showYes_No=False
#只有在可以判定的时候才能算按下了是同时将判断条件置为空
ifwhetherYes_NoJudge==True:
pressYes=True
whetherYes_NoJudge=False
ifno_rect.collidepoint(event.pos):#按是否
showNo2=False
pressYes=False
showYes_No=False
whetherYes_NoJudge=False
#测试事件选项
ifevent.type==pygame.KEYDOWN:
ifevent.key==pygame.K_w:
showYes_No=player_1.move(buildings,allplayers)
whetherYes_NoJudge=showYes_No
presentPlayer=player_1
ifevent.key==pygame.K_q:
showYes_No=player_com1.move(buildings,allplayers)
presentPlayer=player_com1
'''foreachinallplayers:
ifeach.isGoingToMove==Trueandeach.movable==True:
showYes_No=each.move(buildings,allplayers)
each.movable=False
each.isGoingToMove=False'''
'''
allisready=True
foreachinallplayers:
ifeach.movable==True:
allisready=False
ifallisready:
foreachinallplayers:
each.movable=True
'''
#购买房屋!!!!!!!!
ifpresentPlayer.buyaBuilding(pressYes)==True:
pressYes=False
ifpresentPlayer.addaHouse(pressYes)==True:
pressYes=False
#########################################################################
screen.blit(backgroud,(0,0))
blit_alpha(screen,bigdice_image,(50,600),image_alpha)
textPosition=[MapMessageBoxPosition[0],MapMessageBoxPosition[1]]
#打印信息
foreachinpresentPlayer.showText:
text=font.render(each,True,white,textColorInMessageBox)
screen.blit(text,textPosition)
textPosition[1]+=30
#播放行动声音
ifpresentPlayer.soundPlayList!=0:
playList[presentPlayer.soundPlayList-1].play()
presentPlayer.soundPlayList=0
#在位置上显示过路费
foriinrange(1,8):
foreachinbuildings:
foreveryineach.location:
ifi==every:
ifeach.owner==presentPlayer.name:
text=font.render('%d'%(each.payment*(each.builtRoom+1))\
,True,red)
elifeach.owner=='no':
text=font.render('%d'%(each.payment*(each.builtRoom+1))\
,True,white)
elifeach.owner!=presentPlayer.nameandeach.owner!='no':
text=font.render('%d'%(each.payment*(each.builtRoom+1))\
,True,black)
screen.blit(text,MapChessPosition_Payment[i])
foriinrange(9,16):
foreachinbuildings:
foreveryineach.location:
ifi==every:
ifeach.owner==presentPlayer.name:
text=font.render('%d'%(each.payment*(each.builtRoom+1))\
,True,red)
elifeach.owner=='no':
text=font.render('%d'%(each.payment*(each.builtRoom+1))\
,True,white)
elifeach.owner!=presentPlayer.nameandeach.owner!='no':
text=font.render('%d'%(each.payment*(each.builtRoom+1))\
,True,black)
screen.blit(text,MapChessPosition_Payment[i])
#打印金钱数和幸运状态
money_1=font.render(player_1.name+'金钱:%d'%player_1.money,True,black,white)
screen.blit(money_1,(0,0))
ifplayer_1.pohuaishen==True:
screen.blit(pohuaishen,(0,30))
else:
blit_alpha(screen,pohuaishen,(0,30),half_alpha)
ifplayer_1.caishen==True:
screen.blit(caishen,(55,30))
else:
blit_alpha(screen,caishen,(55,30),half_alpha)
ifplayer_1.shuaishen==True:
screen.blit(shuaishen,(110,30))
else:
blit_alpha(screen,shuaishen,(110,30),half_alpha)
ifplayer_1.tudishen==True:
screen.blit(tudishen,(165,30))
else:
blit_alpha(screen,tudishen,(165,30),half_alpha)
money_2=font.render(player_com1.name+'金钱:%d'%player_com1.money,True,black,white)
screen.blit(money_2,(1000,0))
ifplayer_com1.pohuaishen==True:
screen.blit(pohuaishen,(1000,30))
else:
blit_alpha(screen,pohuaishen,(1000,30),half_alpha)
ifplayer_com1.caishen==True:
screen.blit(caishen,(1055,30))
else:
blit_alpha(screen,caishen,(1055,30),half_alpha)
ifplayer_com1.shuaishen==True:
screen.blit(shuaishen,(1110,30))
else:
blit_alpha(screen,shuaishen,(1110,30),half_alpha)
ifplayer_com1.tudishen==True:
screen.blit(tudishen,(1165,30))
else:
blit_alpha(screen,tudishen,(1165,30),half_alpha)
#放置扔出来的骰子
ifplayer_1.dice_value!=0andshowdice:
screen.blit(dices[player_1.dice_value-1],(70,450))
#放置回合结束按钮
ifshowButton2:
screen.blit(turnover2,TurnOvwrButtonPosition)
else:
screen.blit(turnover,TurnOvwrButtonPosition)
#放置是否按钮
ifshowYes_No==True:
screen.blit(yes,YesNoMessageBoxPosition[0])
screen.blit(no,YesNoMessageBoxPosition[1])
ifshowYes2==True:
screen.blit(yes2,YesNoMessageBoxPosition[0])
ifshowNo2==True:
screen.blit(no2,YesNoMessageBoxPosition[1])
#放置玩家与电脑的位置如果重合则挪位
foreachinplayers:
foreveryincomputers:
ifeach.position==every.position:
screen.blit(each.image,MapChessPosition_Player[each.position])
screen.blit(every.image,MapChessPosition_Com[every.position])
each.temp_position=True
every.temp_position=True
foreachinplayers:
ifeach.temp_position==False:
screen.blit(each.image,MapChessPosition_Original[each.position])
each.temp_position=True
each.temp_position=noteach.temp_position
foreveryincomputers:
ifevery.temp_position==False:
screen.blit(every.image,MapChessPosition_Original[every.position])
every.temp_position=True
every.temp_position=notevery.temp_position
#输赢判断
foreachinallplayers:
ifeach.money<=0:
font=pygame.font.Font('resource\\font\\myfont.ttf',200)
loseText=font.render(each.name+'输了!',True,red)
screen.fill(black)
screen.blit(loseText,(100,100))
font=pygame.font.Font('resource\\font\\myfont.ttf',30)
pygame.time.delay(3000)
#画面运行
pygame.display.flip()
clock.tick(60)#刷新率
#双击打开运行
if__name__=="__main__":
main()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。