国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python pygame實現2048游戲

2020-02-15 23:45:04
字體:
來源:轉載
供稿:網友

實現2048相對來說比較簡單,用4*4的二維數組保存地圖,pygame.key.get_pressed()獲取鍵盤操作,詳見代碼。

效果圖

代碼

# -*- coding: utf-8 -*-#!/usr/bin/python'''Created on May 31, 2014@author: yuanzi'''import randomimport sysimport pygamefrom pygame.locals import * PIXEL = 150SCORE_PIXEL = 100SIZE = 4 # 地圖的類class Map:  def __init__(self, size):    self.size = size    self.score = 0    self.map = [[0 for i in range(size)] for i in range(size)]    self.add()    self.add()    # 新增2或4,有1/4概率產生4  def add(self):    while True:      p = random.randint(0, self.size * self.size - 1)      if self.map[p / self.size][p % self.size] == 0:        x = random.randint(0, 3) > 0 and 2 or 4        self.map[p / self.size][p % self.size] = x        self.score += x        break    # 地圖向左靠攏,其他方向的靠攏可以通過適當旋轉實現,返回地圖是否更新  def adjust(self):    changed = False    for a in self.map:      b = []      last = 0      for v in a:        if v != 0:          if v == last:            b.append(b.pop() << 1)            last = 0          else:            b.append(v)            last = v      b += [0] * (self.size - len(b))      for i in range(self.size):        if a[i] != b[i]:          changed = True      a[ : ] = b    return changed    # 逆時針旋轉地圖90度  def rotate90(self):    self.map = [[self.map[c][r] for c in range(self.size)] for r in reversed(range(self.size))]    # 判斷游戲結束  def over(self):    for r in range(self.size):      for c in range(self.size):        if self.map[r][c] == 0:          return False    for r in range(self.size):      for c in range(self.size - 1):        if self.map[r][c] == self.map[r][c + 1]:          return False    for r in range(self.size - 1):      for c in range(self.size):        if self.map[r][c] == self.map[r + 1][c]:          return False    return True    def moveUp(self):    self.rotate90()    if self.adjust():      self.add()    self.rotate90()    self.rotate90()    self.rotate90()    def moveRight(self):    self.rotate90()    self.rotate90()    if self.adjust():      self.add()    self.rotate90()    self.rotate90()    def moveDown(self):    self.rotate90()    self.rotate90()    self.rotate90()    if self.adjust():      self.add()    self.rotate90()    def moveLeft(self):    if self.adjust():      self.add() # 更新屏幕def show(map):  for i in range(SIZE):    for j in range(SIZE):      # 背景顏色塊      screen.blit(map.map[i][j] == 0 and block[(i + j) % 2] or block[2 + (i + j) % 2], (PIXEL * j, PIXEL * i))      # 數值顯示      if map.map[i][j] != 0:        map_text = map_font.render(str(map.map[i][j]), True, (106, 90, 205))        text_rect = map_text.get_rect()        text_rect.center = (PIXEL * j + PIXEL / 2, PIXEL * i + PIXEL / 2)        screen.blit(map_text, text_rect)  # 分數顯示  screen.blit(score_block, (0, PIXEL * SIZE))  score_text = score_font.render((map.over() and "Game over with score " or "Score: ") + str(map.score), True, (106, 90, 205))  score_rect = score_text.get_rect()  score_rect.center = (PIXEL * SIZE / 2, PIXEL * SIZE + SCORE_PIXEL / 2)  screen.blit(score_text, score_rect)  pygame.display.update() map = Map(SIZE)pygame.init()screen = pygame.display.set_mode((PIXEL * SIZE, PIXEL * SIZE + SCORE_PIXEL))pygame.display.set_caption("2048")block = [pygame.Surface((PIXEL, PIXEL)) for i in range(4)]# 設置顏色block[0].fill((152, 251, 152))block[1].fill((240, 255, 255))block[2].fill((0, 255, 127))block[3].fill((225, 255, 255))score_block = pygame.Surface((PIXEL * SIZE, SCORE_PIXEL))score_block.fill((245, 245, 245))# 設置字體map_font = pygame.font.Font(None, PIXEL * 2 / 3)score_font = pygame.font.Font(None, SCORE_PIXEL * 2 / 3)clock = pygame.time.Clock()show(map) while not map.over():  # 12為實驗參數  clock.tick(12)  for event in pygame.event.get():    if event.type == QUIT:      sys.exit()  # 接收玩家操作  pressed_keys = pygame.key.get_pressed()  if pressed_keys[K_w] or pressed_keys[K_UP]:    map.moveUp()  elif pressed_keys[K_s] or pressed_keys[K_DOWN]:    map.moveDown()  elif pressed_keys[K_a] or pressed_keys[K_LEFT]:    map.moveLeft()  elif pressed_keys[K_d] or pressed_keys[K_RIGHT]:    map.moveRight()  show(map) # 游戲結束pygame.time.delay(3000)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广昌县| 元江| 林西县| 大埔区| 保靖县| 崇阳县| 静安区| 萍乡市| 麟游县| 盱眙县| 天柱县| 仁化县| 禹城市| 永丰县| 玉溪市| 隆子县| 宁国市| 榕江县| 九江市| 定边县| 新乡县| 浦东新区| 峡江县| 阳信县| 仁寿县| 定兴县| 鄢陵县| 绵竹市| 浪卡子县| 三门县| 大悟县| 卢氏县| 肇源县| 德保县| 怀化市| 庆元县| 江西省| 威远县| 宾阳县| 喀什市| 民和|