俄羅斯方塊

2022-09-18 06:09:25 字數 4386 閱讀 9550

座標的儲存方式:

記錄方式有兩種:

1,橫縱座標做乙個二元元組,再用乙個列表裝著一堆二元元組

例如:[(20,1),(20,2),(20,3),(20,4)]代表第20行的1~4列的四個方塊

2,二維陣列,一行是乙個列表,用兩個索引代表橫縱座標,值為1就代表有方塊,0就是沒有方塊

例如:block[20][1] 值為1就表示20行第1列有方塊,block[20][5] 為0表示20行第5列有沒有方塊

鍵盤到影象(本質:鍵盤到核心變數)

下面簡略列出需要的函式

名稱 內容 發生時機

左右移動 修改y軸座標 鍵盤事件

旋轉 複雜的座標轉化 鍵盤事件

下落 修改x軸座標 鍵盤事件,計時器

下落檢查 檢查是否可以繼續下落 下落前後

檢查方塊 逐行檢查是否可以消除, 下落檢察後

消除方塊 檢查方塊後

生成方塊 產生下乙個方塊 消除方塊後

檢查存活

生成的方塊 無法放置<=>堆到頂端<=>game over堆到頂端<=>game over

import pygame, sys, random, time

def new_draw():

screen.fill(white)

for i in range(1, 21):

for j in range(10):

bolck = background[i][j]

if bolck:

pygame.draw.rect(screen, blue, (j * 25 + 1, 500 - i * 25 + 1, 23, 23))

x, y = centre

for i, j in active:

i += x

j += y

pygame.draw.rect(screen, blue, (j * 25 + 1, 500 - i * 25 + 1, 23, 23))

pygame.display.update()

def move_lr(n):

"""n=-1代表向左,n=1代表向右"""

x, y = centre

y += n

for i, j in active:

i += x

j += y

if j < 0 or j > 9 or background[i][j]:

break

else:

centre.clear()

centre.extend([x, y])

def direct_down(self):

"手動點選快速下落「

self.drop_speed= 50

def rotate():

x, y = centre

l = [(-j, i) for i, j in active]

for i, j in l:

i += x

j += y

if j < 0 or j > 9 or background[i][j]:

break

else:

active.clear()

active.extend(l)

def move_down():

x, y = centre

x -= 1

for i, j in active:

i += x

j += y

if background[i][j]:

break

else:

centre.clear()

centre.extend([x, y])

return

# 如果新位置未被占用 通過return結束

# 如果新位置被占用則繼續向下執行

x, y = centre

for i, j in active:

background[x + i][y + j] = 1

l = 

for i in range(1, 20):

if 0 not in background[i]:

# l裝 行號,鑑於刪去後,部分索引變化,對其降序排列,倒著刪除

l.sort(reverse=true)

for i in l:

background.pop(i)

# 隨刪隨補

score[0] += len(l)

pygame.display.set_caption("分數:%d" % (score[0]))

active.clear()

active.extend(list(random.choice(all_block)))

# all_block儲存7種形狀的資訊

centre.clear()

centre.extend([20, 4])

x, y = centre

for i, j in active:

i += x

j += y

if background[i][j]:

break

else:

return

pygame.init()

screen = pygame.display.set_mode((250, 500))

pygame.display.set_caption("俄羅斯方塊")

fclock = pygame.time.clock()

all_block = (((0, 0), (0, -1), (0, 1), (0, 2)),

((0, 0), (0, 1), (-1, 0), (-1, 1)),

((0, 0), (0, -1), (-1, 0), (-1, 1)),

((0, 0), (0, 1), (-1, -1), (-1, 0)),

((0, 0), (0, 1), (1, 0), (0, -1)),

((0, 0), (1, 0), (-1, 0), (1, -1)),

((0, 0), (1, 0), (-1, 0), (1, 1)))

background = [[0 for i in range(10)] for j in range(24)]

background[0] = [1 for i in range(10)]

active = list(random.choice(all_block))

centre = [20, 4]

score = [0]

black = 0, 0, 0

white = 255, 255, 255

blue = 0, 0, 255

times = 0

alive =

press = false

while true:

for event in pygame.event.get():

if event.type == pygame.quit:

sys.exit()

elif event.type == pygame.keydown:

if event.key == pygame.k_left:

move_lr(-1)

elif event.key == pygame.k_right:

move_lr(1)

elif event.key == pygame.k_up:

rotate()

elif event.key == pygame.k_down:

press = true

elif event.type == pygame.keyup:

if event.key == pygame.k_down:

press = false

if press:

times += 10

if times >= 50:

move_down()

times = 0

else:

times += 1

if alive:

pygame.display.set_caption("over分數:%d" % (score[0]))

time.sleep(3)

break

new_draw()

fclock.tick(100)

俄羅斯方塊高階 AI俄羅斯方塊

前文回顧 致青春 python實現俄羅斯方塊 人工智慧大火的今天,如果還是自己玩俄羅斯方塊未免顯得太low,為什麼不對遊戲公升級,讓機器自己去玩俄羅斯方塊呢?有了這個想法之後利用週六週日兩天的時間去蒐集了大量的資料,在電腦宕機好多次之後終於將ai俄羅斯方塊實現了。所謂讓機器自己去玩俄羅斯方塊,就是讓...

俄羅斯方塊

俄羅斯方塊 tetris,俄文 是一款風靡全球的電視遊戲機 和掌上遊戲機遊戲,它由俄羅斯人阿列克謝 帕基特諾夫 發明,故得此名。俄羅斯方塊的基本規則是移動 旋轉和擺放遊戲自動輸出的各種方塊,使之排列成完整的一行或多行並且消除得分。由於上手簡單 老少皆宜,從而家喻戶曉,風靡世界。俄羅斯方塊的開發者是阿...

俄羅斯方塊

include include include include includeusing namespace std include include define mem a,b memset a,b,sizeof a const int sudu 40 const int dir 4 2 cons...