大富翁是一款经典的休闲策略类桌面游戏,核心玩法围绕掷骰子前进、购买土地、缴纳过路费、触发随机事件展开,玩家通过资产积累击败对手。本文以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. 启动阶段
运行代码后,控制台打印欢迎界面,玩家按回车进入