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

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

前言

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

c48ff8a381e8455083f2347e2c44bdef.png

相关准备 💞

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

游戏规则


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 = 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
    def 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.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
            return True
        else:
            return False
    def addaHouse(self, isPressYes):  # 在建筑物上添加一个房子
        try:
            if isPressYes and self.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
                return True
            else:
                return False
        except:
            pass
    def move(self, buildings, allplayers):  # 移动方法 返回值是所在的建筑位置
        self.dice_value = random.randint(1, 6)
        self.position += self.dice_value
        if self.position >= 16:
            self.position -= 16
        self.locatedBuilding = self.judgePosition(buildings)
        self.isShowText = True
        return self.eventInPosition(allplayers)
    def eventInPosition(self, allplayers):  # 判断在建筑位置应该发生的事件
        building = self.locatedBuilding
        if 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.price
                    textLine3 = '过路收费:%d' % building.payment
                    textLine4 = '是否购买?'
                    self.showText = [textLine0, textLine1, textLine2, textLine3, textLine4]
                    return True
                else:
                    self.addaHouse(not self.buyaBuilding(True))
                # ----- 动画 -------
                # ----- 是否购买 ------
            elif building.owner == self.name:  # 路过自己的房子开始加盖建筑!
                if self.pohuaishen == 1:
                    textLine0 = self.name + '破坏神附体!'
                    textLine1 = '摧毁了自己的房子!'
                    building.owner = 'no'
                    building.wasBought = False
                    self.showText = [textLine0, textLine1]
                    self.pohuaishen = 0
                else:
                    if self.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]
                        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 = 0
                        else:
                            if self.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:
                                if self.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 + ',被收费!'
                                    if self.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 来解决!然后加入了幸运事件功能!
            # 后来发现 try except 弊端太大 找不到错误的根源 换为if else嵌套。。
            whichone = self.dice_value % 4
            if whichone == 0:
                self.caishen = 1
                textLine2 = '遇到了财神!'
                textLine3 = '免一次过路费!'
            if whichone == 1:
                self.shuaishen = 1
                textLine2 = '遇到了衰神!'
                textLine3 = '过路费加倍一次!'
            if whichone == 2:
                self.tudishen = 1
                textLine2 = '遇到了土地神!'
                textLine3 = '强占一次房子!'
            if whichone == 3:
                self.pohuaishen = 1
                textLine3 = '摧毁路过的房子!'
                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 = name
        self.price = price
        self.payment = payment
        self.location = location
        self.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)


相关文章
|
3月前
|
Python
用python进行视频剪辑源码
这篇文章提供了一个使用Python进行视频剪辑的源码示例,通过结合moviepy和pydub库来实现视频的区间切割和音频合并。
78 2
|
25天前
|
JSON 开发工具 git
基于Python和pygame的植物大战僵尸游戏设计源码
本项目是基于Python和pygame开发的植物大战僵尸游戏,包含125个文件,如PNG图像、Python源码等,提供丰富的游戏开发学习素材。游戏设计源码可从提供的链接下载。关键词:Python游戏开发、pygame、植物大战僵尸、源码分享。
|
2月前
|
IDE 开发工具 Python
Python扑克游戏编程---摸大点
Python扑克游戏编程---摸大点
62 1
|
2月前
|
自然语言处理 Java 编译器
为什么要看 Python 源码?它的结构长什么样子?
为什么要看 Python 源码?它的结构长什么样子?
40 2
|
2月前
|
Python
源码解密 Python 的 Event
源码解密 Python 的 Event
49 1
|
3月前
|
Python
python编写下象棋游戏|4-14
python编写下象棋游戏|4-14
|
3月前
|
人工智能 算法 图形学
总有一个是你想要的分享40个Python游戏源代码
这是一系列基于Python开发的游戏项目集合,包括中国象棋、麻将、足球、坦克大战、扑克等多种类型游戏,运用了Pygame等库实现图形界面与AI算法。此外还包含迷宫、数独、推箱子等益智游戏及经典游戏如《仙剑奇侠传二战棋版》和《星露谷物语》的Python版本,适合编程学习与娱乐。
150 11
|
2月前
|
数据采集 前端开发 Python
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
88 0
|
3月前
|
消息中间件 数据采集 数据库
庆祝吧!Python IPC让进程间的合作,比团队游戏还默契
【9月更文挑战第7天】在这个数字化时代,软件系统日益复杂,单进程已难以高效处理海量数据。Python IPC(进程间通信)技术应运而生,使多进程协作如同训练有素的电竞战队般默契。通过`multiprocessing`模块中的Pipe等功能,进程间可以直接传递数据,无需依赖低效的文件共享或数据库读写。此外,Python IPC还提供了消息队列、共享内存和套接字等多种机制,适用于不同场景,使进程间的合作更加高效、精准。这一技术革新让开发者能轻松应对复杂挑战,构建更健壮的软件系统。
46 1
|
4月前
|
Ubuntu Linux 数据安全/隐私保护
使用Cython库包对python的py文件(源码)进行加密,把python的.py文件生成.so文件并调用
本文介绍了在Linux系统(Ubuntu 18.04)下将Python源代码(`.py文件`)加密为`.so文件`的方法。首先安装必要的工具如`python3-dev`、`gcc`和`Cython`。然后通过`setup.py`脚本使用Cython将`.py文件`转化为`.so文件`,从而实现源代码的加密保护。文中详细描述了从编写源代码到生成及调用`.so文件`的具体步骤。此方法相较于转化为`.pyc文件`提供了更高的安全性。
225 2

热门文章

最新文章