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):
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],
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:
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:
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()
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:
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()