当前位置:首页>python>Python实战项目之大富翁

Python实战项目之大富翁

  • 2026-09-05 00:01:40
Python实战项目之大富翁

大富翁是一款经典的休闲策略类桌面游戏,核心玩法围绕掷骰子前进、购买土地、缴纳过路费、触发随机事件展开,玩家通过资产积累击败对手。本文以Python为开发语言,基于控制台交互实现简化版大富翁小游戏,包含完整代码、逐行代码解析、开发逻辑拆解,全文约3000字,适合Python初学者巩固基础语法、函数、循环、条件判断、列表字典等核心知识点。

一、项目需求分析

本项目为控制台版简化大富翁,核心功能规划如下:

1. 支持2名玩家对战,区分玩家身份与初始资产;

2. 模拟掷骰子随机前进,步数1-6随机生成;

3. 地图包含土地、随机事件、空地三种格子;

4. 玩家可购买未归属的土地,其他玩家经过需缴纳过路费;

5. 触发随机事件(奖励现金、罚款、原地停留);

6. 实时展示玩家位置、资产、土地归属;

7. 资产为负则判定破产,对手获胜,游戏结束。

二、开发环境与核心知识点

1. 开发环境

- Python 3.x(无需第三方库,纯原生代码实现)

- 运行工具:IDLE、PyCharm、VS Code均可

2. 核心知识点

- 基础语法:变量、输入输出、循环、条件判断

- 数据结构:列表(存储地图)、字典(存储玩家信息)

- 函数封装:模块化拆分掷骰子、移动、购买土地、事件触发等功能

- 随机数模块: random 实现骰子点数与随机事件

- 逻辑控制:游戏主循环、胜负判定、交互逻辑

三、完整项目代码

python  

# 导入随机数模块,用于掷骰子和随机事件

import random

import time

# -------------------------- 游戏初始化配置 --------------------------

# 定义游戏地图,0=空地,1=可购买土地,2=随机事件格子

game_map = [0, 1, 2, 1, 0, 1, 2, 1, 0, 1,

            2, 1, 0, 1, 2, 1, 0, 1, 2, 1]

# 土地价格与过路费配置,索引对应地图位置

land_price = [0, 500, 0, 600, 0, 700, 0, 550, 0, 800,

               0, 650, 0, 750, 0, 600, 0, 900, 0, 700]

land_toll = [0, 100, 0, 150, 0, 200, 0, 120, 0, 250,

             0, 180, 0, 220, 0, 160, 0, 300, 0, 200]

# 初始化玩家信息,使用字典存储

player1 = {

    "name": "玩家1",

    "position": 0,    # 初始位置

    "money": 3000,    # 初始资金

    "lands": []       # 拥有的土地索引

}

player2 = {

    "name": "玩家2",

    "position": 0,

    "money": 3000,

    "lands": []

}

# -------------------------- 游戏核心功能函数 --------------------------

def roll_dice():

    """模拟掷骰子,返回1-6的随机数"""

    print("\n正在掷骰子...")

    time.sleep(1)

    num = random.randint(1, 6)

    print(f"掷出点数:{num}")

    return num

def move_player(player, steps):

    """移动玩家位置,处理地图循环"""

    total_pos = player["position"] + steps

    # 地图长度为20,超出则循环

    player["position"] = total_pos % len(game_map)

    print(f"{player['name']} 移动到位置 {player['position']}")

def trigger_event(player):

    """触发随机事件,奖励/罚款/停留"""

    event_type = random.randint(1, 4)

    if event_type == 1:

        reward = random.randint(200, 500)

        player["money"] += reward

        print(f"触发好运事件!获得奖励 {reward} 元")

    elif event_type == 2:

        fine = random.randint(100, 400)

        player["money"] -= fine

        print(f"触发意外事件!缴纳罚款 {fine} 元")

    elif event_type == 3:

        print("触发停留事件!本轮无法操作")

        return True

    else:

        print("平安无事,未触发任何事件")

    return False

def buy_land(player, pos):

    """处理土地购买逻辑"""

    price = land_price[pos]

    if player["money"] >= price:

        player["money"] -= price

        player["lands"].append(pos)

        print(f"{player['name']} 花费 {price} 元购买了位置 {pos} 的土地")

    else:

        print("资金不足,无法购买该土地")

def pay_toll(player, owner):

    """缴纳过路费给土地所有者"""

    pos = player["position"]

    toll = land_toll[pos]

    if player["money"] >= toll:

        player["money"] -= toll

        owner["money"] += toll

        print(f"{player['name']} 向 {owner['name']} 缴纳过路费 {toll} 元")

    else:

        # 资金不足全额抵扣,所有者获得剩余资金

        owner["money"] += player["money"]

        player["money"] = 0

        print(f"{player['name']} 资金不足,剩余资产全部抵扣过路费")

def check_bankruptcy(player):

    """检查玩家是否破产"""

    return player["money"] < 0

def show_status(player1, player2):

    """展示双方玩家当前状态"""

    print("\n==================== 玩家状态 ====================")

    print(f"{player1['name']}:位置 {player1['position']},资金 {player1['money']} 元,拥有土地 {player1['lands']}")

    print(f"{player2['name']}:位置 {player2['position']},资金 {player2['money']} 元,拥有土地 {player2['lands']}")

    print("==================================================\n")

# -------------------------- 游戏主循环 --------------------------

def main_game():

    """游戏主逻辑"""

    print("========== 欢迎来到Python大富翁小游戏 ==========")

    print("游戏规则:掷骰子前进,购买土地收取过路费,资金为负即破产")

    input("按回车键开始游戏...")

    current_player = player1  # 初始玩家1先手

    while True:

        # 展示玩家状态

        show_status(player1, player2)

        print(f"当前回合:{current_player['name']}")

        input("按回车键掷骰子...")

        # 掷骰子并移动

        steps = roll_dice()

        move_player(current_player, steps)

        current_pos = current_player["position"]

        # 判断当前格子类型

        grid_type = game_map[current_pos]

        # 1. 空地:无操作

        if grid_type == 0:

            print("当前位置为空地,无任何操作")

        # 2. 土地格子:判断归属

        elif grid_type == 1:

            # 判断土地是否已被购买

            if current_pos in player1["lands"]:

                print("当前土地为自己所有,无需操作")

            elif current_pos in player2["lands"]:

                # 确定所有者

                owner = player2 if current_pos in player2["lands"] else player1

                pay_toll(current_player, owner)

            else:

                # 未被购买,询问是否购买

                choice = input(f"该土地可购买,价格 {land_price[current_pos]} 元,是否购买?(y/n):")

                if choice.lower() == "y":

                    buy_land(current_player, current_pos)

                else:

                    print("放弃购买该土地")

        # 3. 随机事件格子

        elif grid_type == 2:

            print("到达随机事件格子!")

            skip_turn = trigger_event(current_player)

            if skip_turn:

                # 触发停留事件,切换回合

                current_player = player2 if current_player == player1 else player1

                continue

        # 检查是否破产

        if check_bankruptcy(player1):

            print(f"\n{player1['name']} 破产!{player2['name']} 获胜!")

            break

        if check_bankruptcy(player2):

            print(f"\n{player2['name']} 破产!{player1['name']} 获胜!")

            break

        # 切换玩家回合

        current_player = player2 if current_player == player1 else player1

        print("="*50)

# 启动游戏

if __name__ == "__main__":

    main_game()

四、代码逐行深度分析

(一)模块导入部分

python  

import random

import time

1.  random :核心用于生成骰子点数(1-6)和随机事件类型,是游戏随机性的核心依赖;

2.  time :通过 time.sleep(1) 实现掷骰子的延迟效果,提升游戏交互体验,避免操作过快。

(二)游戏初始化配置

1. 地图定义

python  

game_map = [0, 1, 2, 1, 0, 1, 2, 1, 0, 1,2, 1, 0, 1, 2, 1, 0, 1, 2, 1]

使用列表模拟20格大富翁地图,用数字区分格子类型:0=空地、1=土地、2=随机事件,通过索引对应位置,方便后续逻辑判断。

2. 土地价格与过路费

python  

land_price = [0, 500, 0, 600,...]

land_toll = [0, 100, 0, 150,...]

两个列表与地图索引一一对应,空地对应价格和过路费为0,土地格子设置不同数值,增加游戏策略性。

3. 玩家信息初始化

用字典存储玩家核心属性:姓名、位置、资金、拥有土地,字典结构清晰,便于后续修改和读取属性。

(三)核心功能函数解析

1. 掷骰子函数 roll_dice() 

- 无参数,返回1-6随机整数;

- 加入 time.sleep(1) 模拟真实掷骰子的等待过程;

- 打印点数,实现可视化交互。

2. 移动函数 move_player() 

- 接收玩家字典和骰子步数,计算新位置;

- 用 总位置%地图长度 实现地图循环,避免超出列表索引;

- 实时打印玩家位置,清晰展示移动结果。

3. 随机事件函数 trigger_event() 

- 生成1-4随机数对应4种事件:奖励、罚款、停留、无事件;

- 直接修改玩家资金,返回布尔值判断是否跳过回合;

- 随机数值范围可调整,平衡游戏难度。

4. 购买土地函数 buy_land() 

- 校验玩家资金是否足够,足够则扣除资金并将土地索引加入玩家土地列表;

- 资金不足则提示失败,保证游戏逻辑合理。

5. 过路费函数 pay_toll() 

- 计算过路费,扣除当前玩家资金,增加土地所有者资金;

- 处理资金不足的边界情况,避免出现负数异常。

6. 状态展示与破产检查

-  show_status() 实时打印双方资产、位置、土地,让玩家清晰掌握局势;

-  check_bankruptcy() 通过判断资金是否小于0,快速判定胜负。

(四)游戏主循环 main_game() 

1. 游戏启动

打印欢迎语和规则,等待玩家输入开始游戏,降低上手门槛。

2. 回合制逻辑

- 初始设定玩家1先手,通过 current_player 切换回合;

- 每回合先展示状态,再掷骰子移动,符合大富翁传统玩法。

3. 格子类型判断

根据当前位置的地图数值,分别处理空地、土地、事件格子,逻辑分层清晰,无冗余代码。

4. 胜负判定

每回合结束后检查玩家是否破产,破产则立即结束循环并宣布获胜者。

五、游戏运行流程详细分析

1. 启动阶段

运行代码后,控制台打印欢迎界面,玩家按回车进入

最新文章

随机文章