tkinter练习。---2048.更新。
本帖最后由 wei_Y 于 2015-3-26 19:13 编辑重装系统之后就没装pyqt。(也不大会。)
{:5_97:} 还是跟着小甲鱼老师的教程走。
前几天发现了刚开始学的时候没做完的2048的代码版。(其实是连思路都木有- -。)
现在从大菜变小菜了,有思路了把算法写了一下。
学了几节尝试给弄到tkinter上了。
{:5_96:} 直接上的数字,图片还不会弄。界面不美观。也没绑定键盘。另外,呃,没有判断输赢,而且输了要是在点会卡死(赢好做,输真没想起来。)。
tip: 保存成.pyw然后用python目录下的pythonw.exe运行就不会显示黑框了。
2048算法思路(不想看的可以直接下载附件。附件不想下的可以回帖赚俩鱼币。鱼币不想赚的可以和我扯扯淡。):
1. 生成地图。列表当然是最好用的。生成方便,改也方便。
[['' for i in range(x)] for j in range(y)] # 矩阵形式, '' 换成其他的就可以了。
2. 初始化生成。
2和4随机选择,几率随便啦,我用的5050.
位置的选择用itertools将xy组合成一个坐标,然后随机选俩。
location_all = set(list(iters.combinations(+))], 2)))
location = random.sample(location_all, 2)
for i in location:
Two_map]] = random.choice()
3. 判断是否增加新值。
也就是向一个方向移动之后要是没有变化就不加新值了。
deepcopy了一遍原列表,在与移动后的比较。
4. 新值的增加。
干脆也用了随机数,随机选了一个坐标。偷懒直接while死循环,直到随机到的位置没有值位置。
递归的增加也有写。差不多的道理。地图太大的话用这种方法效率较低。
while版:
location_all = set(list(iters.combinations(+))], 2)))
while 1:
locations = random.sample(location_all, 1)
if Two_map]] == '':
Two_map]] = random.choice()
break
else:
continue
5. 移动。
我的思路是从要移动的位置的初始位置开始。
下就从最下边(左右无所谓),左就从最左边(上下无所谓)
先判断这个点是不是空的(或者任意初始值),如果是就向上寻找到第一个不是的交换。
如果不是空,向上寻找第一个一样不一样,一样就X2,不一样就放在上面一个。(这里要跳出循环。)
然后逐个往上再次进行以上判断。
4个方向基本一样。
向下的。
for i in range(len(Two_map)): # x 0-3
for j in reversed(range(1, len(Two_map))): # y 3-1
# 基层判断到最后一层。以下的判断是j层往上,不包括j层。
if Two_map == '':
for c in reversed(range(j)):
if Two_map != '':
Two_map, Two_map = Two_map, Two_map
break
if Two_map != '':
for c in reversed(range(j)):
if Two_map != '' and Two_map == Two_map:
Two_map *= 2
Two_map = ''
break
elif Two_map != '' and Two_map != Two_map:
Two_map, Two_map = Two_map, Two_map
break
else:
continue
6. 输赢判断。
赢直接找有木有2048(或者其他。)
输直接借鉴@戴宇轩的思路。
用到的tkinter组件。
Label
LabelFrame
Button
大家要是没事也可以练练呦~。
大召唤术!!!@~风介~ @戴宇轩
本帖最后由 戴宇轩 于 2015-3-26 19:47 编辑
我的方法sqr = […] # 一开始创建的矩阵
fail = False
if True not in ('' in i for i in sqr):
temp_0 = False
for i in sqr:
if temp_0:
break
for j in range(len(i) - 1):
if i == i:
temp_0 = True
break
else:
temp_1 = False
for i in range(len(sqr)):
if temp_1:
break
for j in range(len(sqr) - 1):
if sqr == sqr:
temp_1 = True
break
else:
fail = True
if fail:
# 如果输了, 执行的代码
我觉得输了就是整个地图被填满,且没有两个相邻的数是一样的。但是实现方法比较复杂{:7_140:} 慢慢学习~ 戴宇轩 发表于 2015-3-26 17:25
我觉得输了就是整个地图被填满,且没有两个相邻的数是一样的。但是实现方法比较复杂
是啊,我想了想,然后没弄。。 感觉要很好的算法才行,我是算法白痴:cry 戴宇轩 发表于 2015-3-26 17:56
我的方法
改了改更新。得跳出两层循环。 freeparty 发表于 2015-3-26 18:31
感觉要很好的算法才行,我是算法白痴
有思路了好写,没思路憋不出来。。 wei_Y 发表于 2015-3-26 19:13
改了改更新。得跳出两层循环。
什么意思{:9_229:} 戴宇轩 发表于 2015-3-26 19:19
什么意思
你写的两层嵌套。一个break跳不出俩。 wei_Y 发表于 2015-3-26 19:24
你写的两层嵌套。一个break跳不出俩。
改好了,刚才没注意。。。 不错,有想法就分享出来~~~赞~~~ 问题来了,干啥不用PyGame? 小甲鱼 发表于 2015-3-26 20:10
不错,有想法就分享出来~~~赞~~~
{:9_223:} 小甲鱼 发表于 2015-3-26 20:22
问题来了,干啥不用PyGame?
{:5_96:}下载 + 看文档 = 发呆。 感谢楼主 NB 学习了= =不过感觉还稍微有点粗糙 这段时间正在学习这个 netikid 发表于 2015-3-28 10:22
学习了= =不过感觉还稍微有点粗糙
嗯。{:5_96:}直接上的label的边框+数字。超粗糙。