コード例 #1
0
class SnakeGame:
    def __init__(self):
        self.wall = Wall()
        self.snake = Snake()
        self.scoreboard = ScoreBoard()
        self.food = Food()
        self.screen = game_screen.screen
        self.game_is_on = True
        self.start_game()

# starting snake

    def start_game(self):
        self.game_is_on = True
        while self.game_is_on:
            self.screen.update()
            time.sleep(0.1)
            self.snake.start_snake()
            # Detect collision with food
            if self.snake.head.distance(self.food) < 15:
                self.snake.extend()
                self.food.refresh()
                self.scoreboard.add_score()
            # Detect collision with wall
            x_cor = self.snake.head.xcor()
            y_cor = self.snake.head.ycor()
            if x_cor > 250 or x_cor < -250 or y_cor > 250 or y_cor < -250:
                self.game_is_on = False
                self.scoreboard.game_over()
            # Collision with tail
            for segment in self.snake.snake_body[1:]:
                if self.snake.head.distance(segment) < 10:
                    self.game_is_on = False
                    self.scoreboard.game_over()
コード例 #2
0
ファイル: game.py プロジェクト: mp51/Py2048
class Game:
    generated_numbers = [2, 4]

    def __init__(self, size, display):
        self.size = size
        self.menu = Menu()
        self.display = display
        self.scoreboard = ScoreBoard('scores')
        self.numbers = []
        self.score = 0

    def show_menu(self):
        while True:
            entry_selected = self.menu.choose(self.display)

            if entry_selected == self.menu.items[0]:  # Play
                self.play()
            elif entry_selected == self.menu.items[1]:  # Scoreboard
                self.display.print_scoreboard(self.scoreboard.high_scores)
                self.display.get_input()
            elif entry_selected == self.menu.items[2]:  # Exit
                break

    def play(self):
        self.numbers = [[None for i in range(self.size)]
                        for j in range(self.size)]
        self.score = 0

        # Generate 2 initial numbers:
        for _ in range(2):
            num, i, j = self.generate_number()
            self.numbers[i][j] = num

        # Game loop
        while True:
            self.display.print_grid(self.numbers)
            self.display.print_score(self.score)

            direction = self.display.get_input()
            if direction in [
                    curses.KEY_UP, curses.KEY_DOWN, curses.KEY_LEFT,
                    curses.KEY_RIGHT
            ]:
                self.move_numbers(direction)

                num, i, j = self.generate_number()

                # Game over condition - grid is full
                if num is None:
                    self.display.print_message(
                        'Game Over! Press q to return to menu.')
                    self.scoreboard.add_score(self.score)
                    while self.display.get_input() != ord('q'):
                        pass
                    break

                self.numbers[i][j] = num

    def get_column(self, col_num):
        column = [row[col_num] for row in self.numbers]
        return column

    def set_column(self, col_num, column):
        for i, row in enumerate(self.numbers):
            row[col_num] = column[i]

    def process_numbers(self, numbers_list):
        numbers = [number for number in numbers_list if number is not None]

        # Merge equal numbers
        i = 0
        while i < len(numbers) - 1:
            if numbers[i] == numbers[i + 1]:
                numbers[i] *= 2
                self.score += numbers[i]
                del (numbers[i + 1])
                i += 1
            i += 1

        # Append empty numbers to match the initial size
        while len(numbers) < self.size:
            numbers.append(None)

        return numbers

    def move_numbers(self, direction):
        if direction == curses.KEY_DOWN:
            for col_num in range(self.size):
                column = self.get_column(col_num)
                column.reverse()
                column = self.process_numbers(column)
                column.reverse()
                self.set_column(col_num, column)

        elif direction == curses.KEY_UP:
            for col_num in range(self.size):
                column = self.get_column(col_num)
                column = self.process_numbers(column)
                self.set_column(col_num, column)

        elif direction == curses.KEY_RIGHT:
            for row_num in range(self.size):
                row = self.numbers[row_num]
                row.reverse()
                row = self.process_numbers(row)
                row.reverse()
                self.numbers[row_num] = row

        elif direction == curses.KEY_LEFT:
            for row_num in range(self.size):
                self.numbers[row_num] = self.process_numbers(
                    self.numbers[row_num])

    def is_grid_full(self):
        for row in self.numbers:
            if None in row:
                return False

        return True

    def generate_number(self):
        if self.is_grid_full():
            return None, None, None

        # Random number
        num = Game.generated_numbers[random.randint(0, 1)]

        # Random position
        i = None
        while i is None:
            i = random.randint(0, self.size - 1)
            j = random.randint(0, self.size - 1)
            if self.numbers[i][j] is not None:
                # The chosen position is not empty, generate another one
                i = None

        return num, i, j
コード例 #3
0
ファイル: main.py プロジェクト: arumu/snake-game
snake = Snake()
food = Food()
score = ScoreBoard()

screen.listen()
screen.onkey(snake.up, "Up")
screen.onkey(snake.down, "Down")
screen.onkey(snake.left, "Left")
screen.onkey(snake.right, "Right")

game_is_on = True
while game_is_on:
    screen.update()
    time.sleep(0.1)
    snake.move()

    if snake.square_list[0].distance(food) < 15:
        food.refresh()
        score.add_score()
        snake.extend()

    if snake.square_list[0].xcor() > 290 or snake.square_list[0].xcor() < -295 \
            or snake.square_list[0].ycor() > 290 or snake.square_list[0].ycor() < -290:
        score.game_over()
        game_is_on = False

    for square in snake.square_list[1:]:
        if snake.square_list[0].distance(square) < 10:
            game_is_on = False
            score.game_over()
screen.exitonclick()
コード例 #4
0
screen.listen()
screen.onkey(snake.up, "Up")
screen.onkey(snake.down, "Down")
screen.onkey(snake.left, "Left")
screen.onkey(snake.right, "Right")

game_is_on = True
while game_is_on:
    screen.update()
    time.sleep(0.1)
    snake.move()

    # Detect collision with food.
    if snake.head.distance(food) < 15:
        scoreboard.add_score()
        food.refresh()
        snake.extend()

    # Detect collision with wall.
    if snake.head.xcor() > 280 or snake.head.xcor() < -280 or snake.head.ycor(
    ) > 280 or snake.head.ycor() < -280:
        scoreboard.reset()
        snake.reset()

    # Detect collision with tail.
    for segment in snake.snake[1:]:
        if segment == snake.head:
            pass
        elif snake.head.distance(segment) < 10:
            scoreboard.reset()