用python创建桌面应用(一)
我们刚学编程语言的时候,写的代码都是在一个文件中完成的。如果我们在开发一个项目的时候,这个就显得逻辑不清楚,看着很烦,根本就不想看。我们构建一个高效的,可扩展应用的关键是应用分层架构,最常见的方法是把应用分为三层,用户界面层,核心逻辑层(业务逻辑层)和数据层。有的时候涉及到网络时,会有网络层。
用户界面应该为用户展示应用逻辑,但并不实现逻辑,这和我们学面向对象时的封装差不多。它的任务是尽可能简单的展示应用 的功能,并且尽可能清晰的展示结果和输出,和我们玩游戏一样,我只知道怎么玩,他是怎么做出来关我什么事。用户界面会控制在给定的时间点上哪些功能是可用的,比如说,我们在LOL的时候,不把buff打死,就不可能给你额外的加成一样。如果我们使用面向对象的程序,对象通常会表示类似菜单,按钮和窗口的东西。用户界面通过调用逻辑层提供的函数或方法访问核心逻辑层。
核心逻辑层包含所有数据的算法和状态管理。在该层,可以编写代码来改变数据值,创建新实体,打开或关闭文件等。说这么多这一层是干什么的呢?它的目的是提供一组用户界面可以访问的函数或服务。为了提高效率核心逻辑函数不应该打印结果,但是应该把它们作为值返回,就是说不要用print而是用return。用户界面可以在合适的地方将这些值,以适当的格式展现出来。核心逻辑层仅显示信息,它不关心信息的显示格式,就是这种把逻辑和显示分开,可以在相同核心逻辑层上创建不同的用户界面。核心逻辑层会操作数据层提供的数据。
数据层用于管理数据。他把数据存储在安全的地方并在需要时取回数据。它不应该包含复杂的算法或特定于应用的逻辑。它仅仅把原始数据传递到核心逻辑层来处理。数据层可能包含一些基本的数据完整性处理来确保数据的一致性。它可能也会集成一些安全功能,比如密码加密,权限控制等。它应该通过一组对象,函数或服务来显示数据。说了这么多,建议你使用数据库吧。
用户界面层,逻辑层和数据层之间的交互通常使用一个名为模型-视图-控制器(Model View Controller,MVC)的设计模式。大体上讲,模型代表核心逻辑层和数据层,而是视图代表用户界面的显示元素,控制器代表这些显示元素之间的交互和依赖。
这个项目是以一个游戏作为案列,叫tic-tac-toe。说白了就是我们中国人玩的井字棋。如果你要做游戏还是建议你使用python的pygame来做。
2.创建命令行界面
2.1创建数据层
创建游戏时,首先需要设计数据层。对于这个游戏需要一个简单的文本文件来保存游戏状态,这样就可以被保存和恢复使用。这个游戏里有9个正方形的面板,里面是空格或X,O字符。你高兴也可以换成其他的字符。我们可以用简单的字符串列表来表示这三个项。为了存储把列表转换为简单的字符串。
需要的另一个数据是下一步是哪个玩家,在人机游戏中,可以假设人永远是下一个玩家。所以我们的数据层接口中应提供两个方法:保存游戏(saveGame),恢复游戏(restoreGame)。
<span style="font-family:'KaiTi_GB2312';"><strong><span style="font-size:24px;">''' oxo_data is the data module for a tic-tac-toe (or OXO) game. It saves and restores a game board. The functions are: saveGame(game) -> None restoreGame() -> game Note that no limits are placed on the size of the data. The game implementation is responsible for validating all data in and out.''' import os.path game_file = "oxogame.dat" def _getPath(): #这是一个辅助函数 得到主目录,如果失败就使用当前目录 ''' getPath -> string Returns a valid path for data file. Tries to use the users home folder, defaults to cwd''' try: game_path = os.environ['HOMEPATH'] or os.environ['HOME'] if not os.path.exists(game_path): game_path = os.getcwd() except (KeyError, TypeError): game_path = os.getcwd() return game_path def saveGame(game): #创建一个包含表示游戏的字符串的新文件 ''' saveGame(game) -> None saves a game object in the data file in the users home folder. No checking is done on the input which is expected to be a list of characters''' path = os.path.join(_getPath(), game_file) try: with open(path, 'w') as gf: gamestr = ''.join(game) gf.write(gamestr) except FileNotFoundError: print("Failed to save file") def restoreGame(): #定位到被保存的文件并打开,读取保存的游戏数据 ''' restoreGame() -> game Restores a game from the data file. The game object is a list of characters''' path = os.path.join(_getPath(), game_file) with open(path) as gf: gamestr = gf.read() return list(gamestr) def test(): print("Path = ", _getPath()) saveGame(list("XO XO XO ")) print(restoreGame()) if __name__ == "__main__": test() </span></strong></span>
上面的这个文件的文件名为oxo_data.py
上一篇: 高手揭密 开发简单“操作系统”全过程