鱼C论坛

 找回密码
 立即注册
查看: 14294|回复: 66

[技术交流] tkinter练习。---2048.更新。

[复制链接]
发表于 2015-3-26 16:58:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wei_Y 于 2015-3-26 19:13 编辑


2048.png
重装系统之后就没装pyqt。(也不大会。)
还是跟着小甲鱼老师的教程走。
前几天发现了刚开始学的时候没做完的2048的代码版。(其实是连思路都木有- -。)
现在从大菜变小菜了,有思路了把算法写了一下。
学了几节尝试给弄到tkinter上了。
直接上的数字,图片还不会弄。界面不美观。也没绑定键盘。另外,呃,没有判断输赢,而且输了要是在点会卡死(赢好做,输真没想起来。)。
2048.jpg
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([i for i in range(len(Two_map))]+[j for j in range(len(Two_map[0]))], 2)))
location = random.sample(location_all, 2)
for i in location:
    Two_map[i[0]][i[1]] = random.choice([2, 4])
3. 判断是否增加新值。
也就是向一个方向移动之后要是没有变化就不加新值了。
deepcopy了一遍原列表,在与移动后的比较。
4. 新值的增加。
干脆也用了随机数,随机选了一个坐标。偷懒直接while死循环,直到随机到的位置没有值位置。
递归的增加也有写。差不多的道理。地图太大的话用这种方法效率较低。
while版:
    location_all = set(list(iters.combinations([i for i in range(len(Two_map))]+[j for j in range(len(Two_map[0]))], 2)))
    while 1:
        locations = random.sample(location_all, 1)
        if Two_map[locations[0][0]][locations[0][1]] == '':
            Two_map[locations[0][0]][locations[0][1]] = random.choice([2, 4])
            break
        else:
            continue

5. 移动。
我的思路是从要移动的位置的初始位置开始。
下就从最下边(左右无所谓),左就从最左边(上下无所谓)
先判断这个点是不是空的(或者任意初始值),如果是就向上寻找到第一个不是的交换。
如果不是空,向上寻找第一个一样不一样,一样就X2,不一样就放在上面一个。(这里要跳出循环。)
然后逐个往上再次进行以上判断。
4个方向基本一样。
向下的。
        for i in range(len(Two_map[0])):   # x 0-3
            for j in reversed(range(1, len(Two_map))): # y 3-1
                # 基层判断到最后一层。以下的判断是j层往上,不包括j层。
                if Two_map[j][i] == '':
                    for c in reversed(range(j)):
                        if Two_map[c][i] != '':
                            Two_map[j][i], Two_map[c][i] = Two_map[c][i], Two_map[j][i]
                            break
                if Two_map[j][i] != '':
                    for c in reversed(range(j)):
                        if Two_map[c][i] != '' and Two_map[c][i] == Two_map[j][i]:
                            Two_map[j][i] *= 2
                            Two_map[c][i] = ''
                            break
                        elif Two_map[c][i] != '' and Two_map[c][i] != Two_map[j][i]:
                            Two_map[j-1][i], Two_map[c][i] = Two_map[c][i], Two_map[j-1][i]
                            break
                        else:
                            continue

6. 输赢判断。
赢直接找有木有2048(或者其他。)
输直接借鉴@戴宇轩的思路。

用到的tkinter组件。
Label
LabelFrame
Button

大家要是没事也可以练练呦~。

大召唤术!!!@~风介~ @戴宇轩

2048.zip

2.12 KB, 下载次数: 76

评分

参与人数 4荣誉 +23 鱼币 +23 贡献 +18 收起 理由
康小泡 + 5 + 5 + 5 支持楼主!
~风介~ + 5 + 5 + 5 支持楼主!
小甲鱼 + 8 + 8 + 5 热爱鱼C^_^
戴宇轩 + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[j] == i[j + 1]:
                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[j][i] == sqr[j + 1][i]:
                    temp_1 = True
                    break
        else:
            fail = True

if fail:
    # 如果输了, 执行的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-26 17:25:27 | 显示全部楼层

回帖奖励 +2 鱼币

我觉得输了就是整个地图被填满,且没有两个相邻的数是一样的。但是实现方法比较复杂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-26 17:32:05 | 显示全部楼层

回帖奖励 +2 鱼币

慢慢学习~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是啊,我想了想,然后没弄。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-26 18:31:09 | 显示全部楼层

回帖奖励 +2 鱼币

感觉要很好的算法才行,我是算法白痴:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-26 19:13:45 | 显示全部楼层

改了改更新。得跳出两层循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-26 19:17:08 | 显示全部楼层
freeparty 发表于 2015-3-26 18:31
感觉要很好的算法才行,我是算法白痴

有思路了好写,没思路憋不出来。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-26 19:19:49 | 显示全部楼层
wei_Y 发表于 2015-3-26 19:13
改了改更新。得跳出两层循环。

什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-26 19:24:40 | 显示全部楼层

你写的两层嵌套。一个break跳不出俩。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-26 19:48:56 | 显示全部楼层
wei_Y 发表于 2015-3-26 19:24
你写的两层嵌套。一个break跳不出俩。

改好了,刚才没注意。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-26 20:10:44 | 显示全部楼层

回帖奖励 +2 鱼币

不错,有想法就分享出来~~~赞~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-26 20:22:14 | 显示全部楼层
问题来了,干啥不用PyGame?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-26 20:26:59 | 显示全部楼层
小甲鱼 发表于 2015-3-26 20:10
不错,有想法就分享出来~~~赞~~~

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-26 20:29:10 | 显示全部楼层
小甲鱼 发表于 2015-3-26 20:22
问题来了,干啥不用PyGame?

下载 + 看文档 = 发呆。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-26 21:41:42 | 显示全部楼层

回帖奖励 +2 鱼币

感谢楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-27 10:25:41 | 显示全部楼层

回帖奖励 +2 鱼币

NB
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-28 10:22:23 | 显示全部楼层

回帖奖励 +2 鱼币

学习了= =不过感觉还稍微有点粗糙
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-28 10:33:43 | 显示全部楼层

回帖奖励 +2 鱼币

这段时间正在学习这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-28 10:58:02 | 显示全部楼层
netikid 发表于 2015-3-28 10:22
学习了= =不过感觉还稍微有点粗糙

嗯。直接上的label的边框+数字。超粗糙。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 14:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表