Python零基础练手:5个无需素材的简单游戏代码

Luna
Luna
发布时间:2026-10-28| 9人浏览过
原创

精选5个不需要任何外部图片与音效素材的Python简单游戏代码,涵盖猜数字、石头剪刀布、单词竞猜、简易21点与网格迷宫,通过完整代码与原理解析助力零基础编程实践。

刚开始学习编程时,许多初学者都希望通过编写小游戏来巩固语法,但常常受制于游戏引擎的配置难度以及图片、音频等外部素材的收集整理。其实仅利用 Python 语言自带的标准库与控制台(终端)交互机制,无需准备任何素材文件,就能完成机制完整、趣味性强的小游戏。本文整理了 5 个结构清晰、循序渐进的代码范例,并对每一款游戏的核心运行逻辑进行剖析,帮助零基础学习者通过动手实践掌握变量、循环、分支、容器与坐标系统等核心概念。

Python零基础练手:5个无需素材的简单游戏代码
图 1:文字交互游戏通用运行循环与步骤流程

准备工作与运行方式

本文中的所有小游戏仅依赖 Python 自带的内置功能与标准库(如 random),无需安装任何第三方扩展库。运行前只需在计算机中安装好 Python 3(建议 3.8 及以上版本):

  1. 在任意目录下新建一个以 .py 结尾的纯文本文件(例如 game.py)。
  2. 将下文提供的完整代码复制并粘贴保存到该文件中。
  3. 打开终端(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()
代码关键点: 使用 Python 的集合 set() 存储玩家已猜过的字母。集合拥有 $O(1)$ 的成员查找性能且原生自带元素唯一性;列表推导式 [letter if letter in guessed_letters else "_" for letter in secret] 优雅地完成了字符串的按位脱敏遮罩展示。

两类控制台游戏交互范式的差异对比

在无需素材的控制台游戏中,根据交互模式与状态组织形式的不同,通常可以划分为两种开发模式:阻塞式问答模型与状态驱动网格模型。理解这两者的差异,有助于初学者合理选型并平滑过渡到更复杂的项目设计中。

Python零基础练手:5个无需素材的简单游戏代码
图 2:阻塞式问答模型与状态驱动网格模型的结构对照

如上图所示,阻塞式问答模型将“业务判定”与“屏幕输入输出”紧密交织在一起,初学编写极为轻松,但难以支持多方向移动或空间物体的定位;而状态驱动网格模型将“游戏底层数据”与“屏幕渲染”进行解耦,尽管需要理解二维索引与边界碰撞,但能够赋予控制台真正的空间交互感。

游戏四:简易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 改变坐标变量,并在碰撞校验通过后重新绘制地图。

Python零基础练手:5个无需素材的简单游戏代码
图 3:网格迷宫中的二维矩阵坐标与按键增量位移算法
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 行 二维嵌套列表, 坐标增量映射, 碰撞边界检测 状态模型与视图解耦、空间几何在数组中的映射
Python零基础练手:5个无需素材的简单游戏代码
图 4:五个练习项目的知识承接与技术递进全景

在熟练运行以上代码后,读者还可以尝试在现有框架上自主添加小功能,例如为猜数字增加历史记录排行榜、为石头剪刀布增加连胜加分机制,或是为迷宫增设随机金币与钥匙。跳过素材准备的繁琐流程,将精力聚焦在核心逻辑与数据结构上,是零基础快速建立编程自信与代码直觉的最有效途径。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。