wei_Y 发表于 2015-3-26 16:58:40

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 17:56:15

本帖最后由 戴宇轩 于 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:
    # 如果输了, 执行的代码

戴宇轩 发表于 2015-3-26 17:25:27

我觉得输了就是整个地图被填满,且没有两个相邻的数是一样的。但是实现方法比较复杂{:7_140:}

半蓝不蓝 发表于 2015-3-26 17:32:05

慢慢学习~

wei_Y 发表于 2015-3-26 17:32:36

戴宇轩 发表于 2015-3-26 17:25
我觉得输了就是整个地图被填满,且没有两个相邻的数是一样的。但是实现方法比较复杂

是啊,我想了想,然后没弄。。

freeparty 发表于 2015-3-26 18:31:09

感觉要很好的算法才行,我是算法白痴:cry

wei_Y 发表于 2015-3-26 19:13:45

戴宇轩 发表于 2015-3-26 17:56
我的方法

改了改更新。得跳出两层循环。

wei_Y 发表于 2015-3-26 19:17:08

freeparty 发表于 2015-3-26 18:31
感觉要很好的算法才行,我是算法白痴

有思路了好写,没思路憋不出来。。

戴宇轩 发表于 2015-3-26 19:19:49

wei_Y 发表于 2015-3-26 19:13
改了改更新。得跳出两层循环。

什么意思{:9_229:}

wei_Y 发表于 2015-3-26 19:24:40

戴宇轩 发表于 2015-3-26 19:19
什么意思

你写的两层嵌套。一个break跳不出俩。

戴宇轩 发表于 2015-3-26 19:48:56

wei_Y 发表于 2015-3-26 19:24
你写的两层嵌套。一个break跳不出俩。

改好了,刚才没注意。。。

小甲鱼 发表于 2015-3-26 20:10:44

不错,有想法就分享出来~~~赞~~~

小甲鱼 发表于 2015-3-26 20:22:14

问题来了,干啥不用PyGame?

wei_Y 发表于 2015-3-26 20:26:59

小甲鱼 发表于 2015-3-26 20:10
不错,有想法就分享出来~~~赞~~~

{:9_223:}

wei_Y 发表于 2015-3-26 20:29:10

小甲鱼 发表于 2015-3-26 20:22
问题来了,干啥不用PyGame?

{:5_96:}下载 + 看文档 = 发呆。

雪是梅之香 发表于 2015-3-26 21:41:42

感谢楼主

代码库 发表于 2015-3-27 10:25:41

NB

netikid 发表于 2015-3-28 10:22:23

学习了= =不过感觉还稍微有点粗糙

AfricChang 发表于 2015-3-28 10:33:43

这段时间正在学习这个

wei_Y 发表于 2015-3-28 10:58:02

netikid 发表于 2015-3-28 10:22
学习了= =不过感觉还稍微有点粗糙

嗯。{:5_96:}直接上的label的边框+数字。超粗糙。
页: [1] 2 3 4
查看完整版本: tkinter练习。---2048.更新。