# -*- coding: utf-8 -*- |
from Tkinter import * |
import random |
from tkMessageBox import askquestion |
#尚需改进,有待提高 |
#各种方块的表示,与参考方块的相对位置 |
shapedic = { 1 :(( 0 , 0 ),( 1 , 0 ),( 0 , - 1 ),( 1 , - 1 )), #正方形 |
2 :(( 0 , 0 ),( 0 , - 1 ),( 0 , - 2 ),( 0 , 1 )), #长条 |
3 :(( 0 , 0 ),( 0 , - 1 ),( 1 , 0 ),( 1 , 1 )), #之字型 |
4 :(( 0 , 0 ),( 0 , - 1 ),( - 1 , 0 ),( - 1 , 1 )), #反之字型 |
5 :(( 0 , 0 ),( 1 , 0 ),( - 1 , 0 ),( - 1 , - 1 )), #L型 |
6 :(( 0 , 0 ),( 1 , 0 ),( - 1 , 0 ),( 1 , - 1 )), #反L型 |
7 :(( 0 , 0 ),( 1 , 0 ),( - 1 , 0 ),( 0 , - 1 )) #T型 |
} |
#旋转函数,顺时针旋转90度,相对于参考方块 |
change_dic = {( 0 , 0 ):( 0 , 0 ),( 0 , 1 ):( - 1 , 0 ),( - 1 , 0 ):( 0 , - 1 ),( 0 , - 1 ):( 1 , 0 ),( 1 , 0 ):( 0 , 1 ), |
( 1 , - 1 ):( 1 , 1 ),( 1 , 1 ):( - 1 , 1 ),( - 1 , 1 ):( - 1 , - 1 ),( - 1 , - 1 ):( 1 , - 1 ), |
( 2 , 0 ):( 0 , 2 ),( 0 , 2 ):( - 2 , 0 ),( - 2 , 0 ):( 0 , - 2 ),( 0 , - 2 ):( 2 , 0 )} |
|
#随机颜色 |
colorDict = { |
0 : '#CCC0B4' , |
1 : '#EEE4DA' , |
2 : '#EDE0C8' , |
3 : '#F2B179' , |
4 : '#EC8D54' , |
5 : '#F67C5F' , |
6 : '#EA5937' , |
7 : '#804000' , |
8 : '#F1D04B' , |
9 : '#E4C02A' , |
10 : '#EE7600' , |
11 : '#D5A500' , |
12 : '#E4C02A' , |
13 : '#804000' , |
14 : '#EA5937' , |
15 : '#EE7600' , |
16 : '#776E65' , |
17 : '#776E65' , |
18 : '#FFFFFF' , |
19 : 'yellow' , |
20 : 'blue' , |
21 : 'lightblue' , |
22 : 'red' |
} |
#俄罗斯方块 |
class Game_Russia: |
|
def __init__( self ): |
|
#每个方块的大小 |
self .width = 20 |
|
#方块数目,长和宽 |
self .row = 28 |
self .column = 19 |
|
|
# #初始化 |
# self.scores=0 |
# self.all_square={}#坐标系网格中个位置方块的存在性 |
# self.head_square=[]#参考方块绝对位置 |
# self.new_square=[]#移动方块相对位置 |
# self.direction=-1#方块初始方向 |
# #规定界限 |
# #i表示第i列,0在左边 |
# #j表示第j行,零在上面 |
# for j in range(-4,self.row): |
# for i in range(self.column): |
# self.all_square[i,j]=0 |
# #划界,开口向上 |
# for j in range(self.row+1): |
# self.all_square[19,j]=1 |
# self.all_square[-1,j]=1 |
# for i in range(-1,self.column+1): |
# self.all_square[i,28]=1 |
|
""" |
用来debug |
for j in range(self.row+1): |
for i in range(-1,self.column+1): |
print self.all_square[i,j], |
print |
""" |
self .window = Tk() |
self .window.geometry() |
self .window.maxsize( 400 , 610 ) |
self .window.minsize( 400 , 610 ) |
self .window.title(u "俄罗斯方块" ) |
|
self .frame1 = Frame( self .window,bg = "white" ,relief = GROOVE,borderwidth = 5 ) |
self .frame2 = Frame( self .window,bg = "white" ,relief = RAISED,borderwidth = 2 ,height = 40 , |
width = 570 ) |
self .canvas = Canvas( self .frame1,bg = 'purple' ,width = 400 ,height = 570 ) |
self .score_label = Label( self .frame2,text = "Score: 0" ) |
|
self .frame1.pack() |
self .frame2.pack(fill = BOTH) |
self .score_label.pack(side = LEFT) |
self .canvas.pack(fill = BOTH) |
|
self .draw_wall() |
|
self .initial() |
|
self .get_new_square() |
|
self .draw_new_square() |
|
self .play() |
|
self .window.mainloop() |
|
|
|
"=== View Part ===" |
#边界 |
def draw_wall( self ): |
self .canvas.create_line( 5 , 5 , 385 , 5 ,fill = 'blue' ,width = 1 ) |
self .canvas.create_line( 385 , 5 , 385 , 565 ,fill = 'blue' ,width = 1 ) |
self .canvas.create_line( 5 , 5 , 5 , 565 ,fill = 'blue' ,width = 1 ) |
self .canvas.create_line( 5 , 565 , 385 , 565 ,fill = 'blue' ,width = 1 ) |
|
#得分 |
def draw_score( self ): |
self .get_score() |
self .score_label.config( self .score_label,text = "Score: " + str ( self .scores)) |
#画下面所有不动的方块 |
def draw_square( self ): |
color = colorDict[random.randint( 0 , len (colorDict) - 1 )] |
for j in range ( self .row): |
self .canvas.delete( "line" + str (j)) |
for i in range ( self .column): |
if self .all_square[i,j]: |
self .canvas.create_rectangle( 5 + i * self .width, |
5 + j * self .width, 5 + (i + 1 ) * self .width, |
5 + (j + 1 ) * self .width,fill = color,tags = "line" + str (j)) |
#画移动的方块 |
def draw_new_square( self ): |
self .canvas.delete( "new" ) |
self .head_square[ 1 ] + = 1 |
color = colorDict[random.randint( 0 , len (colorDict) - 1 )] |
for i in range ( 4 ): |
self .canvas.create_rectangle( 5 + ( self .head_square[ 0 ] + self .new_square[i][ 0 ]) * self .width, |
5 + ( self .head_square[ 1 ] + self .new_square[i][ 1 ]) * self .width, |
5 + ( self .head_square[ 0 ] + self .new_square[i][ 0 ] + 1 ) * self .width, |
5 + ( self .head_square[ 1 ] + 1 + self .new_square[i][ 1 ]) * self .width,fill = color,tags = "new" ) |
|
"=== Model Part ===" |
def initial( self ): |
#初始化 |
self .scores = 0 |
self .all_square = {} #坐标系网格中个位置方块的存在性 |
self .head_square = [] #参考方块绝对位置 |
self .new_square = [] #移动方块相对位置 |
self .direction = - 1 #方块初始方向 |
#规定界限 |
#i表示第i列,0在左边 |
#j表示第j行,零在上面 |
for j in range ( - 4 , self .row): |
for i in range ( self .column): |
self .all_square[i,j] = 0 |
#划界,开口向上 |
for j in range ( self .row + 1 ): |
self .all_square[ 19 ,j] = 1 |
self .all_square[ - 1 ,j] = 1 |
for i in range ( - 1 , self .column + 1 ): |
self .all_square[i, 28 ] = 1 |
|
def is_dead( self ): |
#判断死亡与否,最上方中间四个方块 |
for i in { 8 , 9 , 10 , 11 }: |
if self .all_square[i, 0 ]: |
return True |
else : |
return False |
|
|
def get_new_square( self ): |
#获得新的方块,初始位置均为(9,-2) |
self .new = random.randrange( 1 , 8 ) #随机方块 |
#主方块(参考方块)的位置 |
self .direction = random.randrange( 4 ) |
self .head_square = [ 9 , - 2 ] |
self .new_square = list (shapedic[ self .new]) |
for i in range ( self .direction): |
self .change() |
|
|
def delete_one_line( self ,j): |
#得分后删除整行 |
for t in range (j, 2 , - 1 ): |
for i in range ( self .column): |
self .all_square[i,t] = self .all_square[i,t - 1 ] |
for i in range ( self .column): |
self .all_square[i, 0 ] = 0 |
|
|
def get_score( self ): |
for j in range ( self .row): |
for i in range ( self .column): |
#判断某行是否全满 |
if not self .all_square[i,j]: |
break |
else : |
self .scores + = 10 |
self .delete_one_line(j) |
|
#移动方块停止 |
def get_seated( self ): |
self .all_square[ tuple ( self .head_square)] = 1 |
for i in range ( 4 ): |
self .all_square[ self .head_square[ 0 ] + self .new_square[i][ 0 ], |
self .head_square[ 1 ] + self .new_square[i][ 1 ]] = 1 |
|
#方块是否到了最底端 |
def is_seated( self ): |
for i in range ( 4 ): |
if self .all_square[ self .head_square[ 0 ] + self .new_square[i][ 0 ], |
self .head_square[ 1 ] + self .new_square[i][ 1 ] + 1 ]: |
return True |
return False |
|
|
|
"=== Control Part ===" |
#改变方块朝向 |
#通过旋转改变,主方块不动 |
def change( self ): |
if self .new> 1 : |
for i in range ( 4 ): |
if self .all_square[ self .head_square[ 0 ] + change_dic[ self .new_square[i]][ 0 ], self .head_square[ 1 ] + change_dic[ self .new_square[i]][ 1 ]]: |
return |
else : |
for i in range ( 4 ): |
self .new_square[i] = change_dic[ self .new_square[i]] |
else : |
return |
#右移 |
def right_move( self ): |
#先判断是否可以移动 |
for i in range ( 4 ): |
if self .all_square[ self .head_square[ 0 ] + self .new_square[i][ 0 ] - 1 , |
self .head_square[ 1 ] + self .new_square[i][ 1 ]]: |
return True |
self .head_square[ 0 ] - = 1 |
|
#左移 |
def left_move( self ): |
for i in range ( 4 ): |
if self .all_square[ self .head_square[ 0 ] + self .new_square[i][ 0 ] + 1 , |
self .head_square[ 1 ] + self .new_square[i][ 1 ]]: |
return True |
self .head_square[ 0 ] + = 1 |
|
#向下加速 |
def down_quicker( self ): |
while ( not self .is_seated()): |
self .draw_new_square() |
|
self .canvas.after( 50 ) |
self .canvas.update() |
|
#方向键控制 |
def move( self ,event): |
if event.keycode = = 39 : |
self .left_move() |
elif event.keycode = = 38 : |
self .change() |
elif event.keycode = = 37 : |
self .right_move() |
elif event.keycode = = 40 : |
self .down_quicker() |
else : |
pass |
#开始游戏 |
def play( self ): |
self .canvas.bind( '<Key>' , self .move) |
self .canvas.focus_set() |
|
while True : |
if self .is_dead(): |
self .gameover() |
break |
|
if self .is_seated(): |
|
self .get_seated() |
self .get_new_square() |
|
self .draw_score() |
self .draw_square() |
self .draw_new_square() |
|
|
else : |
self .draw_new_square() |
|
self .canvas.after( 500 ) |
self .canvas.update() |
|
#游戏结束 |
def gameover( self ): |
if askquestion( "LOSE" ,u "你输了!\n重新开始吗?" ) = = 'yes' : |
return self .restart() |
else : |
return self .window.destroy() |
|
#重新开始 |
def restart( self ): |
self .initial() |
|
self .draw_square() |
|
self .get_new_square() |
|
self .draw_new_square() |
|
self .play() |
|
#主程序 |
if __name__ = = "__main__" : |
Game_Russia() |
初级程序员
by: goodluck 发表于:2020-04-19 20:50:26 顶(3) | 踩(4) 回复
666
回复评论