系列文章入口

《Python3编程实战Tetris机器人》

项目结构

项目的结构如下,以目录形式的模块包来组织代码,同时支持以目录或包来执行,两种方式具有统一入口。

\ptetris
|---- .editorconfig
|---- .gitignore
|---- .vscode
|    |---- launch.json
|    |---- settings.json
|---- LICENSE.rst
|---- README.md
|---- tetris
|    |---- app.py
|    |---- block.py
|    |---- config.py
|    |---- game.py
|    |---- tetris.py
|    |---- __init__.py
|    |---- __main__.py

实现细节

我们的程序位于tetris目录(包)中,可以作为一个文件夹来执行:

python tetris

也可以作为一个包(Package)来执行:

python -m tetris

__init__.py

若要 python 将一个文件夹作为 Package 对待,那么这个文件夹中必须包含一个名为 __init__.py 的文件,即使它是空的。
我们在这个文件中定义main(),作为软件的统一入口。

from tetris.app import start   # 这个tetris目录下的文件都位于tetris包中了

def main():
    print("Hi I'm Tetris!")
    start()                    #真实入口在app.py中

__main__.py

若要 python 运行一个文件夹,这个文件夹中必须包含一个名为 __main__.py 的文件
在__main__.py中调用__init__.py中的main(),统一程序入口。

import tetris
tetris.main()

这时以包方式运行没有问题,但以目录方式运行会出错:

Traceback (most recent call last):
  File "C:\Users\zhoutk\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\zhoutk\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "d:\codes\ptetris\tetris\__main__.py", line 7, in <module>
    import tetris
  File "d:\codes\ptetris\tetris\tetris.py", line 2, in <module>
    from tetris.config import *
ModuleNotFoundError: No module named 'tetris.config'; 'tetris' is not a package

原因在于,sys.path 的第一个搜索路径,一个是包,一个是空字符串。对于 python -m tetris 的调用方式来说,由于 __init__.py 被事先载入,此时 python 解释器已经知道了这是一个包,
因此当前路径(空字符串)被包含在 sys.path 中。然后再调用 __main__.py ,这时 import pkg 这个包就没有问题了。
而对于 python tetris的调用方式来说,python 解释器并不知道自己正在一个 Package 下面工作。默认的,python 解释器将 __main__.py 的当前路径 tetris加入 sys.path 中,然后在这个路径下面寻找 tetris这个模块,因此出错。
在__main__.py开头加入如下代码,就能解决这个问题:

import os, sys

if not __package__:
  path = os.path.join(os.path.dirname(__file__), os.pardir)
  sys.path.insert(0, path)

vscode的配置

vscode来写python还是很不错的,做两步操作,就可以很好的编写python程序了。

安装插件

只要安装ms-python.python插件就好了,相关的另外几个会自动安装的。

配置launch.json

"configurations": [
        {
            "name": "Tetris",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}/tetris",
            "console": "integratedTerminal"
        }
    ]

这样就可以用vscode打开ptetris目录,按F5运行程序了。

项目地址

https://gitee.com/zhoutk/ptetris
或
https://github.com/zhoutk/ptetris

运行方法

1. install python3, git
2. git clone https://gitee.com/zhoutk/ptetris (or download and unzip source code)
3. cd ptetris
4. python3 tetris

This project surpport windows, linux, macOs

on linux, you must install tkinter first, use this command:  
sudo apt install python3-tk

相关项目

已经实现了C++版,项目地址:

https://gitee.com/zhoutk/qtetris

zhoutk
2.6k 声望1.2k 粉丝

自由程序员,技术路线c,delphi,c++,c#,java,php,node.js,python,golang,typescript;超喜欢react.js的设计思路,全栈开发成为我的终极目标。开发机器macbook pro,或装ubuntu、fedora的机器,编程用vim...