diff options
Diffstat (limited to 'turtetris_master')
-rw-r--r-- | turtetris_master/game.py | 37 | ||||
-rw-r--r-- | turtetris_master/state_machine.py | 15 | ||||
-rw-r--r-- | turtetris_master/usb_input.py | 2 |
3 files changed, 38 insertions, 16 deletions
diff --git a/turtetris_master/game.py b/turtetris_master/game.py index c8eab1c..63987b0 100644 --- a/turtetris_master/game.py +++ b/turtetris_master/game.py @@ -42,7 +42,7 @@ class Game: def __init__(self, matrix): self.matrix = matrix matrix.fill('black') # Clear game area - self.mx = [None]*(matrix.width - 3) + self.mx = [None]*(matrix.width - 2) for i in range(len(self.mx)): self.mx[i] = [0]*matrix.height self.stone_next = SHAPES[randrange(len(SHAPES))][:] @@ -51,6 +51,8 @@ class Game: raise Exception('New game but we can\'t place stone') self.step = 0 self.step_edge = 60 + self.score = 0 + self.__show_score__() matrix.display() def new_stone(self): @@ -58,26 +60,27 @@ class Game: self.stone = self.stone_next self.stone_next = SHAPES[randrange(len(SHAPES))][:] # Note: we do copy # Render stone on top - self.stone_x = 3 + self.stone_x = 4 self.stone_y = 0 if self.__check_collision__(self.stone_x, self.stone_y, self.stone): # locate different place self.stone_x = 0 - while self.stone_x < (self.matrix.width - 3) and \ + while self.stone_x < (self.matrix.width - 2) and \ self.__check_collision__(self.stone_x, self.stone_y, self.stone): self.stone_x += 1 - if self.stone_x >= (self.matrix.width - 3): + if self.stone_x >= (self.matrix.width - 2): # Than game over return False self.__render_stone__() # Render next stone for x in range(2): for y in range(4): - if x < len(self.stone_next) and y < len(self.stone_next[x]): + if (x < len(self.stone_next) and y < len(self.stone_next[x]) + and self.stone_next[x][y] != 0): self.matrix.pixel(self.matrix.width - 1 - x, self.matrix.height - 1 - y, - COLORS[self.stone_next[x][y]]) + 'red') else: self.matrix.pixel(self.matrix.width - 1 - x, self.matrix.height - 1 - y, @@ -89,7 +92,7 @@ class Game: for x in range(len(self.stone)): for y in range(len(self.stone[x])): if self.stone[x][y] != 0: - self.matrix.pixel(self.matrix.width - x - 4 - self.stone_x, + self.matrix.pixel(self.matrix.width - x - 3 - self.stone_x, self.matrix.height - 1 - y - self.stone_y, COLORS[self.stone[x][y]]) @@ -98,7 +101,7 @@ class Game: for x in range(len(self.stone)): for y in range(len(self.stone[x])): if self.stone[x][y] != 0: - self.matrix.pixel(self.matrix.width - x - 4 - self.stone_x, + self.matrix.pixel(self.matrix.width - x - 3 - self.stone_x, self.matrix.height - 1 - y - self.stone_y, 'black') @@ -115,6 +118,10 @@ class Game: return True return False + def __show_score__(self): + "Show score in bottom right" + pass + def __place__(self): "Stone can't move so place it, check lines and generate new one" for x in range(len(self.stone)): @@ -135,23 +142,23 @@ class Game: if x >= len(self.mx): # We have full line # Show red line for x in range(len(self.mx)): - self.matrix.pixel(self.matrix.width - x, - self.matrix.height - y, 'red') + self.matrix.pixel(x, y, 'red') self.matrix.display() time.sleep(0.2) # Now move all lines down for yy in range(y, len(self.mx[0]) - 1): for x in range(len(self.mx)): self.mx[x][yy] = self.mx[x][yy + 1] - self.matrix.pixel(self.matrix.width - x, - self.matrix.height - yy, - COLORS[self.mx[x][yy]]) + # Note: mx is already inverted + self.matrix.pixel(x, yy, COLORS[self.mx[x][yy]]) # Make ticks faster self.step_edge *= 0.8 + self.score += 1 + self.__show_score__() else: # Note that this ensures that we check same line again after # line is located - x += 1 + y += 1 # Create new stone (if possible) return self.new_stone() @@ -196,7 +203,7 @@ class Game: if input['left'] != input['right']: self.__move__(input['left']) if self.step >= self.step_edge or \ - (input['down'] and self.step >= self.step_edge/2): + (input['down'] and self.step >= self.step_edge/3): gameover = not self.__down__() self.step = 0 else: diff --git a/turtetris_master/state_machine.py b/turtetris_master/state_machine.py index 182ce7b..3c07acb 100644 --- a/turtetris_master/state_machine.py +++ b/turtetris_master/state_machine.py @@ -25,8 +25,13 @@ class StateMachine: elif state == "game": if self.state == "screen_checker" or self.state == "game-over": self.game = Game(self.matrix) + elif self.state == "game-pause": + pass else: __exception__() + elif state == "game-pause": + if self.state != "game": + __exception__() elif state == "game-over": if self.state != "game": __exception__() @@ -45,8 +50,16 @@ class StateMachine: else: self.screen_checker.tick() elif self.state == "game": - if not self.game.tick(inpt): + if inpt['start']: + self.__update_state__('game-pause') + elif not self.game.tick(inpt): self.__update_state__('game-over') + elif self.state == "game-pause": + if inpt['start']: + self.__update_state__('game') + elif inpt['select']: + self.game = Game(self.matrix) + self.__update_state__('game') elif self.state == "game-over": if inpt['start']: self.__update_state__('game') diff --git a/turtetris_master/usb_input.py b/turtetris_master/usb_input.py index e19a98e..856c653 100644 --- a/turtetris_master/usb_input.py +++ b/turtetris_master/usb_input.py @@ -63,5 +63,7 @@ class Gamepad: changed = {} for key in ['left', 'right', 'up', 'down', 'select', 'start']: changed[key] = new_state[key] and not self.state[key] + if key == 'down': + changed[key] = new_state[key] self.state = new_state return changed |