大爽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)
原文地址:https://www.cnblogs.com/BigShuang/p/15640613.html