亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

python實現俄羅斯方塊

2020-02-15 22:03:31
字體:
來源:轉載
供稿:網友

網上搜到一個Pygame寫的俄羅斯方塊(tetris),大部分看懂的前提下增加了注釋,Fedora19下運行OK的

主程序:

#coding:utf8#! /usr/bin/env python# 注釋說明:shape表示一個俄羅斯方塊形狀 cell表示一個小方塊import sysfrom random import choiceimport pygamefrom pygame.locals import *from block import O, I, S, Z, L, J, TCOLS = 16ROWS = 20CELLS = COLS * ROWSCELLPX = 32 # 每個cell的像素寬度POS_FIRST_APPEAR = COLS / 2SCREEN_SIZE = (COLS * CELLPX, ROWS * CELLPX)COLOR_BG = (0, 0, 0)def draw(grid, pos=None):  # grid是一個list,要么值為None,要么值為'Block'  # 非空值在eval()的作用下,用于配置顏色  if pos: # 6x5    s = pos - 3 - 2 * COLS # upper left position    for p in range(0, COLS):      q = s + p * COLS      for i in range(q, q + 6):        if 0 <= i < CELLS:          # 0 <=i < CELLS:表示i這個cell在board內部。          c = eval(grid[i] + ".color") if grid[i] else COLOR_BG          # 執行著色。shape的cell涂對應的class設定好的顏色,否則涂黑(背景色)          a = i % COLS * CELLPX          b = i / COLS * CELLPX          screen.fill(c, (a, b, CELLPX, CELLPX))  else: # all    screen.fill(COLOR_BG)    for i, occupied in enumerate(grid):      if occupied:        c = eval(grid[i] + ".color") # 獲取方塊對應的顏色        a = i % COLS * CELLPX # 橫向長度        b = i / COLS * CELLPX # 縱向長度        screen.fill(c, (a, b, CELLPX, CELLPX))        # fill:為cell上色, 第二個參數表示rect  pygame.display.flip()  # 刷新屏幕def phi(grid1, grid2, pos): # 4x4# 兩個grid之4*4區域內是否會相撞(沖突)  s = pos - 2 - 1 * COLS # upper left position  for p in range(0, 4):    q = s + p * COLS    for i in range(q, q + 4):      try:        if grid1[i] and grid2[i]:          return False      except:        pass  return Truedef merge(grid1, grid2):  # 合并兩個grid  grid = grid1[:]  for i, c in enumerate(grid2):    if c:      grid[i] = c  return griddef complete(grid):  # 減去滿行  n = 0  for i in range(0, CELLS, COLS):    # 步長為一行。    if not None in grid[i:i + COLS]:    #這一句很容易理解錯誤。    #實際含義是:如果grid[i:i + COLS]都不是None,那么執行下面的語句      grid = [None] * COLS + grid[:i] + grid[i + COLS:]      n += 1  return grid, n#n表示減去的行數,用作統計分數pygame.init()pygame.event.set_blocked(None)pygame.event.set_allowed((KEYDOWN, QUIT))pygame.key.set_repeat(75, 0)pygame.display.set_caption('Tetris')screen = pygame.display.set_mode(SCREEN_SIZE)pygame.display.update()grid = [None] * CELLSspeed = 500screen.fill(COLOR_BG)while True: # spawn a block  block = choice([O, I, S, Z, L, J, T])()  pos = POS_FIRST_APPEAR  if not phi(grid, block.grid(pos), pos): break # you lose  pygame.time.set_timer(KEYDOWN, speed)  # repeatedly create an event on the event queue  # speed是時間間隔。。。speed越小,方塊下落的速度越快。。。speed應該換為其他名字  while True: # move the block    draw(merge(grid, block.grid(pos)), pos)    event = pygame.event.wait()    if event.type == QUIT: sys.exit()    try:      aim = {        K_UNKNOWN: pos+COLS,        K_UP: pos,        K_DOWN: pos+COLS,        K_LEFT: pos-1,        K_RIGHT: pos+1,      }[event.key]    except KeyError:      continue    if event.key == K_UP:      # 變形      block.rotate()    elif event.key in (K_LEFT, K_RIGHT) and pos / COLS != aim / COLS:      # pos/COLS表示當前位置所在行      # aim/COLS表示目標位置所在行      # 此判斷表示,當shape在左邊界時,不允許再向左移動(越界。。),在最右邊時向右也禁止      continue    grid_aim = block.grid(aim)    if grid_aim and phi(grid, grid_aim, aim):      pos = aim    else:      if event.key == K_UP:        block.rotate(times=3)      elif not event.key in (K_LEFT, K_RIGHT):        break  grid = merge(grid, block.grid(pos))  grid, n = complete(grid)  if n:    draw(grid)    speed -= 5 * n    if speed < 75: speed = 75            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情伊人电影| 日本精品久久久久久久| 久久人人爽国产| 久久久国产成人精品| 精品二区三区线观看| 91色在线视频| 日韩男女性生活视频| 97人人模人人爽人人喊中文字| 欧美理论电影在线播放| 这里只有精品在线观看| 91在线观看免费高清完整版在线观看| 亚洲免费伊人电影在线观看av| 国产成人综合av| 久久免费成人精品视频| 日韩中文在线中文网在线观看| 日韩免费看的电影电视剧大全| 中文字幕亚洲一区二区三区| 少妇精69xxtheporn| 欧美日韩久久久久| 国产精品尤物福利片在线观看| 欧美电影在线免费观看网站| 亚洲最大的免费| 欧美一级电影在线| 亚洲另类xxxx| 亚洲的天堂在线中文字幕| 国模视频一区二区三区| 国产精品一区电影| 亚洲成av人影院在线观看| 亚州欧美日韩中文视频| 欧美黑人一区二区三区| 中文字幕日韩精品在线观看| 亚洲国产精品悠悠久久琪琪| 亚洲成人a级网| 国外日韩电影在线观看| 久久久97精品| 日韩精品视频在线免费观看| 亚洲欧美视频在线| 日韩精品免费看| 欧美老女人性视频| 欧美成人精品xxx| 中文字幕日本精品| 26uuu国产精品视频| 国产视频自拍一区| 国产精品色视频| 亚洲电影在线观看| 亚洲欧美日韩图片| 欧美国产精品va在线观看| 亚洲视频在线观看免费| 国产精品高潮在线| 欧美激情乱人伦一区| 亚洲毛片一区二区| 亚洲女人天堂色在线7777| 国产精品wwww| 国产欧亚日韩视频| 亚洲xxxx在线| 一本色道久久综合亚洲精品小说| 中文字幕亚洲欧美日韩高清| 日韩av在线播放资源| 日韩一区二区在线视频| 色噜噜久久综合伊人一本| 久久久久久久激情视频| 亚洲第一页在线| 亚洲精品国产综合区久久久久久久| 国产999精品视频| 亚洲社区在线观看| 久久久久久美女| 亚洲一区二区三区777| 91精品视频免费看| 黑丝美女久久久| 456亚洲影院| 亚洲无av在线中文字幕| 日韩视频精品在线| 久久久亚洲欧洲日产国码aⅴ| 欧美精品久久久久久久免费观看| 日韩av一区在线观看| 亚洲黄色有码视频| 国产一区二区在线免费视频| 日韩国产激情在线| 国产精品久久一区主播| 亚洲精品午夜精品| 日韩www在线| 国产日韩一区在线| 欧美黄色三级网站| 91精品在线一区| 国产欧美一区二区三区视频| 欧美亚洲第一页| 国产精品成人一区二区三区吃奶| 韩国一区二区电影| 国产精品v日韩精品| 亚洲人成亚洲人成在线观看| 国模吧一区二区| 欧美日韩高清在线观看| 欧美精品videofree1080p| 精品福利免费观看| 尤物yw午夜国产精品视频明星| 久久黄色av网站| 国产成人精彩在线视频九色| 日韩av中文字幕在线| 日本韩国欧美精品大片卡二| 成人精品久久一区二区三区| 国产精品久久久久久久久久| 国产精品毛片a∨一区二区三区|国| 欧美自拍视频在线观看| 亚洲一区二区国产| 视频在线观看99| 亚洲国产欧美一区二区三区同亚洲| 福利一区视频在线观看| 国产精品激情自拍| 欧美一性一乱一交一视频| 亚洲午夜女主播在线直播| 国产精自产拍久久久久久蜜| 全色精品综合影院| 亚洲精品丝袜日韩| 欧美电影电视剧在线观看| 国自产精品手机在线观看视频| 久久综合电影一区| 亚洲欧洲日产国产网站| 日韩欧美中文字幕在线播放| 91久久精品国产91久久性色| 亚洲qvod图片区电影| 国产精品国产三级国产aⅴ浪潮| 国产成人精品视| 久久免费视频在线观看| 精品福利在线观看| 日韩视频―中文字幕| 欧美日韩免费在线| 久久久久久国产精品久久| 欧美日韩亚洲视频一区| 亚洲aⅴ日韩av电影在线观看| 国产精品久久久久久av福利软件| 国产日韩欧美在线看| 国产在线视频2019最新视频| 一区二区日韩精品| 奇门遁甲1982国语版免费观看高清| 97成人精品区在线播放| 在线视频亚洲欧美| 国内精品400部情侣激情| 成人午夜在线影院| 国产精品小说在线| 2019av中文字幕| 国产精品九九九| 日韩欧美在线观看视频| 欧美色图在线视频| 欧美福利视频在线观看| 亚洲精品99久久久久| 日韩av大片免费看| 日韩av在线免费观看一区| 久久久久久久久久久久久久久久久久av| 精品中文视频在线| 欧美日韩成人免费| 北条麻妃在线一区二区| 亚洲最大中文字幕| 久久久精品久久| 国产精品人人做人人爽| 日韩在线观看免费av| 精品亚洲夜色av98在线观看| 国内精品一区二区三区| 亚洲精品456在线播放狼人| 久久99精品国产99久久6尤物| 成人疯狂猛交xxx| 91精品啪在线观看麻豆免费| 在线观看不卡av| 亚洲香蕉成视频在线观看| 亚洲人成网站777色婷婷|