|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 wei_Y 于 2015-3-26 19:13 编辑
重装系统之后就没装pyqt。(也不大会。)
还是跟着小甲鱼老师的教程走。
前几天发现了刚开始学的时候没做完的2048的代码版。(其实是连思路都木有- -。)
现在从大菜变小菜了,有思路了把算法写了一下。
学了几节尝试给弄到tkinter上了。
直接上的数字,图片还不会弄。界面不美观。也没绑定键盘。另外,呃,没有判断输赢,而且输了要是在点会卡死(赢好做,输真没想起来。)。
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
大家要是没事也可以练练呦~。
大召唤术!!!@~风介~ @戴宇轩
|
评分
-
参与人数 4 | 荣誉 +23 |
鱼币 +23 |
贡献 +18 |
收起
理由
|
康小泡
| + 5 |
+ 5 |
+ 5 |
支持楼主! |
~风介~
| + 5 |
+ 5 |
+ 5 |
支持楼主! |
小甲鱼
| + 8 |
+ 8 |
+ 5 |
热爱鱼C^_^ |
戴宇轩
| + 5 |
+ 5 |
+ 3 |
感谢楼主无私奉献! |
查看全部评分
|