파 이 썬 손 으로 2048 미니 게임 을 가르쳐 드릴 게 요.

개발 환경
파 이 썬 버 전:3.6.4
관련 모듈:
pygame 모듈;
파 이 썬 자체 모듈 도 있 습 니 다.
2.환경 구축
Python 을 설치 하고 환경 변수 에 추가 하면 pip 설치 에 필요 한 관련 모듈 을 설치 하면 됩 니 다.
원리 소개
"방향 키 를 사용 하여 사각형 을 이동 합 니 다.두 숫자 가 같은 사각형 이 부 딪 히 면 하나의 숫자 가 원래 의 두 배 인 새로운 사각형 으로 합 쳐 집 니 다.""게임 을 할 때 가능 한 한 이 숫자 사각형 을 많이 합치 면 됩 니 다."
게임 규칙 을 대충 알 고 나 면 이 게임 을 시작 할 수 있 습 니 다.우선 게임 초기 화 작업 을 하고 자신 이 좋아 하 는 게임 배경 음악 을 재생 합 니 다.

#      
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()
구체 적 으로 말 하면 우 리 는 먼저 2 차원 목록 으로 현재 의 게임 상 태 를 저장 합 니 다.

self.game_matrix = [['null' for _ in range(self.matrix_size[1])] for _ in range(self.matrix_size[0])]
그 중에서 null 은 현재 블록 에 숫자 가 없다 는 것 을 나타 낸다.그렇지 않 으 면 해당 위 치 는 현재 숫자 로 표시 합 니 다.2048 작은 게임 의 현재 게임 상 태 는 4*4 의 목록 으로 표시 할 수 있 음 이 분명 하 다.
在这里插入图片描述
게임 이 시작 되 기 전에 우 리 는 이 2 차원 목록 에서 무 작위 로 두 개의 위 치 를 선택 하여 숫자 를 생 성 해 야 한다(즉,2 또는 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()
그리고 유저 가 방향 키(↑↓←→)를 눌 렀 을 때 이 2 차원 목록 은 유저 의 조작 명령 에 따라 업데이트 되 며 주로 두 부분 으로 나 뉜 다.
모든 숫자 블록 을 이동 하고 필요 한 합병 과 점 수 를 기록 합 니 다.
무 작위 로 숫자 가 없 는 위치 에서 숫자 를 생 성 합 니 다.
구체 적 으로 말 하면 코드 는 다음 과 같다.

'''      '''
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
머리 쓰 는 게 귀찮아(어차피 4*4 만 한 TT)그래서 이 2 차원 목록 을 직접 옮 겨 다 니 며 우리 가 원 하 는 모든 조작 을 실현 했다.마지막 으로 우 리 는 함 수 를 하나 더 써 서 현재 의 게임 상태 에 따라 게임 이 끝 났 는 지 아 닌 지 를 판단 하면 된다.

'''      '''
@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
사실은 매우 간단 하 다.만약 에 2 차원 목록 이 숫자 로 채 워 지고 숫자 가 더 이상 합병 되 지 않 으 면 이 게임 은 끝난다.그렇지 않 으 면 게임 은 끝나 지 않 는 다.
2048 게임 종 류 를 정의 하고 우리 의 게임 은 기본적으로 다 쓴 셈 이다.게임 주 순환 에서 사용자 조작 에 따라 현재 게임 상 태 를 업데이트 하고 게임 에 필요 한 모든 요 소 를 화면 에 표시 하면 됩 니 다.

#      
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)
효과 도
마지막 효 과 는 대략 이렇다.
在这里插入图片描述
在这里插入图片描述
이 걸 가지 고 놀 면 난 요리 닭 이 야,헤헤~
파 이 썬 의 손 으로 2048 작은 게임 을 실현 하 는 방법 을 알려 드 리 는 이 글 은 여기까지 입 니 다.더 많은 파 이 썬 2048 작은 게임 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기