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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。