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

Python Pygame實現(xiàn)俄羅斯方塊

 更新時間:2021年02月19日 11:13:07   作者:一個超會寫B(tài)ug的安太狼  
這篇文章主要為大家詳細介紹了Python Pygame實現(xiàn)俄羅斯方塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

源碼:

# coding : utf-8

#: pip install pygame
import random
import sys
import pygame

#: 顏色定義
COLOR_WHITE = (255, 255, 255)
COLOR_BLACK = (0, 0, 0)

class Block:
 """小塊"""
 width = 24
 height = 24

 @staticmethod
 def draw(s, left, top, color, bg_color):
  pygame.draw.rect(s, bg_color, pygame.Rect(left, top, Block.width, Block.height))
  pygame.draw.rect(s, color, pygame.Rect(left, top, Block.width - 1, Block.height - 1))


class Building:
 """積木"""

 def __init__(self):
  """
  方塊的7種基本形狀
  每次初始化隨機選擇一個形狀
  @:return True / False
  """
  self.form = random.choice(
   [
    [
     [0, 0, 0, 0, 0],
     [0, 0, 1, 0, 0],
     [0, 1, 1, 1, 0],
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0]
    ],
    [
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0],
     [1, 1, 1, 1, 0],
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0]
    ],
    [
     [0, 0, 0, 0, 0],
     [0, 1, 1, 0, 0],
     [0, 0, 1, 1, 0],
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0]
    ],
    [
     [0, 0, 0, 0, 0],
     [0, 0, 1, 1, 0],
     [0, 1, 1, 0, 0],
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0]
    ],
    [
     [0, 0, 0, 0, 0],
     [0, 1, 1, 0, 0],
     [0, 0, 1, 0, 0],
     [0, 0, 1, 0, 0],
     [0, 0, 0, 0, 0]
    ],
    [
     [0, 0, 0, 0, 0],
     [0, 0, 1, 1, 0],
     [0, 0, 1, 0, 0],
     [0, 0, 1, 0, 0],
     [0, 0, 0, 0, 0]
    ],
    [
     [0, 0, 0, 0, 0],
     [0, 1, 1, 0, 0],
     [0, 1, 1, 0, 0],
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0]
    ]
   ])

 def __getitem__(self, pos):
  return self.form[pos]

 def __setitem__(self, key, value):
  self.form[key] = value


class Layout:
 """棋盤"""

 def __init__(self):
  self.block_x_count = 16;
  self.block_y_count = 22;
  self.layout = [[0 if 1 < i < self.block_x_count - 2 and j < self.block_y_count - 2 else 1
      for i in range(self.block_x_count)] for j in range(self.block_y_count)]

 @property
 def size(self):
  """返回棋盤屏幕大小(width,height)"""
  return (self.block_x_count * Block.width, self.block_y_count * Block.height)

 def create_new_building(self):
  """
  創(chuàng)建新的積木,初始化位置為第5,0格, 速度為4
  :return: 返回是否無空間創(chuàng)建了
  """
  self.building = Building()
  self.building_left, self.building_top = 5, 0 #
  self.drop_speed = 3
  print(self.test_building_touch_wall())
  return self.test_building_touch_wall()
 
 @property
 def speed(self):
  return self.drop_speed

 def test_building_touch_wall(self, x_offset=0, y_offset=0):
  """
  積木是否已經(jīng)觸底/墻壁
  具體操作:
  判斷積木最后一排的1,是否在當前棋牌對應的位置是也是1
  @:param x_offset: x的偏移量 移動時可以傳入1/-1來判斷
  @:param y_offset: y的偏移量 正常下落時可以傳入1來判斷
  """
  for i in range(4, -1, -1):
   for j in range(5):
    if self.building[i][j]:
     if self.layout[i + self.building_top + y_offset][j + self.building_left + x_offset]:
      return True
  return False

 def move_left_right(self, x):
  """
  左右移動
  @:param x: 移動量 x_offset
  """
  #: 移動時不能撞墻
  if not self.test_building_touch_wall(x_offset=x):
   self.building_left += x

 def down_build(self):
  """ 盒子的自動下移 """
  self.building_top += 1

 def direct_down(self):
  """ 手動快速降落 """
  self.drop_speed = 50

 def convert_building(self):
  """
  * 扭轉盒子的總方位 (右轉)
  具體操作:
  把第一豎排的倒序給第一橫排的
  把第二豎排的倒序給第二橫排的
  后面同理.
  """
  new_box = [[0 for i in range(5)] for j in range(5)]
  for i in range(5):
   for j in range(4, -1, -1):
    new_box[i][j] = self.building[4 - j][i]
  self.building = new_box

 def clear_full_lines(self):
  """消除滿行的所有行"""
  new_layout = [[0 if 1 < i < self.block_x_count - 2 and j < self.block_y_count - 2 else 1
      for i in range(self.block_x_count)] for j in range(self.block_y_count)]

  row_len = self.block_x_count - 4
  new_row = self.block_y_count - 2 - 1
  for cur_row in range(self.block_y_count - 2 - 1, 0, -1):
   if sum(self.layout[cur_row][2:self.block_x_count - 2]) < row_len:
    new_layout[new_row] = self.layout[cur_row]
    new_row -= 1
  self.layout = new_layout

 def put_building_to_layout(self):
  """將積木放到棋盤里"""
  for i in range(4, -1, -1):
   for j in range(5):
    if self.building[i][j]:
     self.layout[i + self.building_top][j + self.building_left] = 1
  #: 這里會調用消除函數(shù)
  self.clear_full_lines()

 def draw_building(self, s):
  """
  顯示積木
  @:param s : pygame = screen 
  """
  cur_left, cur_top = self.building_left * Block.width, self.building_top * Block.height
  for i in range(5):
   for j in range(5):
    # 只畫積木實體,不管盒子本身
    if self.building[j][i]:
     Block.draw(s, cur_left + i * Block.width, cur_top + j * Block.height, COLOR_BLACK, COLOR_WHITE)

 def draw(self, s):
  """
  顯示棋盤
  @:param s : pygame = screen 
  """
  for i in range(self.block_x_count):
   for j in range(self.block_y_count):
    if self.layout[j][i] == 0:
     Block.draw(s, i * Block.width, j * Block.height, COLOR_WHITE, COLOR_BLACK)
    else:
     Block.draw(s, i * Block.width, j * Block.height, COLOR_BLACK, COLOR_WHITE)


# -------------------------------------------------------------------
# Main
# -------------------------------------------------------------------
def main():
 #: 初始化
 while True:
  layout = Layout()
  layout.create_new_building()
  pygame.init()
  pygame.display.set_caption('俄羅斯方塊')
  screen = pygame.display.set_mode((layout.size), 0, 32)
  is_over = False
  #: 單局游戲循環(huán)開始 [結束后直接重新開始]
  while not is_over:
   #: 處理游戲消息
   for e in pygame.event.get():
    if e.type == pygame.QUIT:
     sys.exit()
    #: 處理按鍵
    if e.type == pygame.KEYDOWN:
     if e.key == pygame.K_UP:
      layout.convert_building()
     if e.key == pygame.K_DOWN:
      layout.direct_down()
     if e.key == pygame.K_LEFT:
      layout.move_left_right(-1)
     if e.key == pygame.K_RIGHT:
      layout.move_left_right(1)
   #: 是否碰觸底部地面了,是 -> 融合背景 否 -> 繼續(xù)下落
   if layout.test_building_touch_wall(y_offset=1):
    layout.put_building_to_layout()
    is_over = layout.create_new_building()
   else:
    layout.down_build()
   #: 繪制
   layout.draw(screen)
   layout.draw_building(screen)
   pygame.display.update()
   #: 速度
   pygame.time.Clock().tick(layout.speed)


if __name__ == '__main__':
 main()

效果:

更多俄羅斯方塊精彩文章請點擊專題:俄羅斯方塊游戲集合 進行學習。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python實現(xiàn)抓取騰訊視頻所有電影的示例代碼

    Python實現(xiàn)抓取騰訊視頻所有電影的示例代碼

    這篇文章主要為大家介紹了如何使用python實現(xiàn)抓取騰訊視頻所有電影,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Python實現(xiàn)數(shù)據(jù)可視化看如何監(jiān)控你的爬蟲狀態(tài)【推薦】

    Python實現(xiàn)數(shù)據(jù)可視化看如何監(jiān)控你的爬蟲狀態(tài)【推薦】

    今天主要是來說一下怎么可視化來監(jiān)控你的爬蟲的狀態(tài)。文中通過實例代碼給大家分析了Python實現(xiàn)數(shù)據(jù)可視化看如何監(jiān)控你的爬蟲狀態(tài),感興趣的朋友一起看看吧
    2018-08-08
  • Python?matplotlib實現(xiàn)多子圖布局

    Python?matplotlib實現(xiàn)多子圖布局

    多子圖布局是指在一個圖像中同時顯示多個子圖,每個子圖可以是獨立的圖形或者是相互關聯(lián)的圖形,下面我們就來了解下matplotlib是如何實現(xiàn)多子圖布局的吧
    2023-12-12
  • 使用Python計算玩彩票贏錢概率

    使用Python計算玩彩票贏錢概率

    這篇文章主要介紹了玩彩票贏錢概率有多少?用Python來告訴你,需要的朋友可以參考下
    2019-06-06
  • Python中數(shù)據(jù)解壓縮的技巧分享

    Python中數(shù)據(jù)解壓縮的技巧分享

    在日常的數(shù)據(jù)處理和分析中,經(jīng)常會遇到需要對壓縮數(shù)據(jù)進行解壓縮的情況,本文主要來和大家分享一下Python中數(shù)據(jù)解壓縮的相關技巧,希望對大家有所幫助
    2024-03-03
  • python操作日志的封裝方法(兩種方法)

    python操作日志的封裝方法(兩種方法)

    這篇文章主要介紹了python操作日志的封裝方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-05-05
  • Python3標準庫glob文件名模式匹配的問題

    Python3標準庫glob文件名模式匹配的問題

    glob的模式規(guī)則與re模塊使用的正則表達式并不相同。實際上,glob的模式遵循標準UNIX路徑擴展規(guī)則。只使用幾個特殊字符來實現(xiàn)兩個不同的通配符和字符區(qū)間。這篇文章主要介紹了Python3標準庫glob文件名模式匹配的知識,需要的朋友可以參考下
    2020-03-03
  • 基于Python實現(xiàn)剪切板實時監(jiān)控方法解析

    基于Python實現(xiàn)剪切板實時監(jiān)控方法解析

    這篇文章主要介紹了基于Python實現(xiàn)剪切板實時監(jiān)控方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Python類定義和類繼承詳解

    Python類定義和類繼承詳解

    這篇文章主要介紹了Python類定義和類繼承詳解,本文講解了類的私有屬性、類的方法、私有的類方法、類的專有方法、類的定義、類的單繼承、類的多繼承等內容,需要的朋友可以參考下
    2015-05-05
  • python操作微信自動發(fā)消息的實現(xiàn)(微信聊天機器人)

    python操作微信自動發(fā)消息的實現(xiàn)(微信聊天機器人)

    這篇文章主要介紹了python操作微信自動發(fā)消息(微信聊天機器人),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07

最新評論

贞丰县| 依安县| 东丽区| 江安县| 肇源县| 运城市| 安康市| 米脂县| 保靖县| 长子县| 城固县| 防城港市| 衡东县| 浮山县| 洛浦县| 芒康县| 长宁区| 光泽县| 赣州市| 金昌市| 大同市| 罗定市| 衡阳市| 漯河市| 安庆市| 平南县| 汤原县| 青阳县| 泸定县| 潮州市| 延庆县| 毕节市| 浠水县| 嫩江县| 额尔古纳市| 繁昌县| 犍为县| 木兰县| 景德镇市| 壤塘县| 阿城市|