记载目录:
1.杂言杂语
2.填过python的那些坑和总结
a.import路径
b.相互import
c.变量的设计
d.py最简易的单例实现
e.初始化问题
3.2048小游戏设计理念和概括图
4.项目源码
杂言杂语
最近这两周时间是项目要上线的时间,几乎每天都很忙;上班时,在公司里不断的修bug,修改功能。下了班回到宿舍也TM十点多将近十一点了。洗完澡,等头发干就已经需要倒头睡觉赶明儿早上八点多的公交了。
学习py,不是心血来潮,是一件已经不可抑制的冲动了;为了花更少的时间能做更多的事情,我需要一款跨平台的胶水语言来写一些常用的工具,让这些工具帮助提高的我工作效率,节省重复性的时间开支。
程序语言的学习,在我的理解里,它无非就是一些特定的操作组合————变量定义,流程控制,面向对象;把这些基本操作规则组合而成语言学完了,一门程序语言也就算是学完了。学习完这些基础语法以后再加上一门小项目来提升自己的熟练度和巩固自己所学的知识,就能算已经掌握了。
填过python的那些坑
import路径
#刚开始接触python的import功能没有做过太多的分析,在如何搜索父目录的兄弟目录下的文件这个问题上纠结了有一些时间
#有点绕,其实就是这样子的
#┣━━2048
#┣━━━━━━ComFolder
#┣━━━━━━━━━━PackageA
#┣━━━━━━━━━━━━━━testA.py
#┣━━━━━━━━━━PackageB
#┣━━━━━━━━━━━━━━testB.py
#就是在testB import PackageA 下的py文件
#刚开始的时候在网上搜 ,得到的结果基本上都是 sys.path.append("..")
#很遗憾,说这语句是没有任何效果的
#解决这问题就从import机制说起,简单来说 import 会从搜索 sys.path 里面的路径下的文件
#所以我的解决办法是直接使用 完整包名的方法import相关模块
import sys
import os
sys.path.append(os.getcwd() + "\\2048")
from ComFolder.PackageA import testA
print(os.getcwd() + "\\2048")
# os.getcwd() 这个函数能够获取到工作文件路径
# 使用这个方法还有一个需要注意的是 从ComFolder目录开始就需要添加包标示文件__init__.py
# 暂时没有找到更好的方法去管理包,如果有发现新的管理包的方式再更新
相互import
# testA.py
from ComFolder.PackageB import testB
#
# 在 testA 中 import testB 文件
#
#========================================
# testB.py
from ComFolder.PackageA import testA
#
# 在 testB 中 import testA 文件
#
#这就是相互import了
#在这,我并不能给出什么解决办法,不过我们可以参考C++的做法
#在C++中,我们的项目工程通常会在C++的声明文件中去做一个宏定义
#
# //xxx.h
# #ifndef _XXX_H_
# #define _XXX_H_
#
# //代码实现块
#
# #endif
#我也去找过python有没有相似的实现方法 (很可惜,没找到)
#不过鉴于我使用python应该用不上这个模块,所以等到真正有需要的时候再回来挖掘吧
#这里提供一种参考手段
变量的设计
#这里对变量的设计,就是为了使 变量的对外隐藏,和变量的唯一性做出的设计
class Internal_Mumber:
variate1 = None
def __init__(self):
self.variate1 = None
class testB:
__internal_mumber = None
def __init__(self):
self.__internal_mumber = Internal_Mumber()
# Internal_Mumber这个类里面的定义的是所有testB中要使用的变量 以上就是变量定义的具体做法
#说说好处和坏处吧
#好处
#1.对外,你所有的变量都是不可见的
#2.对内,所有能够使用的变量都在Internal_Mumber里面,能够有效的减少bug出现
#3.Internal_Mumber这个类里面封装的都是数据,很容易拓展成mvc模式
#坏处
#需要制定一批规则来规范代码
#增加了代码的复杂度,阅读难度
py最简易的单例实现
#在我个人心里觉得,每个python文件就是一个单例类。
#比如说如果你想要把某个类封装为一个单例的话,那么完全可以把模块当成类使用
#这样做的问题就是如何初始化
#在我的小项目中,我是在类中定义一个初始化函数,并且直接调用它
#xxx.py
def InitFunc():
pass:
xxx.InitFunc()
#这里存在一个问题就是 InitFunc() 函数可以被外界多次调用
#如何解决让外部不能看见这个InitFunc,这里还没有找到解决方案
#不过,目前掌握的知识已经够我挥霍了,所以暂时不打算深究
2048小游戏设计理念和概括图
在2048小游戏中,主要工作的工程目录如下
┣━━2048
┣━━━━Core
┣━━━━━━━━Controller
┣━━━━━━━━━━━━GameController.py
┣━━━━━━━━━━━━GameState.py
┣━━━━━━━━━━━━OperationController.py
┣━━━━━━━━━━━━SortHandle.py
┣━━━━━━━━Data
┣━━━━━━━━━━━━GameData.py
┣━━━━━━━━━━━━GameDataHelp.py
┣━━━━Display
┣━━━━━━━━DisplayController.py
# 核心排序算法
def __RealSort(arg_list):
sort_list = list(arg_list)
#依次遍历最顶端的那个元素 maxIndex
count = len(sort_list) - 1
for index in iter(range(count + 1 )):
max_index = count - index
temp_count = max_index - 1
# 依次遍历次顶端的那个元素 maxIndex - 1
for temp_index in iter(range(temp_count + 1)):
cur_index = temp_count - temp_index
#判断次顶端是否为空 不为空
if sort_list[cur_index] > 0:
#判断最顶端的元素是否为空 为空就直接放数据 continue
if sort_list[max_index] <= 0:
sort_list[max_index] = sort_list[cur_index]
sort_list[cur_index] = 0
continue
#对比最顶端元素,如果相等则相加放在最顶端 continue
#如果最顶端和次顶端不相等则break 设置次顶端为最顶端,比较下一组
if sort_list[max_index] == sort_list[cur_index]:
sort_list[max_index] += sort_list[cur_index]
sort_list[cur_index] = 0
continue
else:
break
return sort_list
项目源码
还没有放到git上,暂时先提供百度盘下载,等有空了再更新。
工程下载地址:
https://pan.baidu.com/s/1c25wgWo
~凌晨2.50分,世界晚安