最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實現(xiàn)簡單的俄羅斯方塊

 更新時間:2022年01月16日 09:33:47   作者:NGC?2237號  
這篇文章主要為大家詳細介紹了python實現(xiàn)簡單的俄羅斯方塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了python實現(xiàn)簡單的俄羅斯方塊的具體代碼,供大家參考,具體內(nèi)容如下

1. 案例介紹

俄羅斯方塊是由 4 個小方塊組成不同形狀的板塊,隨機從屏幕上方落下,按方向鍵調(diào)整板塊的位置和方向,在底部拼出完整的一行或幾行。這些完整的橫條會消失,給新落下來的板塊騰出空間,并獲得分?jǐn)?shù)獎勵。沒有被消除掉的方塊不斷堆積,一旦堆到頂端,便告輸,游戲結(jié)束。本例難度為高級,適合具有 Python 進階和 Pygame 編程技巧的用戶學(xué)習(xí)。

2. 設(shè)計要點

邊框――由 15*25 個空格組成,方塊就落在這里面。盒子――組成方塊的其中小方塊,是組成方塊的基本單元。方塊――從邊框頂?shù)粝碌臇|西,游戲者可以翻轉(zhuǎn)和改變位置。每個方塊由 4 個盒子組成。形狀――不同類型的方塊。這里形狀的名字被叫做 T, S, Z ,J, L, I , O。如下圖所示:

模版――用一個列表存放形狀被翻轉(zhuǎn)后的所有可能樣式。全部存放在變量里,變量名字如 S or J。著陸――當(dāng)一個方塊到達邊框的底部或接觸到在其他的盒子話,就說這個方塊著陸了。那樣的話,另一個方塊就會開始下落。

3. 示例效果

4. 示例源碼

import pygame
import random
import os
?
pygame.init()
?
GRID_WIDTH = 20
GRID_NUM_WIDTH = 15
GRID_NUM_HEIGHT = 25
WIDTH, HEIGHT = GRID_WIDTH * GRID_NUM_WIDTH, GRID_WIDTH * GRID_NUM_HEIGHT
SIDE_WIDTH = 200
SCREEN_WIDTH = WIDTH + SIDE_WIDTH
WHITE = (0xff, 0xff, 0xff)
BLACK = (0, 0, 0)
LINE_COLOR = (0x33, 0x33, 0x33)
?
CUBE_COLORS = [
? ? (0xcc, 0x99, 0x99), (0xff, 0xff, 0x99), (0x66, 0x66, 0x99),
? ? (0x99, 0x00, 0x66), (0xff, 0xcc, 0x00), (0xcc, 0x00, 0x33),
? ? (0xff, 0x00, 0x33), (0x00, 0x66, 0x99), (0xff, 0xff, 0x33),
? ? (0x99, 0x00, 0x33), (0xcc, 0xff, 0x66), (0xff, 0x99, 0x00)
]
?
screen = pygame.display.set_mode((SCREEN_WIDTH, HEIGHT))
pygame.display.set_caption("俄羅斯方塊")
clock = pygame.time.Clock()
FPS = 30
?
score = 0
level = 1
?
screen_color_matrix = [[None] * GRID_NUM_WIDTH for i in range(GRID_NUM_HEIGHT)]
?
# 設(shè)置游戲的根目錄為當(dāng)前文件夾
base_folder = os.path.dirname(__file__)
?
?
def show_text(surf, text, size, x, y, color=WHITE):
? ? font_name = os.path.join(base_folder, 'font/font.ttc')
? ? font = pygame.font.Font(font_name, size)
? ? text_surface = font.render(text, True, color)
? ? text_rect = text_surface.get_rect()
? ? text_rect.midtop = (x, y)
? ? surf.blit(text_surface, text_rect)
class CubeShape(object):
? ? SHAPES = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']
? ? I = [[(0, -1), (0, 0), (0, 1), (0, 2)],
? ? ? ? ?[(-1, 0), (0, 0), (1, 0), (2, 0)]]
? ? J = [[(-2, 0), (-1, 0), (0, 0), (0, -1)],
? ? ? ? ?[(-1, 0), (0, 0), (0, 1), (0, 2)],
? ? ? ? ?[(0, 1), (0, 0), (1, 0), (2, 0)],
? ? ? ? ?[(0, -2), (0, -1), (0, 0), (1, 0)]]
? ? L = [[(-2, 0), (-1, 0), (0, 0), (0, 1)],
? ? ? ? ?[(1, 0), (0, 0), (0, 1), (0, 2)],
? ? ? ? ?[(0, -1), (0, 0), (1, 0), (2, 0)],
? ? ? ? ?[(0, -2), (0, -1), (0, 0), (-1, 0)]]
? ? O = [[(0, 0), (0, 1), (1, 0), (1, 1)]]
? ? S = [[(-1, 0), (0, 0), (0, 1), (1, 1)],
? ? ? ? ?[(1, -1), (1, 0), (0, 0), (0, 1)]]
? ? T = [[(0, -1), (0, 0), (0, 1), (-1, 0)],
? ? ? ? ?[(-1, 0), (0, 0), (1, 0), (0, 1)],
? ? ? ? ?[(0, -1), (0, 0), (0, 1), (1, 0)],
? ? ? ? ?[(-1, 0), (0, 0), (1, 0), (0, -1)]]
? ? Z = [[(0, -1), (0, 0), (1, 0), (1, 1)],
? ? ? ? ?[(-1, 0), (0, 0), (0, -1), (1, -1)]]
? ? SHAPES_WITH_DIR = {
? ? ? ? 'I': I, 'J': J, 'L': L, 'O': O, 'S': S, 'T': T, 'Z': Z
? ? }
? ? def __init__(self):
? ? ? ? self.shape = self.SHAPES[random.randint(0, len(self.SHAPES) - 1)]
? ? ? ? # 骨牌所在的行列
? ? ? ? self.center = (2, GRID_NUM_WIDTH // 2)
? ? ? ? self.dir = random.randint(0, len(self.SHAPES_WITH_DIR[self.shape]) - 1)
? ? ? ? self.color = CUBE_COLORS[random.randint(0, len(CUBE_COLORS) - 1)]
? ? def get_all_gridpos(self, center=None):
? ? ? ? curr_shape = self.SHAPES_WITH_DIR[self.shape][self.dir]
? ? ? ? if center is None:
? ? ? ? ? ? center = [self.center[0], self.center[1]]
? ? ? ? return [(cube[0] + center[0], cube[1] + center[1])
? ? ? ? ? ? ? ? for cube in curr_shape]
? ? def conflict(self, center):
? ? ? ? for cube in self.get_all_gridpos(center):
? ? ? ? ? ? # 超出屏幕之外,說明不合法
? ? ? ? ? ? if cube[0] < 0 or cube[1] < 0 or cube[0] >= GRID_NUM_HEIGHT or \
? ? ? ? ? ? ? ? ? ? cube[1] >= GRID_NUM_WIDTH:
? ? ? ? ? ? ? ? return True
? ? ? ? ? ? # 不為None,說明之前已經(jīng)有小方塊存在了,也不合法
? ? ? ? ? ? if screen_color_matrix[cube[0]][cube[1]] is not None:
? ? ? ? ? ? ? ? return True
? ? ? ? return False
? ? def rotate(self):
? ? ? ? new_dir = self.dir + 1
? ? ? ? new_dir %= len(self.SHAPES_WITH_DIR[self.shape])
? ? ? ? old_dir = self.dir
? ? ? ? self.dir = new_dir
? ? ? ? if self.conflict(self.center):
? ? ? ? ? ? self.dir = old_dir
? ? ? ? ? ? return False
? ? def down(self):
? ? ? ? # import pdb; pdb.set_trace()
? ? ? ? center = (self.center[0] + 1, self.center[1])
? ? ? ? if self.conflict(center):
? ? ? ? ? ? return False
? ? ? ? self.center = center
? ? ? ? return True
? ? def left(self):
? ? ? ? center = (self.center[0], self.center[1] - 1)
? ? ? ? if self.conflict(center):
? ? ? ? ? ? return False
? ? ? ? self.center = center
? ? ? ? return True
? ? def right(self):
? ? ? ? center = (self.center[0], self.center[1] + 1)
? ? ? ? if self.conflict(center):
? ? ? ? ? ? return False
? ? ? ? self.center = center
? ? ? ? return True
? ? def draw(self):
? ? ? ? for cube in self.get_all_gridpos():
? ? ? ? ? ? pygame.draw.rect(screen, self.color,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(cube[1] * GRID_WIDTH, cube[0] * GRID_WIDTH,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? GRID_WIDTH, GRID_WIDTH))
? ? ? ? ? ? pygame.draw.rect(screen, WHITE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(cube[1] * GRID_WIDTH, cube[0] * GRID_WIDTH,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? GRID_WIDTH, GRID_WIDTH),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1)
def draw_grids():
? ? for i in range(GRID_NUM_WIDTH):
? ? ? ? pygame.draw.line(screen, LINE_COLOR,
? ? ? ? ? ? ? ? ? ? ? ? ?(i * GRID_WIDTH, 0), (i * GRID_WIDTH, HEIGHT))
? ? for i in range(GRID_NUM_HEIGHT):
? ? ? ? pygame.draw.line(screen, LINE_COLOR,
? ? ? ? ? ? ? ? ? ? ? ? ?(0, i * GRID_WIDTH), (WIDTH, i * GRID_WIDTH))
? ? pygame.draw.line(screen, WHITE,
? ? ? ? ? ? ? ? ? ? ?(GRID_WIDTH * GRID_NUM_WIDTH, 0),
? ? ? ? ? ? ? ? ? ? ?(GRID_WIDTH * GRID_NUM_WIDTH, GRID_WIDTH * GRID_NUM_HEIGHT))
def draw_matrix():
? ? for i, row in zip(range(GRID_NUM_HEIGHT), screen_color_matrix):
? ? ? ? for j, color in zip(range(GRID_NUM_WIDTH), row):
? ? ? ? ? ? if color is not None:
? ? ? ? ? ? ? ? pygame.draw.rect(screen, color,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(j * GRID_WIDTH, i * GRID_WIDTH,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? GRID_WIDTH, GRID_WIDTH))
? ? ? ? ? ? ? ? pygame.draw.rect(screen, WHITE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(j * GRID_WIDTH, i * GRID_WIDTH,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? GRID_WIDTH, GRID_WIDTH), 2)
def draw_score():
? ? show_text(screen, u'得分:{}'.format(score), 20, WIDTH + SIDE_WIDTH // 2, 100)
def remove_full_line():
? ? global screen_color_matrix
? ? global score
? ? global level
? ? new_matrix = [[None] * GRID_NUM_WIDTH for i in range(GRID_NUM_HEIGHT)]
? ? index = GRID_NUM_HEIGHT - 1
? ? n_full_line = 0
? ? for i in range(GRID_NUM_HEIGHT - 1, -1, -1):
? ? ? ? is_full = True
? ? ? ? for j in range(GRID_NUM_WIDTH):
? ? ? ? ? ? if screen_color_matrix[i][j] is None:
? ? ? ? ? ? ? ? is_full = False
? ? ? ? ? ? ? ? continue
? ? ? ? if not is_full:
? ? ? ? ? ? new_matrix[index] = screen_color_matrix[i]
? ? ? ? ? ? index -= 1
? ? ? ? else:
? ? ? ? ? ? n_full_line += 1
? ? score += n_full_line
? ? level = score // 20 + 1
? ? screen_color_matrix = new_matrix
def show_welcome(screen):
? ? show_text(screen, u'俄羅斯方塊', 30, WIDTH / 2, HEIGHT / 2)
? ? show_text(screen, u'按任意鍵開始游戲', 20, WIDTH / 2, HEIGHT / 2 + 50)
running = True
gameover = True
counter = 0
live_cube = None
while running:
? ? clock.tick(FPS)
? ? for event in pygame.event.get():
? ? ? ? if event.type == pygame.QUIT:
? ? ? ? ? ? running = False
? ? ? ? elif event.type == pygame.KEYDOWN:
? ? ? ? ? ? if gameover:
? ? ? ? ? ? ? ? gameover = False
? ? ? ? ? ? ? ? live_cube = CubeShape()
? ? ? ? ? ? ? ? break
? ? ? ? ? ? if event.key == pygame.K_LEFT:
? ? ? ? ? ? ? ? live_cube.left()
? ? ? ? ? ? elif event.key == pygame.K_RIGHT:
? ? ? ? ? ? ? ? live_cube.right()
? ? ? ? ? ? elif event.key == pygame.K_DOWN:
? ? ? ? ? ? ? ? live_cube.down()
? ? ? ? ? ? elif event.key == pygame.K_UP:
? ? ? ? ? ? ? ? live_cube.rotate()
? ? ? ? ? ? elif event.key == pygame.K_SPACE:
? ? ? ? ? ? ? ? while live_cube.down() == True:
? ? ? ? ? ? ? ? ? ? pass
? ? ? ? ? ? remove_full_line()
? ? # level 是為了方便游戲的難度,level 越高 FPS // level 的值越小
? ? # 這樣屏幕刷新的就越快,難度就越大
? ? if gameover is False and counter % (FPS // level) == 0:
? ? ? ? # down 表示下移骨牌,返回False表示下移不成功,可能超過了屏幕或者和之前固定的
? ? ? ? # 小方塊沖突了
? ? ? ? if live_cube.down() == False:
? ? ? ? ? ? for cube in live_cube.get_all_gridpos():
? ? ? ? ? ? ? ? screen_color_matrix[cube[0]][cube[1]] = live_cube.color
? ? ? ? ? ? live_cube = CubeShape()
? ? ? ? ? ? if live_cube.conflict(live_cube.center):
? ? ? ? ? ? ? ? gameover = True
? ? ? ? ? ? ? ? score = 0
? ? ? ? ? ? ? ? live_cube = None
? ? ? ? ? ? ? ? screen_color_matrix = [[None] * GRID_NUM_WIDTH for i in range(GRID_NUM_HEIGHT)]
? ? ? ? # 消除滿行
? ? ? ? remove_full_line()
? ? counter += 1
? ? # 更新屏幕
? ? screen.fill(BLACK)
? ? draw_grids()
? ? draw_matrix()
? ? draw_score()
? ? if live_cube is not None:
? ? ? ? live_cube.draw()
? ? if gameover:
? ? ? ? show_welcome(screen)
? ? pygame.display.update()

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解django實現(xiàn)自定義manage命令的擴展

    詳解django實現(xiàn)自定義manage命令的擴展

    這篇文章主要介紹了django實現(xiàn)自定義manage命令的擴展,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • PyTorch 1.0 正式版已經(jīng)發(fā)布了

    PyTorch 1.0 正式版已經(jīng)發(fā)布了

    今天小編就為大家分享一篇關(guān)于PyTorch 1.0 正式版已經(jīng)發(fā)布了!小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Python3監(jiān)控疫情的完整代碼

    Python3監(jiān)控疫情的完整代碼

    這篇文章主要介紹了Python3監(jiān)控疫情的完整代碼,代碼簡單易懂,非常不錯具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • python創(chuàng)建生成器以及訪問的方法詳解

    python創(chuàng)建生成器以及訪問的方法詳解

    這篇文章主要介紹了python創(chuàng)建生成器以及訪問的方法詳解,與列表一次性地將數(shù)據(jù)全都加載到內(nèi)存不同的是,生成器使用推斷加載數(shù)據(jù),每次只推斷出一個對象,在數(shù)據(jù)量比較大時,可以節(jié)省內(nèi)存,需要的朋友可以參考下
    2023-11-11
  • Python中的集合一起來學(xué)習(xí)一下

    Python中的集合一起來學(xué)習(xí)一下

    這篇文章主要為大家詳細介紹了Python集合,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Win8下python3.5.1安裝教程

    Win8下python3.5.1安裝教程

    這篇文章主要為大家詳細介紹了Win8下python3.5.1安裝教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • pytorch實現(xiàn)textCNN的具體操作

    pytorch實現(xiàn)textCNN的具體操作

    這篇文章主要介紹了pytorch實現(xiàn)textCNN的具體操作流程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 在多種情況/開發(fā)環(huán)境中運行python腳本和代碼的技巧分享

    在多種情況/開發(fā)環(huán)境中運行python腳本和代碼的技巧分享

    Python腳本或程序是包含可執(zhí)行Python代碼的文件,能夠運行Python腳本和代碼可能是您作為Python開發(fā)人員所需的最重要的技能,在本教程中,您將學(xué)習(xí)一些運行Python腳本和代碼的技術(shù),在每種情況下使用的技術(shù)將取決于您的環(huán)境、平臺、需求和技能
    2023-11-11
  • Tkinter使用Progressbar創(chuàng)建和管理進度條的操作代碼

    Tkinter使用Progressbar創(chuàng)建和管理進度條的操作代碼

    Progressbar是Tkinter庫中的一個小部件,用于創(chuàng)建和管理進度條,這篇文章主要介紹了Tkinter使用Progressbar創(chuàng)建和管理進度條,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Python爬豆瓣電影實例

    Python爬豆瓣電影實例

    本篇文章給大家通過Python爬豆瓣電影實例對Python爬蟲更深入的講解,有興趣的學(xué)習(xí)下。
    2018-02-02

最新評論

阳朔县| 南乐县| 临江市| 阿尔山市| 泽州县| 四川省| 新建县| 罗甸县| 开鲁县| 广水市| 拜城县| 调兵山市| 东莞市| 鸡泽县| 北宁市| 武宣县| 淅川县| 米泉市| 汾西县| 海林市| 菏泽市| 佛冈县| 小金县| 六枝特区| 来宾市| 徐闻县| 夹江县| 施甸县| 徐州市| 四平市| 伊通| 丰原市| 安康市| 马龙县| 平果县| 隆回县| 扬中市| 景泰县| 永城市| 金沙县| 五莲县|