Skip to content

Latest commit

 

History

History
271 lines (215 loc) · 6.05 KB

318-1914614-[趣味拓展]光标移动小游戏.sy.md

File metadata and controls

271 lines (215 loc) · 6.05 KB
show version enable_checker
step
1.0
true

光标位置小游戏

回忆上次内容

  • 上次了解了 一个新的转义模式

    • \33 逃逸控制字符 esc
  • esc 让输出

    • 退出 标准输出流
    • 进行 控制信息的设置
      • 可以 清屏
      • 也可以 设置光标输出的位置
  • 根据这个能做个小游戏吗???🤔

图片描述

尝试获得键盘单个输入

import tty
import sys
import termios

def get_character():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    try:
        tty.setcbreak(sys.stdin.fileno())
        character = sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    return character

print("请按下一个字符...")
character = get_character()
print("你按下了键盘上的字符", repr(character), "对应的ASCII码值为", ord(character))
  • 这下子可以根据wasd控制位置了吗?

控制位置

import os
import tty
import sys
import termios

def get_character():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    try:
        tty.setcbreak(sys.stdin.fileno())
        character = sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    print("你按下了键盘上的字符", repr(character), "对应的ASCII码值为", ord(character))
    return character


p = (0,0)

def move():
    global p
    print("\33[" + str(p[0]) + ";" + str(p[1]) +"Ho")
    anjian = get_character()
    if anjian=='w' :
        p = (p[0]-1,p[1])
    elif anjian=='s':
        p = (p[0]+1,p[1])
    elif anjian=='a' :
        p = (p[0],p[1]-1)
    elif anjian=='d' :
        p = (p[0],p[1]+1)

def clear_screen():
    os.system('clear')

while True:
    clear_screen()
    move()
  • 可以通过四个按键控制小o在屏幕移动了

图片描述

部署地图

import tty
import sys
import termios

def get_character():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    try:
        tty.setcbreak(sys.stdin.fileno())
        character = sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    print("你按下了键盘上的字符", repr(character), "对应的ASCII码值为", ord(character))
    return character


youxiditu=[
'*************************',
'* *   *         * * * * *',
'* * * * ***** * * * * * *',
'* * *       * *   * * * *',
'*   * * *** * ***** *   *',
'* *** *   *   *     *** *',
'*     * * * *** ***   * *',
'*** *** * * *   *   *** *',
'* * *   *   * * *** * * *',
'*   * *** * * * *   * ***',
'***    *  * *** *****   *',
'* ****** **     * * * ***',
'* * *     * ***** * *   *',
'*   ******* X* *  * *** *',
'* *   *      * * ** * * *',
'*************************']

p = (2,1)

def printmap():
    for line in youxiditu:
        print(line)

def wanjiayidong():
    global p
    print("\33[30;40H",p)
    print("\33[" + str(p[0]) + ";" + str(p[1]) +"Ho")
    anjian = get_character()
    if anjian=='w' and youxiditu[p[0]-1][p[1]]!='*':
        p = (p[0]-1,p[1])
    elif anjian=='s' and youxiditu[p[0]+1][p[1]]!='*':
        p = (p[0]+1,p[1])
    elif anjian=='a' and youxiditu[p[0]][p[1]-1]!='*':
        p = (p[0],p[1]-1)
    elif anjian=='d' and youxiditu[p[0]][p[1]+1]!='*':
        p = (p[0],p[1]+1)

def clear_screen():
    os.system('clear')

while True:
    clear_screen()
    printmap()
    wanjiayidong()
  • o可以移动
    • 但是很怪

原因分析

  • 屏幕坐标从1,1开始
  • 但是python列表从0开始

图片描述

  • 修改代码

代码

import tty
import sys
import termios

def get_character():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    try:
        tty.setcbreak(sys.stdin.fileno())
        character = sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    print("你按下了键盘上的字符", repr(character), "对应的ASCII码值为", ord(character))
    return character


youxiditu=[
'  ***********************',
'* *   *         * * * * *',
'* * * * ***** * * * * * *',
'* * *       * *   * * * *',
'*   * * *** * ***** *   *',
'* *** *   *   *     *** *',
'*     * * * *** ***   * *',
'*** *** * * *   *   *** *',
'* * *   *   * * *** * * *',
'*   * *** * * * *   * ***',
'***    *  * *** *****   *',
'* ****** **     * * * ***',
'* * *     * ***** * *   *',
'*   ******* X* *  * *** *',
'* *   *      * * ** * * *',
'*************************']

p = (0,0)

def printmap():
    for line in youxiditu:
        print(line)

def wanjiayidong():
    global p
    print("\33[10;40H",p)
    print("\33[" + str(p[0]+1) + ";" + str(p[1]+1) +"Ho")
    anjian = get_character()
    if anjian=='w' and youxiditu[p[0]-1][p[1]]!='*' and p[0]!=0:
        p = (p[0]-1,p[1])
    elif anjian=='s' and youxiditu[p[0]+1][p[1]]!='*':
        p = (p[0]+1,p[1])
    elif anjian=='a' and youxiditu[p[0]][p[1]-1]!='*' and p[1]!=0:
        p = (p[0],p[1]-1)
    elif anjian=='d' and youxiditu[p[0]][p[1]+1]!='*':
        p = (p[0],p[1]+1)

def clear_screen():
    os.system('clear')

while True:
    clear_screen()
    printmap()
    wanjiayidong()
  • 游戏效果

图片描述

  • 角色被*代表的墙所阻断
  • 最终需要移动到X的位置
  • 移动过去后有什么奖励吗?
  • 可以做一些更有意义的地图吗?

构建地图

  • 中传地图
    • 戏影
    • 信通
    • 电视
    • 新闻

图片描述

  • 移动 过程中
    • 寻找碎片
    • 进行交易
    • 进行战斗
  • 还能做点什么好玩的吗?

总结

  • 这次学习了单个字符的录入方法
    • 并制作的一个小游戏
    • 可以让这个游戏出现更多的颜色吗?

图片描述

  • 我们下次再说!👋