python pygame實現(xiàn)2048游戲
更新時間:2018年11月20日 11:47:19 作者:bbappyuanyuan
這篇文章主要為大家詳細介紹了python pygame實現(xiàn)2048游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
實現(xiàn)2048相對來說比較簡單,用4*4的二維數(shù)組保存地圖,pygame.key.get_pressed()獲取鍵盤操作,詳見代碼。
效果圖
代碼
# -*- coding: utf-8 -*- #!/usr/bin/python ''' Created on May 31, 2014 @author: yuanzi ''' import random import sys import pygame from pygame.locals import * PIXEL = 150 SCORE_PIXEL = 100 SIZE = 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概率產(chǎn)生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 # 地圖向左靠攏,其他方向的靠攏可以通過適當旋轉(zhuǎn)實現(xiàn),返回地圖是否更新 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 # 逆時針旋轉(zhuǎn)地圖90度 def rotate90(self): self.map = [[self.map[c][r] for c in range(self.size)] for r in reversed(range(self.size))] # 判斷游戲結(jié)束 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)) # 數(shù)值顯示 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) # 分數(shù)顯示 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)] # 設(shè)置顏色 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)) # 設(shè)置字體 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為實驗參數(shù) 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) # 游戲結(jié)束 pygame.time.delay(3000)
后續(xù)可以考慮實現(xiàn)動畫和AI。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解python如何調(diào)用C/C++底層庫與互相傳值
Python作為一門腳本解釋語言,本身又很好的結(jié)合C++,所以使用Python開發(fā),在性能要求的地方調(diào)用C/C++底層庫,這簡直是神器。本文詳細介紹了Python調(diào)用C/C++底層庫,互相傳值問題,下面一起來看看。2016-08-08python 字典item與iteritems的區(qū)別詳解
這篇文章主要介紹了python 字典item與iteritems的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04在vscode中啟動conda虛擬環(huán)境的思路詳解
這篇文章主要介紹了在vscode中啟動conda虛擬環(huán)境的思路詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12Python利用前序和中序遍歷結(jié)果重建二叉樹的方法
這篇文章主要介紹了Python利用前序和中序遍歷結(jié)果重建二叉樹的方法,實例分析了Python二叉樹的定義與遍歷操作技巧,需要的朋友可以參考下2016-04-04