Pythonで手を取って教えます。2048のミニゲームを実現します。


一、開発環境
Pythonバージョン:3.6.4
関連モジュール:
pygameモジュール
いくつかのPythonのモジュールを持っています。
二、環境構築
Pythonをインストールして環境変数に追加し、pipに必要な関連モジュールをインストールすればいいです。
三、原理紹介
「方角キーを使って方形を移動します。同じ数字の2つの方形がぶつかったら、同じ数字の2倍の新しい方形にマージされます。ゲームをする時はできるだけ多くの数字のブロックを組み合わせればいいです。」
大体ゲームのルールが分かりましたら、このゲームを書き始めます。まず、初期化操作をして、自分の好きなゲームの背景音楽を再生します。

#      
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('2048 ――     ')
#       
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1, 30)
次に、2048ゲームのジャンルを定義します。その中では主に2048を実現するための各種ゲームルールがあります。

'''2048  '''
class Game2048(object):
  def __init__(self, matrix_size=(4, 4), max_score_filepath=None, **kwargs):
    # matrix_size: (num_rows, num_cols)
    self.matrix_size = matrix_size
    #          
    self.max_score_filepath = max_score_filepath
    #    
    self.initialize()
具体的には、まず二次元リストを使って現在のゲーム状態を保存します。

self.game_matrix = [['null' for _ in range(self.matrix_size[1])] for _ in range(self.matrix_size[0])]
このうちnullは現在のブロックに数字がないという意味です。該当する位置は現在の数字で表します。明らかに、2048の現在のゲームの状態は4*4のリストで表してもいいです。
在这里插入图片描述
ゲームが始まると、この二次元リストでランダムに二つの位置を選んで数字を生成する必要があります。

'''           '''
def randomGenerateNumber(self):
  empty_pos = []
  for i in range(self.matrix_size[0]):
    for j in range(self.matrix_size[1]):
      if self.game_matrix[i][j] == 'null': empty_pos.append([i, j])
  i, j = random.choice(empty_pos)
  self.game_matrix[i][j] = 2 if random.random() > 0.1 else 4

self.randomGenerateNumber()
self.randomGenerateNumber()
そして、プレイヤーが方向キー(↑↓←→)を押すと、この二次元リストはプレイヤーの操作コマンドによって更新されます。
すべての数字ブロックを移動し、必要なマージとスコアを記録します。
ランダムに1つの数字がまだない位置で1つの数字を生成します。
具体的には、コードの実現は以下の通りである。

'''      '''
def update(self):
  game_matrix_before = copy.deepcopy(self.game_matrix)
  self.move()
  if game_matrix_before != self.game_matrix: self.randomGenerateNumber()
ここでは、すべての数字を移動し、必要な統合コードを実現します。

'''       ,        '''
def move(self):
  #       
  def extract(array):
    array_new = []
    for item in array:
      if item != 'null': array_new.append(item)
    return array_new
  #       
  def merge(array):
    score = 0
    if len(array) < 2: return array, score
    for i in range(len(array)-1):
      if array[i] == 'null':
        break
      if array[i] == array[i+1]:
        array[i] *= 2
        array.pop(i+1)
        array.append('null')
        score += array[i]
    return extract(array), score
  #          return
  if self.move_direction is None: return
  #   
  if self.move_direction == 'up':
    for j in range(self.matrix_size[1]):
      col = []
      for i in range(self.matrix_size[0]):
        col.append(self.game_matrix[i][j])
      col = extract(col)
      col.reverse()
      col, score = merge(col)
      self.score += score
      col.reverse()
      col = col + ['null',] * (self.matrix_size[0] - len(col))
      for i in range(self.matrix_size[0]):
        self.game_matrix[i][j] = col[i]
  #   
  elif self.move_direction == 'down':
    for j in range(self.matrix_size[1]):
      col = []
      for i in range(self.matrix_size[0]):
        col.append(self.game_matrix[i][j])
      col = extract(col)
      col, score = merge(col)
      self.score += score
      col = ['null',] * (self.matrix_size[0] - len(col)) + col
      for i in range(self.matrix_size[0]):
        self.game_matrix[i][j] = col[i]
  #   
  elif self.move_direction == 'left':
    for idx, row in enumerate(copy.deepcopy(self.game_matrix)):
      row = extract(row)
      row.reverse()
      row, score = merge(row)
      self.score += score
      row.reverse()
      row = row + ['null',] * (self.matrix_size[1] - len(row))
      self.game_matrix[idx] = row
  #   
  elif self.move_direction == 'right':
    for idx, row in enumerate(copy.deepcopy(self.game_matrix)):
      row = extract(row)
      row, score = merge(row)
      self.score += score
      row = ['null',] * (self.matrix_size[1] - len(row)) + row
      self.game_matrix[idx] = row
  self.move_direction = None
頭を使うのがおっくうです。T)したがって、この二次元リストを直接的に遍歴して、私たちが望むすべての動作を実現しました。最後に、関数を書いて、現在のゲームの状態からゲームが終わるかどうかを判断します。

'''      '''
@property
def isgameover(self):
  for i in range(self.matrix_size[0]):
    for j in range(self.matrix_size[1]):
      if self.game_matrix[i][j] == 'null': return False
      if (i == self.matrix_size[0] - 1) and (j == self.matrix_size[1] - 1):
        continue
      elif (i == self.matrix_size[0] - 1):
        if (self.game_matrix[i][j] == self.game_matrix[i][j+1]):
          return False
      elif (j == self.matrix_size[1] - 1):
        if (self.game_matrix[i][j] == self.game_matrix[i+1][j]):
          return False
      else:
        if (self.game_matrix[i][j] == self.game_matrix[i+1][j]) or (self.game_matrix[i][j] == self.game_matrix[i][j+1]):
          return False
  return True
実は簡単です。二次元リストが数字で満たされて、数字が合併できないなら、このゲームは終わります。そうでないと、ゲームは終わりません。
2048ゲームの種類を定義したら、私達のゲームは大体書き終わりました。ゲームのメインループでユーザー操作によって現在のゲーム状態を更新し、必要な要素をすべて画面に表示するだけでOKです。

#      
clock = pygame.time.Clock()
is_running = True
while is_running:
  screen.fill(pygame.Color(cfg.BG_COLOR))
  # --    
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      sys.exit()
    elif event.type == pygame.KEYDOWN:
      if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:
        game_2048.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])
  # --      
  game_2048.update()
  if game_2048.isgameover:
    game_2048.saveMaxScore()
    is_running = False
  # --             
  drawGameMatrix(screen, game_2048.game_matrix, cfg)
  start_x, start_y = drawScore(screen, game_2048.score, game_2048.max_score, cfg)
  drawGameIntro(screen, start_x, start_y, cfg)
  # --    
  pygame.display.update()
  clock.tick(cfg.FPS)
return endInterface(screen, cfg)
四、効果図
最後の効果は大体こんなものです。
在这里插入图片描述
在这里插入图片描述
これを遊んでいます。私はまだ野菜チキンです。
ここで、Pythoonで手を取って教えます。2048のミニゲームを実現するための文章はここまで紹介します。Python 2048のゲームの内容については、以前の文章を検索してください。または、次の関連記事を引き続きご覧ください。これからもよろしくお願いします。