From 64229b3c6782eebe303ed3b58af5c47998d728a6 Mon Sep 17 00:00:00 2001
From: kirbylife <gabriel13m@gmail.com>
Date: Sun, 3 Nov 2019 22:15:21 -0600
Subject: [PATCH] movement and delete de last row complete

---
 afutc/game.py | 94 ++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 78 insertions(+), 16 deletions(-)

diff --git a/afutc/game.py b/afutc/game.py
index 22a4f19..f1ef5ac 100644
--- a/afutc/game.py
+++ b/afutc/game.py
@@ -1,8 +1,14 @@
 import curses
 from _curses import error as CursesException
+from random import choice
 
 import numpy as np
 
+from afutc.pieces import PIECES
+
+WIDTH = 20
+HEIGHT = 25
+
 
 def catch(func, default=..., args=[], kwargs={}):
     try:
@@ -23,34 +29,86 @@ class Afutc:
         self.stdscr = stdscr
         self.print = stdscr.addstr
         self.input = stdscr.getkey
-        self.board = np.zeros(shape=(20, 10))
-        self.current_move = np.zeros(shape=(20, 10))
+        self.board = np.zeros(shape=(HEIGHT, WIDTH))
+        self.current_move = np.zeros(shape=(HEIGHT, WIDTH))
+        self.board_center = WIDTH // 2
+        self.current_piece = None
+        self.char = " "
 
     def get_size(self):
         return self.stdscr.getmaxyx()
 
     def draw_board(self):
-        _, heigth = self.get_size()
-        heigth_start = (heigth // 2) - (self.board.shape[1] // 2)
-        print = lambda x: self.print((" " * heigth_start) + x + "\n")
-
+        _, height = self.get_size()
+        height_start = (height // 2) - (WIDTH // 2)
         try:
+            print = lambda x: self.print((" " * height_start) + x + "\n")
             row = "═" * (self.board.shape[1])
+            print("ANOTHER F TETRIS CLONE")
             print(f"╔{row}╗")
-            for n, row in enumerate(self.board):
+            for n, row in enumerate(self.board + self.current_move):
                 row = "".join("▣" if field else " " for field in row)
                 print(f"║{row}║")
             row = "═" * (self.board.shape[1])
-            print(f"╚{row}╝")
+            # print(f"╚{row}╝")
+            print(str(self.pivot))
         except CursesException:
             self.pause()
 
-    def move(self):
-        pass
+    def new_random_piece(self):
+        if all(self.board[-1:, :].flat):
+            new_row = np.zeros(shape=(1, WIDTH))
+            self.board = np.concatenate((new_row, self.board[:-1, :]))
+
+        self.current_move.fill(0.)
+        new_piece = np.array(choice(PIECES))
+        self.current_piece = new_piece.copy()
+        position = self.board_center - (new_piece.shape[1] // 2)
+        for i, row in enumerate(new_piece):
+            for j, value in enumerate(row):
+                self.current_move[i, position + j] = value
+        self.pivot = [0, position]
+
+    def move(self, direction):
+        if direction == "down":
+            if self.pivot[0] == HEIGHT - self.current_piece.shape[0]:
+                self.board = self.board + self.current_move
+                self.new_random_piece()
+                return
+            temp_board = self.current_move.copy()
+            temp_board = temp_board[:-1, :]
+            new_row = np.zeros(shape=(1, WIDTH))
+            temp_board = np.concatenate((new_row, temp_board))
+            if any(filter(lambda x: x == 2, (temp_board + self.board).flat)):
+                self.board = self.board + self.current_move
+                self.new_random_piece()
+            else:
+                self.current_move = temp_board
+                self.pivot[0] += 1
+        elif direction == "left" and self.pivot[1] > 0:
+            temp_board = self.current_move.copy()
+            temp_board = temp_board[:, 1:]
+            new_column = np.zeros(shape=(HEIGHT, 1))
+            temp_board = np.concatenate((temp_board, new_column), axis=1)
+            if any(filter(lambda x: x == 2, (temp_board + self.board).flat)):
+                return
+            self.current_move = temp_board
+            self.pivot[1] -= 1
+        elif direction == "right" and self.pivot[1] < (
+                WIDTH - self.current_piece.shape[1]):
+            temp_board = self.current_move.copy()
+            temp_board = temp_board[:, :-1]
+            new_column = np.zeros(shape=(HEIGHT, 1))
+            temp_board = np.concatenate((new_column, temp_board), axis=1)
+            if any(filter(lambda x: x == 2, (temp_board + self.board).flat)):
+                return
+            self.current_move = temp_board
+            self.pivot[1] += 1
 
     def start(self):
         scr = self.stdscr
         input = self.input
+        self.new_random_piece()
 
         scr.timeout(1000)
 
@@ -60,15 +118,17 @@ class Afutc:
             scr.clear()
 
             if not char:
-                self.pivot[0] += 1
+                self.move("down")
             elif char == "q":
                 self.running = False
-            elif char == "C":  # Left
-                self.pivot[1] += 1
-            elif char == "D":  # Rigth
-                self.pivot[1] -= 1
+            elif char == "C":  # Right
+                self.char = char
+                self.move("right")
+            elif char == "D":  # Left
+                self.char = char
+                self.move("left")
             elif char == "B":  # Down
-                self.pivot[0] += 1
+                self.move("down")
             elif char == "A":  # Rotate
                 pass
             elif char == " ":  # Rotate
@@ -77,6 +137,8 @@ class Afutc:
             self.draw_board()
 
     def pause(self):
+        self.stdscr.refresh()
+        self.stdscr.clear()
         self.print("PAUSE\n")
         self.print("Press <SPACE>")
         while True: