add ability to remove border
authorGeoffrey Allott <geoffrey@allott.email>
Mon, 26 Dec 2022 15:47:46 +0000 (15:47 +0000)
committerGeoffrey Allott <geoffrey@allott.email>
Mon, 26 Dec 2022 15:47:46 +0000 (15:47 +0000)
snake.py

index 6be31c3f6866daf9fcd404ddd2e1ae7cb1aec492..001f5752a075fa9ea1b1989a051a374d8b90641c 100644 (file)
--- a/snake.py
+++ b/snake.py
@@ -111,15 +111,15 @@ class Snake:
         else:
             self.dir = dir
 
-    def slither(self):
+    def slither(self, width: int, height: int):
         if self.dir == Direction.Left:
-            self.segments.append((self.segments[-1][0], self.segments[-1][1] - 1))
+            self.segments.append((self.segments[-1][0], (self.segments[-1][1] - 1) % width))
         if self.dir == Direction.Right:
-            self.segments.append((self.segments[-1][0], self.segments[-1][1] + 1))
+            self.segments.append((self.segments[-1][0], (self.segments[-1][1] + 1) % width))
         if self.dir == Direction.Up:
-            self.segments.append((self.segments[-1][0] - 1, self.segments[-1][1]))
+            self.segments.append(((self.segments[-1][0] - 1) % height, self.segments[-1][1]))
         if self.dir == Direction.Down:
-            self.segments.append((self.segments[-1][0] + 1, self.segments[-1][1]))
+            self.segments.append(((self.segments[-1][0] + 1) % height, self.segments[-1][1]))
         self.prev_dir = self.dir
 
     def shrink(self):
@@ -178,14 +178,17 @@ class PortalFruitTile(FruitTile):
         return TeleportAction(self.other_end_row, self.other_end_column)
 
 class GameArea:
-    def __init__(self, *, win: "curses window", highscore_file: str, players: int):
+    def __init__(self, *, win: "curses window", highscore_file: str, players: int, border: bool):
         self.win = win
         self.height, self.width = win.getmaxyx()
-        self.tiles = [
-            [WallTile() for _ in range(self.width)],
-            *[[WallTile()] + [EmptyTile() for _ in range(self.width - 2)] + [WallTile()] for _ in range(self.height - 3)],
-            [WallTile() for _ in range(self.width)],
-        ]
+        if border:
+            self.tiles = [
+                [WallTile() for _ in range(self.width)],
+                *[[WallTile()] + [EmptyTile() for _ in range(self.width - 2)] + [WallTile()] for _ in range(self.height - 3)],
+                [WallTile() for _ in range(self.width)],
+            ]
+        else:
+            self.tiles = [[EmptyTile() for _ in range(self.width)] for _ in range(self.height - 1)]
         self.frame = 0
         player_layout = {
             1: [0],
@@ -252,8 +255,6 @@ class GameArea:
             if ch == ord('b'): self.snakes[3].set_dir(Direction.Down)
         if ch == 27 or ch == ord('p'):
             self.pause()
-        if ch == ord('q'):
-            raise ExitGameException()
         if ch == ord('r'):
             raise RestartGameException()
         if ch != -1:
@@ -342,7 +343,7 @@ class GameArea:
         for snake in self.snakes:
             if not snake.alive: continue
             if not snake.turbo and self.frame % 2 == 0: continue
-            snake.slither()
+            snake.slither(self.width, self.height - 1)
             r, c = snake.segments[-1]
             actions[snake] = self.tiles[r][c].action()
         for snake in self.snakes:
@@ -388,8 +389,6 @@ def setup(players: int):
         curses.init_pair(2, curses.COLOR_GREEN, -1)
         curses.init_pair(3, curses.COLOR_BLUE, -1)
         curses.init_pair(4, curses.COLOR_CYAN, -1)
-        curses.init_pair(5, curses.COLOR_MAGENTA, -1)
-        curses.init_pair(6, curses.COLOR_BLACK, -1)
     curses.cbreak()
     curses.noecho()
     curses.nonl()
@@ -401,6 +400,8 @@ def setup(players: int):
 if __name__ == '__main__':
     parser = argparse.ArgumentParser()
     parser.add_argument('--players', '-p', default=1, type=int, help='number of players')
+    parser.add_argument('--border', '-b', default=True, action='store_true', help='put an inpenetrable border on the outside of the game area')
+    parser.add_argument('--no-border', '-n', action='store_false', dest='border', help='remove the border')
     args = parser.parse_args()
 
     if args.players < 1 or args.players > 4:
@@ -408,7 +409,7 @@ if __name__ == '__main__':
 
     while True:
         win = setup(args.players)
-        gamearea = GameArea(win=win, highscore_file=os.path.expanduser('~/.local/snake/highscore'), players=args.players)
+        gamearea = GameArea(win=win, highscore_file=os.path.expanduser('~/.local/snake/highscore'), players=args.players, border=args.border)
         try:
             while True:
                 gamearea.paint()