Developing a Tetris game with python(三)

Tetris

开发一个俄罗斯方块游戏,主要会涉及到的算法.

##算法(二)——接收用户操作输入

3、接收用户操作输入

#主循环
try:
    while True:
            #pprint.pprint(listcard,width=50)
            if input("输入'a'来旋转90°: ").lower() == 'a':#判断用户输入的键是否为a
                chang_90()#旋转方块
主循环的跳出ctrl +c#
except KeyboardInterrupt:
    print("程序被用户中断。")
 

这种做法会导致界面上会被强制中断,等待用户输入,不符需求。 实际的需求是界面一直刷新,同时判断用户是否操作输入。 一般这种解法方法是采用多线程的方式,也就是主程序执行图像不停的刷新,另一个线程执行接收用户请求输入。

import threading
 
# 全局变量用于捕获用户输入
user_input = None
def get_input():
    global user_input
    while True:
        user_input = input()
# 启动线程处理用户输入
input_thread = threading.Thread(target=get_input)
input_thread.daemon = True  # 守护线程
input_thread.start()

bug解决

上面这个方面获取按钮a,比如按回车才可以?? ————在 Python 中,标准的 input() 函数会等待用户按下回车键来捕获输入。

解决方法一:引入外部库keyboard

pip install keyboard 
import keyboard  # 需要安装keyboard库
if keyboard.is_pressed('a'):  # 检测是否按下了'a'键

解决方法二:使用一些低级别的函数(如 Windows 上的 msvcrt 或 Unix 系统上的 termios 和 tty)

import msvcrt
 
# 全局变量用于捕获用户输入
user_input = None#初始化一个全局变量
def get_input():
    global user_input
    while True:
        if msvcrt.kbhit():
            user_input = msvcrt.getch()
            user_input = user_input.decode()  # 将字节类型转换为字符串
            print(f'You pressed: {user_input}.lower() ')
 
#...省略
try:
    while True:
            time.sleep(2)
            pprint.pprint(listcard,width=50)
            if user_input:#先判定是否非None,否则无法获取属性.lower
                if user_input.lower()  == 'a':
                    chang_90()
                    break