经典方块游戏-俄罗斯方块

1、俄罗斯方块类定义

  1 # -*- coding: utf-8 -*-
  2 
  3 from base import Base
  4 from point import Point
  5 from utils import *
  6 import random
  7 
  8 class Tetris(Base):
  9     __SHAPE_NUM = 7
 10     __FORM_NUM_PER_SHAPE = 4
 11     __SHAPE_S, __SHAPE_Z, __SHAPE_L, __SHAPE_J, __SHAPE_I, __SHAPE_O, __SHAPE_T = 0,1,2,3,4,5,6
 12     __FORM_A, __FORM_B, __FORM_C, __FORM_D = 0,1,2,3
 13     __SHIFT_TAB = (
 14         (
 15             ( (-1, -1), (0, -1), (0, 0), (1, 0) ), 
 16             ( (-1, 1), (-1, 0), (0, 0), (0, -1) ), 
 17             ( (-1, -1), (0, -1), (0, 0), (1, 0) ), 
 18             ( (-1, 1), (-1, 0), (0, 0), (0, -1) )
 19         ), # S
 20         (
 21             ( (1, -1), (0, -1), (0, 0), (-1, 0) ), 
 22             ( (1, 1), (1, 0), (0, 0), (0, -1) ), 
 23             ( (1, -1), (0, -1), (0, 0), (-1, 0) ), 
 24             ( (1, 1), (1, 0), (0, 0), (0, -1) )
 25         ), # Z
 26         (
 27             ( (1, -1), (0, -1), (0, 0), (0, 1) ), 
 28             ( (-1, -1), (-1, 0), (0, 0), (1, 0) ), 
 29             ( (-1, 1), (0, 1), (0, 0), (0, -1) ), 
 30             ( (1, 1), (1, 0), (0, 0), (-1, 0) )
 31         ), # L
 32         (
 33             ( (-1, -1), (0, -1), (0, 0), (0, 1) ), 
 34             ( (-1, 1), (-1, 0), (0, 0), (1, 0) ), 
 35             ( (1, 1), (0, 1), (0, 0), (0, -1) ), 
 36             ( (1, -1), (1, 0), (0, 0), (-1, 0) )
 37         ), # J
 38         (
 39             ( (0, 2), (0, 1), (0, 0), (0, -1) ), 
 40             ( (2, 0), (1, 0), (0, 0), (-1, 0) ), 
 41             ( (0, 2), (0, 1), (0, 0), (0, -1) ), 
 42             ( (2, 0), (1, 0), (0, 0), (-1, 0) )
 43         ), # I
 44         (
 45             ( (1, -1), (0, -1), (0, 0), (1, 0) ), 
 46             ( (1, -1), (0, -1), (0, 0), (1, 0) ), 
 47             ( (1, -1), (0, -1), (0, 0), (1, 0) ), 
 48             ( (1, -1), (0, -1), (0, 0), (1, 0) )
 49         ), # O
 50         (
 51             ( (0, -1), (-1, 0), (0, 0), (1, 0) ), 
 52             ( (0, -1), (-1, 0), (0, 0), (0, 1) ), 
 53             ( (0, 1), (-1, 0), (0, 0), (1, 0) ), 
 54             ( (0, -1), (1, 0), (0, 0), (0, 1) )
 55         ) # T
 56     )
 57     
 58     def __init__(self):
 59         Base.__init__(self)
 60         self._point = self._get_start_point()
 61         self._shape = self._get_shape()
 62         self._form = self._get_form()
 63         self._next_shape = self._get_shape()
 64         self._form = self._get_form()
 65     
 66     def _get_shape(self):
 67         return random.randint(0, self.__SHAPE_NUM - 1)
 68     
 69     def _get_form(self):
 70         return random.randint(0, self.__FORM_NUM_PER_SHAPE - 1)
 71         
 72     def _get_start_point(self):
 73         base_x, base_y = int(Base.width() / 2), Base.height()
 74         
 75         if (self._shape == self.__SHAPE_L and self.__form == self.__FORM_D) or 
 76            (self._shape == self.__SHAPE_J and self.__form == self.__FORM_B) or 
 77            (self._shape == self.__SHAPE_T and self.__form == self.__FORM_C) or 
 78            (self._shape == self.__SHAPE_I and (self.__form == self.__FORM_B or self.__form == self.__FORM_B)):
 79             return Point(base_x, base_y)
 80         return Point(base_x, base_y + 1)
 81     
 82     def _get_shape_points(self):
 83         return ( Point(self._point.x + shift_x, self._point.y + shift_y) for shift_x,shift_y in self.__SHIFT_TAB[self._shape][self._form] )
 84         
 85     def _fall(self):
 86         if self._status != Status.Running:
 87             return
 88             
 89         self._clear_shape_in_area()
 90         self._point.y -= 1
 91         if self._check_shape():
 92             
 93             return
 94         else:
 95             
 96         
 97     def _check_shape(self):
 98         shape_points = self._get_shape_points()
 99         for point in shape_points:
100             if not Base.check_point_in_area(point):
101                 return False
102             if self._area[point.x][point.y] != Block.Empty:
103                 return False
104         return True
105     
106     def _clear_shape_in_area(self):
107         shape_points = self._get_shape_points()
108         for point in shape_points:
109             if Base.check_point_in_area(point):
110                 self._area[point.x][point.y] = Block.Empty
111     
112     def _set_shape_in_area(self):
113         shape_points = self._get_shape_points()
114         for point in shape_points:
115             if Base.check_point_in_area(point):
116                 self._area[point.x][point.y] = Block.Fill
117     
118     def _clear_rows(self):
119         
120     
121 if __name__ == '__main__':
122     tetris = Tetris()
123     print(tetris)
tetris.py

 

posted on 2018-01-05 17:59  Jinglelove  阅读(397)  评论(0编辑  收藏  举报