找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 34233|回复: 26

[代码与实例] 一百行代码实现的《2048》小游戏

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2014-8-19 09:28:50 | 显示全部楼层 |阅读模式
一百行代码实现的《2048》小游戏
python2.7可用,若要在3.0以上运行,需要把Tkinter的“T”改成小写

  1. from Tkinter import *
  2. import random
  3. import tkMessageBox   

  4. root = Tk(className = "2048")
  5. root.geometry("320x360")

  6. str_data=[]
  7. B_list = []
  8. frame2 = Frame(root,borderwidth = 10)
  9. dic_color = {0:'GhostWhite', 2:'AliceBlue', 4:'LightCyan', 8:'Khaki',16:'SandyBrown', 32:'Goldenrod',64:'Orange',128:'Maroon',256:'Tomato',512:'OrangeRed',1024:'FireBrick',2048:'Red'}
  10. list_data=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
  11. left=0
  12. up=1
  13. right=2
  14. down=3
  15. derection_index=[   [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]],
  16.                     [[0,4,8,12],[1,5,9,13],[2,6,10,14],[3,7,11,15]],
  17.                     [[3,2,1,0],[7,6,5,4],[11,10,9,8],[15,14,13,12]],
  18.                     [[12,8,4,0],[13,9,5,1],[14,10,6,2],[15,11,7,3]]   ]

  19. for i in range(16):
  20.     str_data.append(StringVar())
  21.     B_list.append(Button(frame2, width=4, height=2, textvariable = str_data[i]  ,font = ("Courier 20 bold roman"),bg=dic_color[0]))
  22.     B_list[i].grid(row=i/4,column=i%4)

  23. def CanMove(derection, index):
  24.     for i in range(1, 4):
  25.         if list_data[derection_index[derection][index][i]] == list_data[derection_index[derection][index][i-1]]:
  26.             return True
  27.         if list_data[derection_index[derection][index][i]] != 0 and list_data[derection_index[derection][index][i-1]] == 0:
  28.             return True
  29.     return False

  30. def DealSpace(derection, index):
  31.     for i in [3,2,1]:
  32.         if list_data[derection_index[derection][index][i]] == 0:
  33.             continue
  34.         if list_data[derection_index[derection][index][i-1]] == 0:
  35.             j = i
  36.             while (j < 4):
  37.                 list_data[derection_index[derection][index][j-1]] = list_data[derection_index[derection][index][j]]
  38.                 list_data[derection_index[derection][index][j]] = 0
  39.                 j=j+1

  40. def DealEqualNum(derection, index):
  41.     for i in [0,1,2]:
  42.         if list_data[derection_index[derection][index][i]] == list_data[derection_index[derection][index][i+1]]:
  43.             list_data[derection_index[derection][index][i]] = list_data[derection_index[derection][index][i]] * 2
  44.             list_data[derection_index[derection][index][i+1]] = 0

  45. def Move(derection, index):
  46.     DealSpace(derection, index)
  47.     DealEqualNum(derection, index)
  48.     DealSpace(derection, index)

  49. def Refresh():
  50.     for i in range(16):
  51.         B_list[i].configure(bg=dic_color[list_data[i]])
  52.         if list_data[i] == 0:
  53.             str_data[i].set("")
  54.             continue
  55.         str_data[i].set(str(list_data[i]))
  56.          
  57. def key_event(event):
  58.     canmovelist = []
  59.     derection_code = 9
  60.     global list_data

  61.     if event.keycode == 37:
  62.         derection_code = left
  63.     if event.keycode == 39:
  64.         derection_code = right
  65.     if event.keycode == 38:
  66.         derection_code = up
  67.     if event.keycode == 40:
  68.         derection_code = down

  69.     for i in range(4):
  70.         if CanMove(derection_code, i):
  71.             Move(derection_code, i)
  72.             canmovelist.append(i)

  73.     if len(canmovelist) == 0:
  74.         return
  75.     list_data[derection_index[derection_code][canmovelist[random.randint(0,len(canmovelist)-1)]][3]] = 2
  76.     Refresh()
  77.     for i_derection in range(4):
  78.         for i_index in range(4):
  79.             if CanMove(i_derection, i_index):
  80.                 return
  81.     tkMessageBox.showinfo('Game Over','Your score is %u.\n' % sum(list_data))
  82.     list_data=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
  83.     Refresh()

  84. frame2.bind('<KeyRelease>', key_event)
  85. frame2.pack()
  86. frame2.focus_set()
  87. root.mainloop()
复制代码






回复

使用道具 举报

1

主题

3

帖子

15

积分

贫民

积分
15
啊先生 发表于 2014-8-20 13:32:43 | 显示全部楼层
好厉害
回复

使用道具 举报

0

主题

3

帖子

8

积分

贫民

积分
8
excel_916 发表于 2014-9-28 14:48:17 | 显示全部楼层
大神啊
回复

使用道具 举报

0

主题

2

帖子

8

积分

贫民

积分
8
-死神- 发表于 2014-10-17 23:05:54 | 显示全部楼层
运行之后怎么玩啊?
回复 支持 反对

使用道具 举报

0

主题

4

帖子

28

积分

贫民

积分
28
burning 发表于 2014-10-31 17:01:39 | 显示全部楼层
大神
回复

使用道具 举报

0

主题

1

帖子

6

积分

贫民

积分
6
babe219 发表于 2014-11-23 08:55:14 | 显示全部楼层
运行报错
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:\Users\yankecheng\Desktop\2048.py", line 80, in key_event
    if CanMove(derection_code, i):
  File "C:\Users\yankecheng\Desktop\2048.py", line 29, in CanMove
    if list_data[derection_index[derection][index][i]] == list_data[derection_index[derection][index][i-1]]:
IndexError: list index out of range
回复 支持 反对

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang  楼主| 发表于 2014-11-24 16:56:41 | 显示全部楼层
babe219 发表于 2014-11-23 08:55
运行报错
Exception in Tkinter callback
Traceback (most recent call last):

在循环的时候打印 list_data 看看输出, 加断点
回复 支持 反对

使用道具 举报

2

主题

5

帖子

5

积分

贫民

积分
5
Aha 发表于 2014-12-11 18:45:12 | 显示全部楼层
厉害
回复

使用道具 举报

0

主题

7

帖子

7

积分

贫民

积分
7
ncuhzy 发表于 2015-11-9 10:02:34 | 显示全部楼层
膜拜,大神
回复

使用道具 举报

0

主题

1

帖子

6

积分

贫民

积分
6
Miracle-紫狼 发表于 2015-11-26 14:16:14 | 显示全部楼层
厉害!
回复

使用道具 举报

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

本版积分规则

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