一个可能有帮助的设计考虑是您是否可以通过另一个界面提供一些最小的显示细节集;并且相反地允许对玩家桨的命令。例如,您可以通过 socket 向另一个进程发送一个描述球位置的简单结构,并且每帧更新的球拍和球都输出。按照相同的模式,您可以创建一个结构,作为对该消息的回复发送,该消息描述了如何移动玩家桨。例如:
# Pong Game program
import socket
import struct
# Set up server or client socket
# ... Into game loop
state = (p1_paddle_y, p2_paddle_y, ball_x, ball_y, victory_state)
# assuming pixel locations, and victory_state is -1:Loss, 0:InProgress, 1:Win
myGameStateMsg = struct.pack('>LLLLh', state[0], state[1], state[2], state[3])
sock.send(myGameStateMsg) # Sending game state to player
playerMsg = sock.recv(4) # Get player command
playerCmd = struct.unpack('i', playerMsg)
# playerCmd is an integer describing direction & speed of paddle motion
# ... Process game state update, repeat loop
您可以使用 线程 和事务结构来实现相同的效果,但您需要考虑正确保护这些结构(读写问题等)
出于稳定性原因,我个人更喜欢第一种方法(套接字和多处理)。假设有某种错误导致崩溃;如果您已经进行了进程分离,则更容易识别崩溃的根源。在线程级别,它仍然是可能的,但更具挑战性。多处理方法的其他好处之一是您可以轻松设置多个玩家并让游戏扩展(1vInGameAI、1v1、3v3、4v4)。尤其是当你扩展时,你可以测试不同的算法,比如 Q-Learning、自适应动态规划等,让它们互相玩!
附录:套接字 101
Sockets 是一种让多个进程(即正在运行的程序)相互发送消息的机制。这些进程可以在同一台机器上或跨网络运行。从某种意义上说,使用它们就像读取和写入一个不断修改的文件(这是套接字提供的抽象),而且还提供了阻塞调用,以便让进程等待信息可用.
关于可以轻松填满多个页面的套接字(如文件套接字与网络套接字(FD 与 IP);UDP 与 TCP 等),可以讨论更多细节。相反,请参阅以下有关基本设置的教程:https://docs.python.org/3/howto/sockets.html。有了这些,您将基本了解他们可以提供什么以及与他们一起去哪里获得更先进的技术。
您可能还想参考 struct 教程以及介绍性消息打包:https://docs.python.org/3/library/struct.html。有更好的方法可以做到这一点,但是如果不了解结构,您将不会了解它们的工作原理和分解方式。