大爽Python入门教程 6-7 实例演示一 控制台——简易单行翻转点灯游戏(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 初步分析
大概步骤
- 首先要读取灯的信息,存到一个列表
lights
中,如下
['-', 'O', 'O', '-', 'O', 'O', '-']
- 主函数,通过循环反复接受输入。
- 把灯的信息展示(输出)出来。
- 实先灯的切换。
- 判断是否全部点亮。
函数设计
对应的,需要以下几个函数
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)
: 灯信息文本文件路径
主函数流程分析
主函数中主要做的
- 获取灯信息列表
- 展示欢迎语
- 使用循环,循环中展示灯信息,接受用户输入并处理。
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(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(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)