Python零基础练手:5个无需素材的简单游戏代码
精选5个不需要任何外部图片与音效素材的Python简单游戏代码,涵盖猜数字、石头剪刀布、单词竞猜、简易21点与网格迷宫,通过完整代码与原理解析助力零基础编程实践。
刚开始学习编程时,许多初学者都希望通过编写小游戏来巩固语法,但常常受制于游戏引擎的配置难度以及图片、音频等外部素材的收集整理。其实仅利用 Python 语言自带的标准库与控制台(终端)交互机制,无需准备任何素材文件,就能完成机制完整、趣味性强的小游戏。本文整理了 5 个结构清晰、循序渐进的代码范例,并对每一款游戏的核心运行逻辑进行剖析,帮助零基础学习者通过动手实践掌握变量、循环、分支、容器与坐标系统等核心概念。
准备工作与运行方式
本文中的所有小游戏仅依赖 Python 自带的内置功能与标准库(如 random),无需安装任何第三方扩展库。运行前只需在计算机中安装好 Python 3(建议 3.8 及以上版本):
- 在任意目录下新建一个以
.py结尾的纯文本文件(例如game.py)。 - 将下文提供的完整代码复制并粘贴保存到该文件中。
- 打开终端(macOS/Linux 为 Terminal,Windows 为 PowerShell 或 CMD),切换到代码所在路径,执行命令:
python game.py(部分系统可能为python3 game.py)。
游戏一:猜数字(掌握随机数与循环分支)
猜数字是练习条件分支语句与循环结构最典型的项目。计算机利用 random.randint() 在 1 到 100 之间随机选定一个整数,玩家通过控制台输入猜测结果,程序根据反馈提示“猜大了”或“猜小了”,直到完全命中为止。
import random
def guess_number_game():
target = random.randint(1, 100)
attempts = 0
print("【猜数字游戏】系统已生成一个 1 到 100 之间的整数。")
while True:
user_input = input("请输入你的猜测(输入 q 退出):").strip()
if user_input.lower() == 'q':
print("游戏已退出。")
break
# 验证输入是否为全数字字符
if not user_input.isdigit():
print("输入无效,请输入正整数!")
continue
guess = int(user_input)
attempts += 1
if guess < target:
print("猜小了,继续加油!")
elif guess > target:
print("猜大了,往小了猜!")
else:
print(f"恭喜猜对!正确答案是 {target},共尝试了 {attempts} 次。")
break
if __name__ == "__main__":
guess_number_game()
input() 默认返回字符串类型,必须通过 int() 显式转换后才能与数字进行大小比较;在转换之前使用 user_input.isdigit() 校验,能够避免读者因误输字母造成程序崩溃(ValueError 异常)。
游戏二:石头剪刀布(掌握字典映射与规则裁决)
在石头剪刀布游戏中,许多初学者会写出繁杂的嵌套 if-elif 判断。通过引入字典(dict)记录“胜利克制关系”,可以大幅压缩代码体积并提高逻辑的可读性与扩展性。
import random
def rps_game():
options = ["石头", "剪刀", "布"]
# 字典的键为出拳,值为其能击败的目标
win_rules = {"石头": "剪刀", "剪刀": "布", "布": "石头"}
scores = {"player": 0, "computer": 0}
print("【石头剪刀布】输入'石头'、'剪刀'、'布'对战,输入'q'退出。")
while True:
player_choice = input("\n请出拳:").strip()
if player_choice.lower() == 'q':
print(f"游戏结束!最终总比分 —— 玩家 {scores['player']} : {scores['computer']} 电脑")
break
if player_choice not in options:
print("无效输入,请在'石头'、'剪刀'、'布'中选择。")
continue
computer_choice = random.choice(options)
print(f"电脑出:{computer_choice}")
if player_choice == computer_choice:
print("平局!双方旗鼓相当。")
elif win_rules[player_choice] == computer_choice:
scores["player"] += 1
print(f"你赢了本局!当前比分 -> 玩家 {scores['player']} : {scores['computer']}")
else:
scores["computer"] += 1
print(f"电脑获胜!当前比分 -> 玩家 {scores['player']} : {scores['computer']}")
if __name__ == "__main__":
rps_game()
win_rules[player_choice] == computer_choice 利用哈希查找直接判定玩家是否获胜。无需罗列 9 种胜负组合,这是从面向过程到数据驱动思维的重要一步。
游戏三:单词遮罩竞猜(掌握字符串遍历与集合去重)
该游戏模仿经典的刽子手(Hangman)玩法。程序预设技术词汇库并随机挑选一个单词,向玩家展示一串下划线(_)。玩家每次猜测一个英文字母,若命中则翻开对应位置,若猜错则扣除尝试机会。
import random
def word_guess_game():
words = ["python", "variable", "function", "boolean", "integer", "loop"]
secret = random.choice(words)
guessed_letters = set()
chances = 6
print("【单词遮罩竞猜】请猜出隐藏的技术单词,最多允许失误 6 次。")
while chances > 0:
# 根据已猜出的集合动态拼装展示状态
display = [letter if letter in guessed_letters else "_" for letter in secret]
print(f"\n当前进度:{' '.join(display)}")
print(f"剩余机会:{chances} 次 | 已猜字符:{', '.join(sorted(guessed_letters)) if guessed_letters else '无'}")
if "_" not in display:
print(f"恭喜胜利!成功还原单词:{secret}")
break
guess = input("请输入单个英文字母:").strip().lower()
if len(guess) != 1 or not guess.isalpha():
print("输入无效!请输入单个英文字母。")
continue
if guess in guessed_letters:
print(f"字母 '{guess}' 已经猜过了,请换一个。")
continue
guessed_letters.add(guess)
if guess in secret:
print(f"命中!单词中包含字母 '{guess}'。")
else:
chances -= 1
print(f"未命中!字母 '{guess}' 不在目标单词中。")
else:
print(f"\n机会耗尽,挑战失败!正确单词是:{secret}")
if __name__ == "__main__":
word_guess_game()
set() 存储玩家已猜过的字母。集合拥有 $O(1)$ 的成员查找性能且原生自带元素唯一性;列表推导式 [letter if letter in guessed_letters else "_" for letter in secret] 优雅地完成了字符串的按位脱敏遮罩展示。
两类控制台游戏交互范式的差异对比
在无需素材的控制台游戏中,根据交互模式与状态组织形式的不同,通常可以划分为两种开发模式:阻塞式问答模型与状态驱动网格模型。理解这两者的差异,有助于初学者合理选型并平滑过渡到更复杂的项目设计中。
如上图所示,阻塞式问答模型将“业务判定”与“屏幕输入输出”紧密交织在一起,初学编写极为轻松,但难以支持多方向移动或空间物体的定位;而状态驱动网格模型将“游戏底层数据”与“屏幕渲染”进行解耦,尽管需要理解二维索引与边界碰撞,但能够赋予控制台真正的空间交互感。
游戏四:简易21点对决(掌握函数封装与动态分值算法)
21 点(Blackjack)游戏在不使用扑克牌图片素材的情况下,只需用一个列表记录手牌点数。该游戏的核心挑战在于 Ace 牌的动态计分规则:Ace 既可以计为 11 点,也能在总点数爆掉时自动降为 1 点。
import random
def deal_card():
# 2-10 对应面值,10,10,10 模拟 J, Q, K,11 初始模拟 Ace
deck = [2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11]
return random.choice(deck)
def calculate_score(cards):
score = sum(cards)
# 当总分超过 21 且手牌中包含 11 (Ace) 时,将 11 降为 1 点
aces = cards.count(11)
while score > 21 and aces > 0:
score -= 10
aces -= 1
return score
def blackjack_game():
print("【简易21点对决】点数越接近21点越好,爆牌(超过21点)即输。")
player_hand = [deal_card(), deal_card()]
dealer_hand = [deal_card(), deal_card()]
# 玩家操作回合
while True:
player_score = calculate_score(player_hand)
print(f"\n你的手牌: {player_hand},当前点数: {player_score}")
print(f"庄家明牌: [{dealer_hand[0]}, ?]")
if player_score > 21:
print("手牌爆点,庄家胜出!")
return
if player_score == 21:
print("21 点!直接转入结算阶段。")
break
choice = input("是否继续要牌?(y/n): ").strip().lower()
if choice == 'y':
new_card = deal_card()
player_hand.append(new_card)
print(f"抽到了: {new_card}")
elif choice == 'n':
break
else:
print("请输入有效的指令 (y/n)!")
# 庄家操作回合(若玩家未爆牌)
print(f"\n庄家暗牌翻开: {dealer_hand},初始点数: {calculate_score(dealer_hand)}")
while calculate_score(dealer_hand) < 17:
new_card = deal_card()
dealer_hand.append(new_card)
print(f"庄家补牌: {new_card},当前点数: {calculate_score(dealer_hand)}")
player_score = calculate_score(player_hand)
dealer_score = calculate_score(dealer_hand)
print("\n--- 最终战局结算 ---")
print(f"玩家最终牌组: {player_hand} (总分: {player_score})")
print(f"庄家最终牌组: {dealer_hand} (总分: {dealer_score})")
if dealer_score > 21:
print("庄家爆牌,玩家获胜!")
elif player_score > dealer_score:
print("点数压制,玩家获胜!")
elif player_score < dealer_score:
print("庄家点数更大,庄家获胜!")
else:
print("平局!双方点数一致。")
if __name__ == "__main__":
blackjack_game()
calculate_score() 独立封装了点数计算规则,并在玩家与庄家逻辑中复用。利用 while score > 21 and aces > 0 实现多张 Ace 依次递减换算,是初学者理解状态循环调整的优秀范例。
游戏五:字符网格迷宫(掌握二维列表与空间移动)
纯文本控制台同样可以渲染图形空间感。通过一个嵌套列表(二维数组)定义迷宫地图,其中 # 代表墙壁、. 代表通路、P 代表玩家角色、E 代表逃生终点。利用键盘输入的 w/a/s/d 改变坐标变量,并在碰撞校验通过后重新绘制地图。
def maze_game():
# 迷宫地图矩阵:# 为障碍物,. 为通道
maze = [
["#", "#", "#", "#", "#", "#", "#"],
["#", ".", ".", ".", "#", ".", "#"],
["#", ".", "#", ".", "#", ".", "#"],
["#", ".", "#", ".", ".", ".", "#"],
["#", ".", ".", "#", "#", ".", "#"],
["#", "#", "#", "#", "#", "#", "#"]
]
player_r, player_c = 1, 1 # 玩家初始坐标 (Row, Col)
exit_r, exit_c = 4, 5 # 迷宫终点坐标
moves = {
'w': (-1, 0),
's': (1, 0),
'a': (0, -1),
'd': (0, 1)
}
def render():
print("\n" + "=" * 16)
for r in range(len(maze)):
row_display = []
for c in range(len(maze[0])):
if (r, c) == (player_r, player_c):
row_display.append("P")
elif (r, c) == (exit_r, exit_c):
row_display.append("E")
else:
row_display.append(maze[r][c])
print(" ".join(row_display))
print("=" * 16)
print("【字符网格迷宫】控制 P 到达出口 E。按键:w(上) s(下) a(左) d(右),q(退出)")
steps = 0
while True:
render()
if (player_r, player_c) == (exit_r, exit_c):
print(f"恭喜逃脱成功!总移动步数:{steps} 步。")
break
cmd = input("移动指令: ").strip().lower()
if cmd == 'q':
print("游戏退出。")
break
if cmd not in moves:
print("指令错误!请使用 w/a/s/d 控制移动。")
continue
dr, dc = moves[cmd]
next_r = player_r + dr
next_c = player_c + dc
# 碰撞检测:若目标格为 # 或者是边界则不可通行
if maze[next_r][next_c] == "#":
print("前面是石墙,无法穿透!")
else:
player_r, player_c = next_r, next_c
steps += 1
if __name__ == "__main__":
maze_game()
dr, dc = moves[cmd] 将字符串按键映射为二维数学增量,避免了四组庞杂的 if-else 计算;地图数据 maze 中并不直接嵌入玩家字符,而是在渲染函数 render() 中动态覆盖显示,保证了数据层与表现层的解耦。
5个游戏知识点覆盖与进阶总结
通过这 5 个无需素材的 Python 游戏,学习者能够在编写趣味小品的同时,自然掌握现代编程语言的核心构件。下表整理了每个案例的对应技能体系与核心训练目标:
| 游戏项目 | 代码规模 | 核心涉及语法与标准库 | 思维训练重点 |
|---|---|---|---|
| 猜数字 | ~30 行 | random.randint(), while, if/elif/else |
数据类型转换、防崩溃输入校验、比较运算 |
| 石头剪刀布 | ~35 行 | random.choice(), dict 映射, 计分器 |
使用字典消除复杂分支、规则数据驱动 |
| 单词遮罩竞猜 | ~45 行 | set() 集合去重, 列表推导式, 字符串处理 |
集合高效查找、列表推导式动态脱敏显示 |
| 简易21点对决 | ~65 行 | 函数封装与复用, 列表操作, 循环条件回退 | 多状态动态规则演算、主流程复用封装 |
| 字符网格迷宫 | ~60 行 | 二维嵌套列表, 坐标增量映射, 碰撞边界检测 | 状态模型与视图解耦、空间几何在数组中的映射 |
在熟练运行以上代码后,读者还可以尝试在现有框架上自主添加小功能,例如为猜数字增加历史记录排行榜、为石头剪刀布增加连胜加分机制,或是为迷宫增设随机金币与钥匙。跳过素材准备的繁琐流程,将精力聚焦在核心逻辑与数据结构上,是零基础快速建立编程自信与代码直觉的最有效途径。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













