【python游戏制作】大富翁游戏源码

news/2024/11/16 22:40:29/

前言

大富翁,又名地产大亨。是一种多人策略图版游戏。参与者分得游戏金钱,凭运气(掷骰子)及交易策略,买地、建楼以赚取租金。英文原名monopoly意为“垄断”,因为最后只得一个胜利者,其余均破产收场。游戏的设计当初旨在暴露放任资本主义的弊端,但是推出之后却受到大众欢迎。

相关准备 💞

在开始之前,我们要准备好游戏的相关素材~没有(不想找)的小伙伴可以找我领取呐`

游戏规则

1.游戏地图为自己使用各种网络素材制作;各种按钮和选项,小图标等也是使用PS制作。
2.声音效果主要为背景音乐和几种游戏中音效;
3.游戏设定了两个类:玩家和建筑
  玩家的参数和方法都在代码中给出;
  具体有:移动方法、位置判断方法、购买房屋方法、添加小房子方法、事件判断方法。
4.玩家在大富翁的主要操作是投掷骰子,由随机函数进行判定然后进行移动,进行位置判断,然后开始进行相关的判定。
5.游戏中的按键有:是、否、和结束回合;每个按键由没按下与按下两种状态的图片组成,
  这个设计花费了一定时间。还有 开始游戏 和 扔骰子 的两个明暗按钮,由pygame优化后的一个函数实现。
6.玩家的位置与电脑重叠时会将双方的位置进行一定偏移,防止进行覆盖,分不清自己的位置。
7.游戏基础功能有移动,购买房子,在已经购买的房子下搭建新的小房子增加过路费,被收费,判断胜负的基础功能,此外还加入了幸运事件:
    财神 - 免收费一次
    衰神 - 双倍被收费一次
    破坏神 - 直接破坏一个建筑 无论敌我
    土地神 - 强占对面建筑
  这四项功能在位置处于左上角和右下角的时候会被触发,
  添加了很多游戏乐趣哦~~~ ^_^

展示部分素材

 

游戏效果展示 

 

主要代码 

# 初始化各种模块
import pygame
import random
import sys# 定义类
class Player():def __init__(self, image, name, isPlayer):self.name = nameself.money = 10000self.isGoingToMove = Falseself.movable = Trueself.image = imageself.position = 0self.temp_position = Falseself.dice_value = 0self.locatedBuilding = 0self.showText = []self.isPlayer = isPlayerself.ownedBuildings = []self.isShowText = Falseself.soundPlayList = 0self.caishen = 0self.shuaishen = 0self.tudishen = 0self.pohuaishen = 0def judgePosition(self, buildings):  # 位置判断 返回值是所在位置的建筑for each in buildings:for every in each.location:if self.position == every:return each# 当使用元组时 当元组中只有一个元素时 发现该元素不可迭代# 出现错误 换成列表后解决''' try:for every in each.location:if self.position == every:print(each.name)except:if self.position == every:print(each.name)'''def buyaBuilding(self, isPressYes):  # 购买方法if isPressYes and self.locatedBuilding.owner != self.name:self.locatedBuilding.owner = self.nameself.locatedBuilding.wasBought = Trueself.ownedBuildings.append(self.locatedBuilding)self.money -= self.locatedBuilding.priceself.showText = [self.name + '购买了' + self.locatedBuilding.name + '!']self.soundPlayList = 1return Trueelse:return Falsedef addaHouse(self, isPressYes):  # 在建筑物上添加一个房子try:if isPressYes and self.locatedBuilding.owner == self.name:self.locatedBuilding.builtRoom += 1self.money -= self.locatedBuilding.paymentself.showText = [self.name + '在' + self.locatedBuilding.name + '上!', '盖了一座房子!', \'有%d' % self.locatedBuilding.builtRoom + '个房子了!', \"它的过路费是%d" % (self.locatedBuilding.payment * \(self.locatedBuilding.builtRoom + 1))]self.soundPlayList = 2return Trueelse:return Falseexcept:passdef move(self, buildings, allplayers):  # 移动方法 返回值是所在的建筑位置self.dice_value = random.randint(1, 6)self.position += self.dice_valueif self.position >= 16:self.position -= 16self.locatedBuilding = self.judgePosition(buildings)self.isShowText = Truereturn self.eventInPosition(allplayers)def eventInPosition(self, allplayers):  # 判断在建筑位置应该发生的事件building = self.locatedBuildingif building.name != '空地':if self.locatedBuilding.wasBought == False:  # 未购买的时候显示建筑的数据!if self.isPlayer == True:textLine0 = self.name + '扔出了' + '%d' % self.dice_value + '点!'textLine1 = self.name + '来到了' + building.name + '!'textLine2 = '购买价格:%d' % building.pricetextLine3 = '过路收费:%d' % building.paymenttextLine4 = '是否购买?'self.showText = [textLine0, textLine1, textLine2, textLine3, textLine4]return Trueelse:self.addaHouse(not self.buyaBuilding(True))# ----- 动画 -------# ----- 是否购买 ------elif building.owner == self.name:  # 路过自己的房子开始加盖建筑!if self.pohuaishen == 1:textLine0 = self.name + '破坏神附体!'textLine1 = '摧毁了自己的房子!'building.owner = 'no'building.wasBought = Falseself.showText = [textLine0, textLine1]self.pohuaishen = 0else:if self.isPlayer == True:textLine0 = self.name + '扔出了' + '%d' % self.dice_value + '点!'textLine1 = '来到了ta的' + self.locatedBuilding.name + '!'textLine2 = '可以加盖小房子!'textLine3 = '加盖收费:%d' % building.paymenttextLine4 = '是否加盖?'self.showText = [textLine0, textLine1, textLine2, textLine3, textLine4]return True# ----- 动画-------else:self.addaHouse(True)else:for each in allplayers:  # 被收费!if self.locatedBuilding.owner == each.name and each.name != self.name:if self.caishen == 1:textLine0 = self.name + '财神附体!'textLine1 = '免除过路费%d!' % (building.payment * (building.builtRoom + 1))self.showText = [textLine0, textLine1]self.caishen = 0else:if self.tudishen == 1:textLine0 = self.name + '土地神附体!'textLine1 = '强占土地!'textLine2 = building.name + '现在属于' + self.nameself.locatedBuilding.owner = self.nameself.showText = [textLine0, textLine1, textLine2]self.tudishen = 0else:if self.pohuaishen == 1:textLine0 = self.name + '破坏神附体!'textLine1 = '摧毁了对手的房子!'building.owner = 'no'building.wasBought = Falseself.showText = [textLine0, textLine1]self.pohuaishen = 0else:textLine0 = self.name + '扔出了' + '%d' % self.dice_value + '点!'textLine1 = self.name + '来到了' + each.name + '的:'textLine2 = building.name + ',被收费!'if self.shuaishen == 1:textLine3 = '过路收费:%d*2!' % (building.payment * (building.builtRoom + 1) * 2)self.shuaishen = 0else: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 来解决!然后加入了幸运事件功能!# 后来发现 try except 弊端太大 找不到错误的根源 换为if else嵌套。。whichone = self.dice_value % 4if whichone == 0:self.caishen = 1textLine2 = '遇到了财神!'textLine3 = '免一次过路费!'if whichone == 1:self.shuaishen = 1textLine2 = '遇到了衰神!'textLine3 = '过路费加倍一次!'if whichone == 2:self.tudishen = 1textLine2 = '遇到了土地神!'textLine3 = '强占一次房子!'if whichone == 3:self.pohuaishen = 1textLine3 = '摧毁路过的房子!'textLine2 = '遇到了破坏神!'textLine0 = self.name + '扔出了' + '%d' % self.dice_value + '点!'textLine1 = '来到了运气地点!'self.showText = [textLine0, textLine1, textLine2, textLine3]class Building():  # 好像所有功能都在Player类里实现了=_=def __init__(self, name, price, payment, location):self.name = nameself.price = priceself.payment = paymentself.location = locationself.wasBought = False  # 是否被购买self.builtRoom = 0  # 小房子建造的数目self.owner = 'no'# 带透明度的绘图方法 by turtle 2333
def blit_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)

 文章首发于公众号【编程乐趣】,欢迎大家关注。


http://www.ppmy.cn/news/438271.html

相关文章

PS4/XBOX迎来全新劲敌!游戏盒子市场前瞻

1 游戏盒子有何优势 回顶部 【PConline 杂谈】相信不少玩家最近都在关注游戏盒子和游戏主机的话题,由于上海自贸区的成立,传游戏主机如PS4和XBOX都会在本年度在国内上市的消息不绝于耳,而在游戏主机上市前的空窗期,国内的盒子厂商…

云游戏全面解析

翻译、编辑:Alex 技术审校:施澍 影音探索 #017# 上世纪七十年代,当电子游戏第一次出现时,它的主要市场目标用户是儿童。然而近些年来,它受到各个年龄段人群的喜爱。电子游戏不再是孩子们的简单爱好,它已拥…

索尼PS4 PS4 Pro和PS5有什么区别

S5拥有最新的AMD Zen 2处理器,能够播放3D音频和输出8K视频,而PS4及Pro则使用了更老的AMD Jaguar芯片,可以播放1080p高清视频。 PS5还拥有更大的内存(16GB vs 8GB)、更高的帧率(120fps vs 60fps)和更快的GPU (2.23GHz vs 0.8GHz)。 在硬盘存储…

游戏美术怎么制作?

众多周知,近几年中国游戏产业发展相当之快,大量的资源被集中在了端游和手游领域,从而出现了大量的游戏美术外包公司。 众所周知,原画是游戏制作的重要环节,优秀的游戏原画设计师,供不应求。同时待遇越高福利…

ps游戏在什么系统下开发_游戏陪玩系统源码搭建,游戏陪玩软件开发,这些关键你都知道吗?...

当电竞成为了一个专门的职业,电竞大神受到众人崇拜,游戏社交陪玩APP也因国内飞速发展的游戏电竞环境而获益,以比心为代表的游戏陪玩App异军突起,让人们的社交方式变得更加多元化。我们今天就来一起了解下游戏陪玩约玩类APP。 游戏…

换ssd后Oracle,PS4更换480G SSD,终于流畅了!附更换教程

PS4用了1年多了,游戏装多了之后越来越感觉读取游戏速度太慢,硬盘的噪声太大,于是萌生了更换SSD的想法。PS4用128G的SSD肯定不行,500G的SSD价格略贵,一直在犹豫之中,正好网上看到影驰SSD有款新产品性价比不错…

ps4和xbox是linux吗,算PC还是算主机!Steam主机、PS4、Xbox One硬件配置对比

主机党和PC党之间的“恩怨情仇”由来已久,在各大游戏网站上,我们总能见到他们互喷的身影。而次世代主机PS4及Xbox One又刚刚问世,这也给主机党们增加了“优越感”的筹码。不过,PC玩家们也毫不示弱,祭出Valve的Steam主机…

如何备份和还原PS4保存数据

Anthony McLaughlin/Shutterstock 安东尼麦克劳克林/ Shutterstock Whether you’ve logged 10 hours or 100 playing a game, starting over because something happened to the save file is gut-wrenching. Don’t let this happen to you! Back up your PS4 save data, and…