From: Geoffrey Allott Date: Mon, 26 Dec 2022 15:47:46 +0000 (+0000) Subject: add ability to remove border X-Git-Url: https://git.pointlesshacks.com/?a=commitdiff_plain;h=185c229de84423405d8f0aaf9c11f9f91e8772ed;p=snake.git add ability to remove border --- diff --git a/snake.py b/snake.py index 6be31c3..001f575 100644 --- 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()