鱼C论坛

 找回密码
 立即注册
查看: 2282|回复: 1

新手求解救,2048的游戏代码无法运行

[复制链接]
发表于 2017-3-31 22:55:18 | 显示全部楼层 |阅读模式

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

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

x
  1. #_*_ coding:utf-8 _*_

  2. import curses
  3. from random import randrange , choice # generate and place new tile
  4. from collections import defaultdict

  5. letter_codes = [ord(ch) for ch in 'WASDRQwasdrq']
  6. actions = ['Up' , 'Left', 'Down' , 'Right' , 'Restart' , 'Exit']
  7. actions_dict = dict(zip(letter_codes , actions * 2))

  8. def get_user_action(keyboard):
  9.     char ="N"
  10.     while char not in actions_dict:
  11.         char = keyboard.getch()
  12.         return actions_dict[char]

  13. def transpose(field):
  14.     return [list(row) for row in zip(*field)]

  15. def invert(field):
  16.     return [row[::-1] for row in field]

  17. class GameField(object):
  18.     def _init_(self, height=4 , idth =4, win=2048):
  19.         self.height = height
  20.         self.width = width
  21.         self.win_value = win
  22.         self.score = 0
  23.         self.highscore = 0
  24.         self.reset()

  25.     def reset(self):
  26.         if self.score > self.highscore:
  27.             self.highscore = self.score
  28.         self.score = 0
  29.         self.field = [[0 for i in range(self.width)] for j in range(self.height)]
  30.         self.spawn()
  31.         self.apawn()

  32.         def move(self, direction):
  33.             def move_row_lef(row):
  34.                 def tighten(row): # squeese non-zero elements together
  35.                     new_row = [i for i in row if i !=0]
  36.                     new_row += [0 for i in range(len(row) - len(new_row))]
  37.                     return new_row

  38.                 def merge(row):
  39.                     pair = False
  40.                     new_row =[]
  41.                     for i in range(len(row)):
  42.                         if pair:
  43.                             new_row.append(2 * row[i])
  44.                             self.score += 2 * row[i]
  45.                             pair = False
  46.                         else:
  47.                             if i+1< len(row) and row[i] == row[i+1]:
  48.                                 pair = Ture
  49.                                 new_row.append(0)
  50.                             else:
  51.                                 new_row.append(row[i])
  52.                                 return new_row
  53.                             return tighten(merge(tighten(row)))
  54.             moves = {}
  55.             moves['Left'] = lambda field:\
  56.                             [move_row_left(row) for row in field]
  57.             moves['Right'] = lambda field:\
  58.                              invert(moves['Left'](invert(field)))
  59.             moves['Up'] = lambda field:\
  60.                              transpose(moves['Left'](transpose(field)))
  61.             moves['Down'] = lambda field:\
  62.                              transpose(moves['right'](transpose(field)))

  63.         if direction in moves:
  64.             if self.move_is_possible(direction):
  65.                 self.field = moves[direction](self.field)
  66.                 self.spawn()
  67.                 return Turn
  68.             else:
  69.                 return False

  70.     def is_win(self):
  71.         return any(any(i>= self.win_value for i in row) for row in self.field)

  72.     def is_gameover(self):
  73.         return not any(self.move_is_possible(move) for move in actions)
  74.     def draw(self , screen):
  75.         help_string1 = '(W)Up (S)Down (A)Left (D)Right'
  76.         help_string2 = '      (R)Restart (Q)Exit'
  77.         win_string = 'GAME OVER!'
  78.         def cast(string):
  79.             screen.addstr(string + '\n')

  80.         def draw_hor_separator():
  81.             line = '+ ' + ('+------'*self.width + '+')[1:]
  82.             separator = defaultdict(lambda:line)
  83.             if not hasattr(draw_hor_separator, "counter"):
  84.                 draw_hor_separator.counter = 0
  85.             cast(separator[draw_hor_separator.counter])
  86.             draw_hor_separator.counter += 1
  87.         def draw_row(row):
  88.             cast(''.join('|{: ∧5} '.format (num) if num > 0 else '| ' for num in row) + '|')

  89.         screen.clear()
  90.         cast('SCORE: ' + str(self.score))
  91.         if 0 != self.highscore:
  92.             cast('HIGHSCORE: ' + str(self.highscore))
  93.             for row in self.field:
  94.                 draw_hor_separator()
  95.                 draw_row(row)
  96.             drow_hor_separator()
  97.             if self.is_win():
  98.                 cast(win_string)
  99.             else:
  100.                 if self.is_gameover():
  101.                     cast(gameover_string)
  102.                 else:
  103.                     cast(help_string1)
  104.                     cast(help_string2)

  105.     def spawn(self):
  106.         new_element = 4 if randrange(100) > 89 else 2
  107.         (i,j) = choice([(i,j) for i in range(self.width) for j in range(self.height) if self.field[i][j] == 0])
  108.         self.field[i][j] = new_element
  109.     def move_is_possible(self,direction):
  110.         def row_is_left_movable(row):
  111.             def change(i): # true if there'll be change in i-th tile
  112.                 if row[i] == 0 and row[i + 1] !=0: # Move
  113.                     return True
  114.                 if row[i] !=0 and row[i + 1] == row[i]: # Merge
  115.                     return True
  116.                 return False
  117.             return any(change(i) for i in range(len(row) - 1))
  118.         check = {}
  119.         check['Left'] = lambda field:\
  120.              any(row_is_left_movable(row) for row in field)

  121.         check['Right'] = lambda field:\
  122.               check['Left'](invert(field))
  123.         check['Up']  =  lambda field:\
  124.               check['Left'](transpose(field))
  125.         check['Down'] = lambda field:\
  126.               check['Right'](transpose(field))
  127.         if direction in check:
  128.                     return check[direction](self.field)
  129.         else:
  130.                     return False

  131. def main(stdscr):
  132.     def init():
  133.          # 重置游戏棋盘
  134.          game_field.reset()
  135.          return 'Game'

  136.     def not_game(state):
  137.          game_field.draw(stdscr)
  138.          action = get_user_action(stdscr)
  139.          responses = defaultdict(lambda: state) # 默认是当前状态,没有行为就会一直在当前界面循环
  140.          responses['Restart'],responses['Exit'] ='Init' , 'Exit' #对应不同的行为转化不同的状态
  141.          return responses[action]
  142.     def game():
  143.          # 画出当前棋盘状态
  144.          game_field.draw(stdscr)
  145.          # 读取用户输入得到action
  146.          action =get_user_action(stdscr)
  147.          if action == 'Restart':
  148.                     return 'Init'
  149.          if action == 'Exit':
  150.                     return 'Exit'
  151.          if game_field.move(action): # move successful
  152.                     if game_field.is_win():
  153.                        return 'Win'
  154.                     if game_field.is_gameover():
  155.                        return 'Gameover'
  156.          return 'Game'

  157.     state_actions ={
  158.         'Init': init,
  159.         'Win': lambda: not_game('Win'),
  160.         'Gameover': lambda: not_game('Gameover'),
  161.         'Game': game
  162.         }
  163.     curses.use_default_colors()
  164.     game_field = GameField(win=32)


  165.     state = 'Init'
  166.     #状态机开始循环
  167.     while state != 'Exit':
  168.         state = state_actions[state]()
  169. curses.wrapper(main)
复制代码

新手玩家,网上抄的一个代码,这是第一次运行是这个状态,是什么原因,怎么解决,看不懂

新手玩家,网上抄的一个代码,这是第一次运行是这个状态,是什么原因,怎么解决,看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-1 00:15:20 | 显示全部楼层
提示很明显啊。

找不到这个MOD- -

你确定你拥有这个模组么。shell里查看一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 23:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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