
在构建战舰游戏时,首先需要定义一些基本元素,如地图大小、船只类型以及用于显示和操作游戏板的函数。原始代码已经提供了这些基础:
这些函数构成了游戏的骨架,但在实现完整的游戏流程(即玩家和电脑轮流攻击直到一方所有船只被击沉)时,还需要进一步完善。
原始代码的主要挑战在于缺乏一个持续的游戏循环来管理回合制攻击,以及有效的机制来跟踪船只的命中状态和判断游戏结束。为了解决这些问题,我们需要引入以下概念:
为了支持上述逻辑,我们需要修改 check_player_hit 和 check_comp_hit 函数,并引入一个虚拟板。
此函数将接收电脑的真实船只板 (comp_board) 和玩家视角的虚拟板 (dummy_board)。
立即学习“Python免费学习笔记(深入)”;
def check_player_hit(comp_board, dummy_board, user):
"""
函数用于玩家攻击敌方船只的命中或未命中判定。
同时更新玩家视角的虚拟板。
"""
print(f"\n{user},请选择攻击坐标:")
while True:
try:
row = int(input("输入行 (0-9): "))
col = int(input("输入列 (0-9): "))
if 0 <= row < map_size and 0 <= col < map_size:
# 检查是否重复攻击
if dummy_board[row][col] != '_' and dummy_board[row][col] != '*':
print("你已经攻击过这个位置了,请选择其他位置。")
continue
break
else:
print("无效坐标,请重新输入。")
except ValueError:
print("输入无效,请输入整数。")
hit = 0 # 默认未命中
if comp_board[row][col] in ship_initial: # 如果是船只字母
# 击中船只,将电脑板上的船只标记为小写表示已击中
# 虚拟板上标记为'X'表示命中
original_ship_char = comp_board[row][col]
comp_board[row][col] = original_ship_char.lower()
dummy_board[row][col] = "X"
print(f"电脑:{ship_names[ship_initial.index(original_ship_char)]} 被击中了!")
hit = 1 # 命中
else:
dummy_board[row][col] = "*" # 未命中,虚拟板上标记为'*'
print("未命中!")
return hit关键改进点:
电脑的攻击需要随机性,并且不能重复攻击已经攻击过的位置。
def check_comp_hit(player_board):
"""
函数用于电脑攻击玩家船只的命中或未命中判定。
"""
hit = 0 # 默认未命中
while True: # 随机选择一个尚未攻击过的位置
row = randrange(0, map_size)
col = randrange(0, map_size)
# 检查该位置是否已被电脑攻击过(标记为小写船只或'*')
if player_board[row][col] not in ['*', 'a', 'b', 'c', 'f', 's']:
break
print(f"电脑选择了坐标 ({row}, {col}) 进行攻击。")
if player_board[row][col] in ship_initial: # 如果是船只字母
original_ship_char = player_board[row][col]
player_board[row][col] = original_ship_char.lower() # 标记为小写表示已击中
print(f"玩家:你的 {ship_names[ship_initial.index(original_ship_char)]} 被击中了!")
hit = 1 # 命中
else:
player_board[row][col] = "*" # 未命中
print("电脑未命中!")
return hit关键改进点:
现在,我们可以将所有组件整合到 if __name__ == "__main__": 块中,构建游戏的完整流程。
from random import randrange
ship_initial = ["B", "C", "F", "A", "S"]
ship_names = ["Battleship", "Cruiser", "Frigate", "Aircraft Carrier", "Submarine"] # 修正Sub为Submarine
map_size = 10
def get_username():
"""
获取用户名的函数。
"""
while True:
user_name = input("请输入你的名字: ")
if user_name:
print(f"欢迎来到战舰游戏,{user_name}!")
return user_name
else:
print("请不要留空,请输入你的名字。")
def create_battlefield(map_size):
"""
根据指定大小创建地图的函数。
"""
return [["_"] * map_size for _ in range(map_size)]
def display_battlefield(board, title=""):
"""
显示当前地图状态的函数。
"""
if title:
print(f"\n--- {title} ---")
# 打印列索引
print(" " + " ".join(str(i) for i in range(map_size)))
for i, row in enumerate(board):
print(f"{i} " + " ".join(row))
def player_ship_coordinate(player_board, occupied):
"""
玩家放置船只的函数。
"""
print("\n请放置你的船只。")
for i, ship_name in enumerate(ship_names):
while True:
try:
row = int(input(f"请输入 {ship_name} 的行坐标 (0-9): "))
col = int(input(f"请输入 {ship_name} 的列坐标 (0-9): "))
if 0 <= row < map_size and 0 <= col < map_size and (row, col) not in occupied:
player_board[row][col] = ship_initial[i]
occupied.add((row, col))
break
else:
print("无效坐标或该位置已被占用。请输入正确的值。")
except ValueError:
print("输入无效。请输入一个有效的整数。")
return player_board, occupied
def comp_ship_coordinate(comp_board):
"""
电脑放置船只的函数。
"""
for ship in ship_initial:
while True:
row = randrange(0, map_size)
col = randrange(0, map_size)
if comp_board[row][col] == "_":
comp_board[row][col] = ship
break
return comp_board
def check_player_hit(comp_board, dummy_board, user):
"""
函数用于玩家攻击敌方船只的命中或未命中判定。
同时更新玩家视角的虚拟板。
"""
print(f"\n{user},请选择攻击坐标:")
while True:
try:
row = int(input("输入行 (0-9): "))
col = int(input("输入列 (0-9): "))
if 0 <= row < map_size and 0 <= col < map_size:
if dummy_board[row][col] != '_': # 检查是否重复攻击
print("你已经攻击过这个位置了,请选择其他位置。")
continue
break
else:
print("无效坐标,请重新输入。")
except ValueError:
print("输入无效,请输入整数。")
hit = 0
if comp_board[row][col] in ship_initial:
original_ship_char = comp_board[row][col]
comp_board[row][col] = original_ship_char.lower()
dummy_board[row][col] = "X"
print(f"电脑:{ship_names[ship_initial.index(original_ship_char)]} 被击中了!")
hit = 1
else:
dummy_board[row][col] = "*"
print("未命中!")
return hit
def check_comp_hit(player_board):
"""
函数用于电脑攻击玩家船只的命中或未命中判定。
"""
hit = 0
while True:
row = randrange(0, map_size)
col = randrange(0, map_size)
# 检查该位置是否已被电脑攻击过(标记为小写船只或'*')
if player_board[row][col] not in ['*', 'a', 'b', 'c', 'f', 's']:
break
print(f"\n电脑选择了坐标 ({row}, {col}) 进行攻击。")
if player_board[row][col] in ship_initial:
original_ship_char = player_board[row][col]
player_board[row][col] = original_ship_char.lower()
print(f"玩家:你的 {ship_names[ship_initial.index(original_ship_char)]} 被击中了!")
hit = 1
else:
player_board[row][col] = "*"
print("电脑未命中!")
return hit
if __name__ == "__main__":
user = get_username()
player_board = create_battlefield(map_size)
comp_board = create_battlefield(map_size)
dummy_board = create_battlefield(map_size) # 玩家视角下的电脑板
occupied = set()
# 玩家放置船只
player_ship_coordinate(player_board, occupied)
display_battlefield(player_board, f"{user} 的船只部署")
# 电脑放置船只
comp_ship_coordinate(comp_board)
# display_battlefield(comp_board, "电脑的船只部署 (仅供测试)") # 实际游戏中不显示
display_battlefield(dummy_board, f"{user} 的攻击目标板") # 显示玩家的攻击目标板
player_hits = 0 # 玩家击中电脑船只的数量
comp_hits = 0 # 电脑击中玩家船只的数量
total_ships = len(ship_initial) # 总船只数量
print("\n--- 游戏开始! ---")
while True:
# 玩家回合
print(f"\n--- {user} 的回合 ---")
display_battlefield(dummy_board, f"{user} 的攻击目标板")
player_hits += check_player_hit(comp_board, dummy_board, user)
if player_hits == total_ships:
print(f"\n恭喜你,{user}!你击沉了电脑所有船只,赢得了游戏!")
break
# 电脑回合
print("\n--- 电脑的回合 ---")
comp_hits += check_comp_hit(player_board)
display_battlefield(player_board, f"{user} 的船只板") # 显示玩家自己的板,查看电脑攻击结果
if comp_hits == total_ships:
print("\n很遗憾,电脑击沉了你所有船只,电脑赢得了游戏!")
break
# 每回合结束显示双方板状态(玩家只看自己的船只板和攻击目标板)
display_battlefield(player_board, f"{user} 的船只板")
display_battlefield(dummy_board, f"{user} 的攻击目标板")运行上述代码,你将体验到一个完整的战舰游戏流程:
通过本教程,你已经掌握了构建一个基本战舰游戏的核心逻辑,包括游戏循环、命中判定和游戏状态管理。在此基础上,你可以继续探索更高级的功能和改进,使你的游戏更加完善和有趣。
以上就是Python战舰游戏开发:构建核心游戏循环与命中逻辑的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号