zoukankan      html  css  js  c++  java
  • 大爽Python入门教程 67 实例演示一 控制台——简易单行翻转点灯游戏(Lights Out Flip Game)

    大爽Python入门公开课教案 点击查看教程总目录

    1 游戏介绍

    实现一个控制台版本的, 单行的,点灯游戏。
    代码量:60行左右。

    简单介绍

    详细介绍:点灯游戏-百度百科

    Flip Game, 又称Lights Out。
    ,翻转游戏,又称点灯(熄灯)游戏。

    这里只介绍其一行的情况。

    游戏文件lights.txt如下

    -O-O-O-
    

    代表七盏灯。
    -是熄灭的,O是点亮的。
    切换其中一个等的状态(关闭或者点亮)
    会导致相邻的两个灯也切换状态。

    比如切换其中第四盏灯(索引为3)的O,相邻两个灯-也会更着切换状态。然后变成如下情况。

    -OO-OO-
    

    补充:边缘的灯,没有相邻的。
    (或者说相邻的超出边界,超出的不处理)。

    现在允许玩家不断选择一盏灯切换状态。
    点亮所有灯即为胜利。

    进入游戏

    运行游戏,
    先展示欢迎语。
    再展示迷宫面板,
    以及提醒用户输入。
    如下

    Welcome to light out flip game!
    -O-O-O-
    Select one lamp to light On/Off(Enter the index, start from 0):
    

    输入规范

    输入一个灯的索引。
    该值必须大于等于0,小于灯的总个数。
    输入不符合规范提醒Invalid input

    输入符合规范,则找到对应的灯,然后切换其状态。
    如果有相邻的灯,则切换相邻的灯的状态。

    正确示例

    对于上面展示的情况。
    点亮所有灯的一系列命令,
    示例如下。

    0
    6
    2
    3
    4
    

    点亮所有灯之后,
    展示所有灯,
    展示成功祝贺语并结束。
    如下

    OOOOOOO
    Great!You light up all the lights
    

    运行效果

    使用上面的正确命令,运行项目效果如下

    Welcome to light out flip game!
    -OO-OO-
    Select one lamp to light On/Off (Enter the index, start from 0): 0
    O-O-OO-
    Select one lamp to light On/Off (Enter the index, start from 0): 6
    O-O-O-O
    Select one lamp to light On/Off (Enter the index, start from 0): 2
    OO-OO-O
    Select one lamp to light On/Off (Enter the index, start from 0): 3
    OOO---O
    Select one lamp to light On/Off (Enter the index, start from 0): 4
    OOOOOOO
    Great!You light up all the lights
    

    2 初步分析

    大概步骤

    1. 首先要读取灯的信息,存到一个列表lights中,如下
    ['-', 'O', 'O', '-', 'O', 'O', '-']
    
    1. 主函数,通过循环反复接受输入。
    2. 把灯的信息展示(输出)出来。
    3. 实先灯的切换。
    4. 判断是否全部点亮。

    函数设计

    对应的,需要以下几个函数

    • get_lights: 读取文件
    • show_light: 展示灯的信息
    • switch_light: 切换灯的开关状态
    • check_all_on: 检查灯是否全部打开
    • main: 主函数或者说主逻辑

    参数分析

    这些函数需要哪些参数

    • get_lights(light_file): 灯信息文本文件路径
    • show_light(lights): 灯信息列表
    • switch_light(lights, li): lights为灯信息列表,
      li为要切换的灯的索引。
    • check_all_on(lights): 灯信息列表
    • main(light_file): 灯信息文本文件路径

    主函数流程分析

    主函数中主要做的

    1. 获取灯信息列表
    2. 展示欢迎语
    3. 使用循环,循环中展示灯信息,接受用户输入并处理。

    3 逐步实现

    字符串和其他信息
    先在代码开头定义要用的的字符串和和方位移动的信息字典。
    如下

    WELCOME = "Welcome to light out flip game!"
    ENTER  = "Select one lamp to light On/Off (Enter the index, start from 0): "
    WIN = "Great!You light up all the lights"
    

    主函数main

    代码如下

    def main(light_file):
        lights = get_lights(light_file)
        print(lights)
    
        print(WELCOME)
        while True:
            show_light(lights)
    
            # 检查灯是否全部打开,是就胜利并推出
            if check_all_on(lights):
                print(WIN)
                return
    
            li = input(ENTER)
    
            if li.isdigit():
                li = int(li)
                if 0 <= li < len(lights):
                    # 输入有效,切换灯光状态,然后进入下一轮
                    switch_light(lights, li)
                    switch_light(lights, li-1)
                    switch_light(lights, li+1)
                    continue
    
            print()
    

    get_lights

    代码如下

    def get_lights(light_file):
        with open(light_file, 'r') as f:
            line = f.readline()
    
        lights = [item for item in line]
        return lights
    

    show_light

    代码如下

    def show_light(lights):
        print("".join(lights))
    

    switch_light

    代码如下

    def switch_light(lights, li):
        if 0 <= li < len(lights):
            if lights[li] == "-":
                lights[li] = "O"
            elif lights[li] == "O":
                lights[li] = "-"
    

    主函数check_all_on

    代码如下

    def check_all_on(lights):
        for light in lights:
            if light == "-":
                return False
    
        return True
    

    调用代码

    调用代码如下

    light_file = "lights.txt"
    main(light_file)
    

    最终代码

    WELCOME = "Welcome to light out flip game!"
    ENTER  = "Select one lamp to light On/Off (Enter the index, start from 0): "
    WIN = "Great!You light up all the lights"
    
    
    def get_lights(light_file):
        with open(light_file, 'r') as f:
            line = f.readline()
    
        lights = [item for item in line]
        return lights
    
    
    def show_light(lights):
        print("".join(lights))
    
    
    def switch_light(lights, li):
        if 0 <= li < len(lights):
            if lights[li] == "-":
                lights[li] = "O"
            elif lights[li] == "O":
                lights[li] = "-"
    
    
    def check_all_on(lights):
        for light in lights:
            if light == "-":
                return False
    
        return True
    
    
    def main(light_file):
        lights = get_lights(light_file)
        print(lights)
    
        print(WELCOME)
        while True:
            show_light(lights)
    
            if check_all_on(lights):
                print(WIN)
                return
    
            li = input(ENTER)
    
            if li.isdigit():
                li = int(li)
                if 0 <= li < len(lights):
                    switch_light(lights, li)
                    switch_light(lights, li-1)
                    switch_light(lights, li+1)
                    continue
    
            print()
    
    
    light_file = "lights.txt"
    main(light_file)
    
  • 相关阅读:
    最小生成树的解法
    51nod 1212 无向图最小生成树
    greater()和less()的使用
    51nod1183 编辑距离
    51nod 1181 质数中的质数(质数筛法)
    upper_bound和lower_bound的用法
    线段树最全模板
    bryce1010专题训练——线段树习题汇总
    51nod 1174 区间中最大的数
    51nod 1113 矩阵快速幂
  • 原文地址:https://www.cnblogs.com/BigShuang/p/15640613.html
Copyright © 2011-2022 走看看