예제 #1
0
    def test_is_dead(self):

        my_snake = Snake(20, 60)
        self.assertEquals(my_snake.is_dead(), False)
        center = [ceil(my_snake.height / 2), ceil(my_snake.width / 2)]
        my_snake.cells.append([center[0], center[1]])
        self.assertEquals(my_snake.is_dead(), True)
예제 #2
0
 def test_tick(self):
     my_snake = Snake(20, 60)
     center = [ceil(my_snake.height / 2), ceil(my_snake.width / 2)]
     food1 = [center[0], center[1] + 3]
     food2 = [center[0], center[1] + 5]
     self.assertEquals(my_snake.tick(food1), True)
     self.assertEquals(my_snake.tick(food2), False)
예제 #3
0
 def __init__(self):
     pygame.init()
     pygame.mouse.set_visible(False)
     self.main_clock = pygame.time.Clock()
     window.set_caption('snake game')
     self.surface = window.set_mode(surface_size)
     self.snake = Snake(self.surface)
     self.food = Food(self.surface, self.snake.head)
     self.monster = Monster(self.surface, self.snake.head)
     self.food.on_collide_event = self.snake.grow_up
     self.eventHandler = EventHandler(pygame.KEYDOWN)
     self.add_events()
예제 #4
0
    def test_teleport_wall(self):
        my_snake = Snake(20, 60)
        my_snake.cells = [[0, 30]]
        self.assertEquals(my_snake.teleport_wall(), 0)
        my_snake.cells = [[10, 0]]
        self.assertEquals(my_snake.teleport_wall(), 0)
        my_snake.cells = [[my_snake.height - 1, 0]]
        self.assertEquals(my_snake.teleport_wall(), 0)
        my_snake.cells = [[0, my_snake.width - 1]]
        self.assertEquals(my_snake.teleport_wall(), 0)

        self.assertEquals(True, True)
예제 #5
0
class SnakeGame:
    def __init__(self):
        pygame.init()
        pygame.mouse.set_visible(False)
        self.main_clock = pygame.time.Clock()
        window.set_caption('snake game')
        self.surface = window.set_mode(surface_size)
        self.snake = Snake(self.surface)
        self.food = Food(self.surface, self.snake.head)
        self.monster = Monster(self.surface, self.snake.head)
        self.food.on_collide_event = self.snake.grow_up
        self.eventHandler = EventHandler(pygame.KEYDOWN)
        self.add_events()

    def add_events(self):
        # exit.
        self.eventHandler.add_event(QUIT, lambda event: exit(0))
        self.eventHandler.add_subevent(KEYDOWN, K_q, exit)
        # movement.
        self.eventHandler.add_subevent(KEYDOWN, K_UP, self.snake.go_up)
        self.eventHandler.add_subevent(KEYDOWN, K_RIGHT, self.snake.go_right)
        self.eventHandler.add_subevent(KEYDOWN, K_DOWN, self.snake.go_down)
        self.eventHandler.add_subevent(KEYDOWN, K_LEFT, self.snake.go_left)
        self.eventHandler.add_subevent(KEYDOWN, K_LSHIFT, self.snake.speed_up)
        self.eventHandler.add_subevent(KEYDOWN, K_SPACE, self.snake.shrink)
        # self.eventHandler.add_subevent(KEYDOWN, pygame.K_a, self.snake.grow_down_head)

    def update_screen(self):
        self.surface.fill(white)
        pygame.draw.rect(self.surface, black,
                         (0, 0, surface_size[0], surface_size[1]),
                         stroke_width)
        # draw borders.
        self.food.draw()
        self.snake.play()
        self.monster.play()
        self.food.check_collision()
        for i in range(self.food.fixed_counter):
            pygame.draw.rect(self.surface, cp[i % 4], borders_position[i],
                             stroke_width)
        pygame.display.flip()

    def start(self):
        while True:
            self.eventHandler.check_events()
            self.update_screen()
            self.main_clock.tick(50)
예제 #6
0
def main():

    noOfSnakes = int(input())
    snakes = []
    for i in range(noOfSnakes):
        snakes.append(Snake(int(input()), int(input())))

    noOfLadders = int(input())
    ladders = []
    for i in range(noOfLadders):
        ladders.append(Ladder(int(input()), int(input())))

    noOfPlayers = int(input())
    players = []
    for i in range(noOfPlayers):
        players.append(Player(str(input())))

    size = int(input())
    snakeAndLadder1 = SnakeAndLadderService(size)
    snakeAndLadder1.setPlayers(players)
    snakeAndLadder1.setSnakes(snakes)
    snakeAndLadder1.setLadders(ladders)

    snakeAndLadder1.startGame()
예제 #7
0
 def __init__(self):
     self.snake = Snake(self.len, self.len)
     self.board = Board(self.len, self.len)
예제 #8
0
파일: game.py 프로젝트: Rika321/smallSnake
from model.snake import Snake
from view.term_draw import draw_chr

# UP    = (0, -1)
# DOWN  = (0, 1)
# LEFT  = (-1, 0)
# RIGHT = (1, 0)
LEFT = [0, -1]
RIGHT = [0, 1]
UP = [-1, 0]
DOWN = [1, 0]


curses.initscr()
my_board = Board(20, 60)
my_snake = Snake(20, 60)

win = curses.newwin(my_board.height,my_board.width, 0, 0)
win.keypad(1)
curses.noecho()
curses.curs_set(0)
win.border(0)
win.nodelay(1)
key = KEY_RIGHT
score = 0
win.addch(my_board.food[0], my_board.food[1], '*')

while key != 27:  # press Space to exit
    win.border(0)
    win.addstr(0, 2, 'Score : ' + str(score) + ' ')  # Printing 'Score' and
    win.addstr(0, 14, 'Welcome to SNAKE world')  # 'SNAKE' strings
예제 #9
0
def play_game(genomes, config):
    global screen
    global best_fitness
    global pop

    dx = 1
    dy = 0
    best_foods = 0
    generation_number = 0
    best_instance = None
    genome_number = 0

    # Create the field, the snake and a bit of food
    theField = Field(screen, gu.field_width, gu.field_height, gu.blockSize,
                     gu.field_color)

    # Outer loop is for all the genomes
    for genome_id, genome in genomes:
        net = neat.nn.FeedForwardNetwork.create(genome, config)
        dx = 1
        dy = 0
        score = 0.0
        calories = 100

        # create food at random position
        theFood = Food(theField)

        # Snake starts from a fixed location
        theSnake = Snake(theField,
                         gu.snake_color,
                         5,
                         x=int(gu.field_width / 2),
                         y=int(gu.field_height / 2))

        # initialize an empty set for loop detection
        loopPoints = set()
        food_count = 0  # keep counting of food

        while True:
            event = pygame.event.wait()

            # Window is going to be closed
            if event.type == pygame.QUIT:
                print("Quitting the game now ...")

                ## save the population
                gu.save_object(pop, gu.pop_data_file)
                pygame.quit()
                sys.exit()

            # Every TIME_DURATION there will be a SNAKE_EVENT to move the snake
            if event.type == SNAKE_EVENT:
                # initially dx = 1 and dy = 0 i.e. moving to the right on X axis

                # current distance from the food
                hx, hy = theSnake.position()
                fx, fy = theFood.position()
                dist_before_move = math.sqrt((hx - fx)**2 + (hy - fy)**2)

                # find out current input points (total 9 for now)
                inputs = gu.get_inputs(theSnake.body[0], theFood.position(),
                                       (gu.field_width, gu.field_height),
                                       (dx, dy))

                # it will generate 3 outputs (continue straight, left or right)
                outputs = net.activate(inputs)

                # find index of maximum value and determine the direction (0 - straight, 1 - left or 2 - right)
                direction = outputs.index(max(outputs))

                # decide the movement direction based on the outcome
                if direction == 1:  # turn left
                    (dx, dy) = gu.left((dx, dy))
                elif direction == 2:  # turn right
                    (dx, dy) = gu.right((dx, dy))
                else:  # keep going straight (direction = 0)
                    # dx and dy values will remain same
                    pass

                # because of movement calories will burn
                calories -= 1

                # move the snake now, also check if move is invalid or calories are exausted
                # if not theSnake.move(dx, dy) or calories <= 0:
                if (theSnake.move(dx, dy) == False) or (theSnake.body[0]
                                                        in loopPoints):
                    # too bad snake died
                    # genome.fitness = 0
                    loopPoints = set()
                    break

                # Reward the snake for being alive
                score += gu.ALIVE_SCORE

                # punish for the loop
                # if theSnake.body[0] in loopPoints:
                #    score -= gu.LOOP_SCORE

                # keep tracking head positon till next food grab
                loopPoints.add(theSnake.body[0])

                # distance from the food after the move
                hx, hy = theSnake.position()
                dist_after_move = math.sqrt((hx - fx)**2 + (hy - fy)**2)

                # adjust the score
                if (hx, hy) == (fx, fy):
                    # if snake grabs the food
                    food_count += 1
                    score += gu.FOOD_SCORE
                    calories += gu.FOOD_CALORIES  # found food, got calories
                    theSnake.grow()  # grow by one length

                    # Make new food now
                    theFood = Food(theField)

                    # Also reset loopPoints
                    loopPoints = set()
                elif dist_after_move > dist_before_move:
                    score -= gu.FAR_SCORE
                elif dist_after_move < dist_before_move:
                    score += gu.NEAR_SCORE
                else:
                    # place holder for something else
                    score += 0
            # end of SNAKE_EVENT

            # Render snake and food
            theField.draw()
            theFood.draw()
            theSnake.draw()
            pygame.display.update()
            pygame.time.wait(gu.renderdelay)
        # end of while loop

        # while loop is done for the current genome
        for i in range(0, 2):
            theField.draw()
            theFood.draw()
            theSnake.draw(damage=(i % 2 == 0))
            pygame.display.update()

        # Tell about the fitness
        genome.fitness = score / 100

        # Keep saving best instance
        if not best_instance or genome.fitness > best_fitness:
            best_instance = {
                'num_generation': generation_number,
                'fitness': genome.fitness,
                'score': score,
                'genome': genome,
                'net': net,
            }

        best_foods = max(best_foods, food_count)
        best_fitness = max(best_fitness, genome.fitness)
        # if gu.debug_on:
        roudn_places = 5
        print(f"Generation {generation_number} \t" + \
              f"Genome {genome_number} \t" + \
              f"Foods {food_count} \t" + \
              f"BF {best_foods} \t" + \
              f"Fitness {round(genome.fitness, roudn_places)}  \t" + \
              f"Best fitness {round(best_fitness, roudn_places)}  \t" + \
              f"Score {round(score, roudn_places)}")
        genome_number += 1
    # end of for loop, all genomes are done

    # Save end results
    gu.save_best_generation_instance(best_instance)
    generation_number += 1
    if generation_number % 20 == 0:
        gu.save_object(pop, gu.pop_data_file)
        print("Exporting population")
        # export population
        # gu.save_object(pop,gu.pop_data_file)
        # export population

    global list_best_fitness
    global fig
    list_best_fitness.append(best_fitness)
    line_best_fitness.set_ydata(np.array(list_best_fitness))
    line_best_fitness.set_xdata(list(range(len(list_best_fitness))))
    plt.xlim(0, len(list_best_fitness) - 1)
    plt.ylim(0, max(list_best_fitness) + 0.5)
    fig.canvas.draw()
    fig.canvas.flush_events()
예제 #10
0
def single_ai_mode():
    # set up local player data
    addPlayerData(player_name)

    screen_size = [700, 700]
    pygame.init()
    fpsClock = pygame.time.Clock()
    # create pyGame screen
    playSurface = pygame.display.set_mode((screen_size[0], screen_size[1]))
    my_board = Board(50, 50)
    my_snake = Snake(50, 50)

    # set up food and snake
    food_loc = [my_board.food]
    draw_surface(playSurface, redColour, [my_board.food], 10,
                 100)  # draw first food
    pygame.display.set_caption('Food Snake')
    total_score = 0
    score = 0
    isEnd = False

    while True:
        # give AI input, and let AI control snake
        dir = AI1(my_board, my_snake)
        my_snake.turn(dir)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quitHelper()
            elif event.type == pygame.KEYDOWN:
                if event.key == ord('q'):
                    isEnd = True
                if event.key == pygame.K_ESCAPE:
                    pygame.event.post(pygame.event.Event(pygame.QUIT))
        # increase along the moving direction
        draw_surface(playSurface, blackColour, my_snake.get_cells(), 10, 100)
        status = my_snake.tick(my_board.food, [])
        my_snake.teleport_wall()
        my_new_cells = my_snake.get_cells()

        if my_snake.is_dead([]) or isEnd:
            break

        # When snake eats the food
        if status == 1:
            score += my_board.foodWeight
            total_score += 1
            my_board.new_food(my_new_cells, my_snake.obstacles, [])
            food_loc = [my_board.food]

        playSurface.fill(blackColour)
        pygame.draw.polygon(playSurface, greenColour,
                            [[99, 99], [99, 601], [601, 601], [601, 99]], 1)
        show_message(playSurface, 'Score: ' + str(total_score), whiteColour,
                     40, 10, 10)
        screen.blit(avatar_image, (20, 615))
        show_message(playSurface, player_name, whiteColour, 40, 100, 630)
        draw_surface(playSurface, redColour, food_loc, 10, 100)
        draw_surface(playSurface, greenColour, my_snake.obstacles, 10, 100)
        draw_surface(playSurface, whiteColour, my_new_cells, 10, 100)
        pygame.display.flip()
        # speed is changeable
        fpsClock.tick(my_snake.speed)
    game_end(total_score)
예제 #11
0
 def test_turn(self):
     my_snake = Snake(20, 60)
     self.assertEquals(my_snake.turn([-1, 0]), True)
     self.assertEquals(my_snake.turn([0, -1]), False)
예제 #12
0
파일: gui_game.py 프로젝트: yzhan189/Snake
def duo_ai_mode(two_AI):
    global player1_name, player2_name, avatar1_image, avatar2_image
    init_name()
    final_score1 = 0
    player1_name = player_name
    avatar1_image = avatar_image
    addPlayerData(player_name)

    # init_name()
    final_score2 = 0
    player2_name = player_name
    avatar2_image = avatar_image
    addPlayerData(player2_name)

    screen_size = [700, 700]
    pygame.init()
    fpsClock = pygame.time.Clock()
    # create pyGame screen
    level = 1
    playSurface = pygame.display.set_mode((screen_size[0], screen_size[1]))
    my_board = Board(50, 50)
    my_snake = Snake(50, 50)
    op_snake = Snake(50, 50)
    op_snake.obstacles = my_snake.obstacles

    # set up food and snake
    food_loc = [my_board.food]
    draw_surface(playSurface, redColour, [my_board.food], 10,
                 100)  # draw first food
    pygame.display.set_caption('Food Snake')
    total_score = 0
    score = 0
    isEnd = False

    # check input and go as the direction
    while True:
        # give AI input, and let AI control snake
        # o.w human VS AI
        if two_AI:
            dir = AI1(my_board, my_snake)
            my_snake.turn(dir)

        # op is pure AI
        dir = AI12(my_board, op_snake)
        op_snake.turn(dir)

        # catch event and control snake
        eventHelper(my_snake, True)

        # increase along the moving direction
        draw_surface(playSurface, blackColour, my_snake.get_cells(), 10, 100)
        status1 = my_snake.tick(my_board.food, [])
        my_snake.teleport_wall()

        # increase along the moving direction
        draw_surface(playSurface, blackColour, op_snake.get_cells(), 10, 100)
        status2 = op_snake.tick(my_board.food, [])
        op_snake.teleport_wall()

        my_new_cells = my_snake.get_cells()
        op_new_cells = op_snake.get_cells()

        # two player mode
        if my_snake.is_dead(op_new_cells) or op_snake.is_dead(
                my_new_cells) or isEnd:
            break
        # if AI is dead
        # if op_snake.is_dead(my_new_cells):
        #     score += 10
        #     op_snake = Snake(50, 50)
        #     op_snake.obstacles = my_snake.obstacles

        # When my snake eats the food
        if status1 == 1 or status2 == 1:
            score += my_board.foodWeight
            if status1 == 1:
                final_score1 += 1
            else:
                final_score2 += 1
            my_board.new_food(my_new_cells, my_snake.obstacles, op_new_cells)
            food_loc = [my_board.food]
            if score - level > level / 2:
                level += 1
            if level % 2 == 0:
                my_snake.add_obstcles(level)
            if level % 3 == 0:
                my_snake.speed += 1
        # update display
        displayHelper(playSurface, fpsClock, level, food_loc, my_snake,
                      total_score, player1_name, 601, op_new_cells)

    game_end(final_score1)
예제 #13
0
파일: gui_game.py 프로젝트: yzhan189/Snake
def single_ai_mode():
    # set up local player data
    addPlayerData(player_name)

    screen_size = [700, 700]
    pygame.init()
    fpsClock = pygame.time.Clock()
    # create pyGame screen
    playSurface = pygame.display.set_mode((screen_size[0], screen_size[1]))
    my_board = Board(50, 50)
    my_snake = Snake(50, 50)

    # set up food and snake
    food_loc = [my_board.food]
    draw_surface(playSurface, redColour, [my_board.food], 10,
                 100)  # draw first food
    pygame.display.set_caption('Food Snake')
    total_score = 0
    score = 0
    level = 1
    isEnd = False

    while True:
        # give AI input, and let AI control snake
        dir = AI1(my_board, my_snake)
        my_snake.turn(dir)

        # catch event and control snake
        eventHelper(my_snake, False)

        # increase along the moving direction
        draw_surface(playSurface, blackColour, my_snake.get_cells(), 10, 100)
        status = my_snake.tick(my_board.food, [])
        my_snake.teleport_wall()
        my_new_cells = my_snake.get_cells()

        if my_snake.is_dead([]) or isEnd:
            break

        # When snake eats the food
        if status == 1:
            score += my_board.foodWeight
            total_score += 1
            my_board.new_food(my_new_cells, my_snake.obstacles, [])
            food_loc = [my_board.food]

            if score - level > level / 2:
                level += 1
            if level % 2 == 0:
                my_snake.add_obstcles(level)
            if level % 3 == 0:
                my_snake.speed += 1

        displayHelper(playSurface, fpsClock, level, food_loc, my_snake,
                      total_score, player_name)

    game_end(total_score)
예제 #14
0
파일: gui_game.py 프로젝트: yzhan189/Snake
def standard_mode():
    # set up local player data
    addPlayerData(player_name)

    screen_size = [700, 700]
    pygame.init()
    fpsClock = pygame.time.Clock()
    playSurface = pygame.display.set_mode((screen_size[0], screen_size[1]))
    my_board = Board(50, 50)
    my_snake = Snake(50, 50)

    # set up food and snake
    food_loc = [my_board.food]
    worm_loc = []
    draw_surface(playSurface, redColour, [my_board.food], 10,
                 100)  # draw first food
    pygame.display.set_caption('Food Snake')
    total_score = 0
    level = 1
    score = 0
    isEnd = False
    while True:
        # catch event and control snake
        eventHelper(my_snake, True)

        # increase along the moving direction
        draw_surface(playSurface, blackColour, my_snake.get_cells(), 10, 100)
        status = my_snake.tick(my_board.food, my_board.wormhole)

        #if all snake body disappeared, go to next level!
        if my_snake.get_cells() == []:
            my_snake.cells = [[1, 1], [1, 2],
                              [1, 3]]  # reassign snake's position!
            level += 1
            score = 0
            if level == 2:
                for i in range(20, 30, 1):
                    my_snake.obstacles.append([i, 25])
            elif level == 3:
                for i in range(20, 30, 1):
                    my_snake.obstacles.append([i, 15])
                    my_snake.obstacles.append([i, 35])
            worm_loc = []
            my_board.new_food(my_new_cells, my_snake.obstacles, [])
            food_loc = [my_board.food]

        my_snake.teleport_wall()
        my_new_cells = my_snake.get_cells()

        # ending condition
        if my_snake.is_dead([]) or isEnd:
            break
        if status == 1:
            score += my_board.foodWeight
            total_score += 1
            if score > 1:
                my_board.new_wormhole(my_new_cells, my_snake.obstacles, [])
                worm_loc = [my_board.wormhole]
                food_loc = []
            else:
                my_board.new_food(my_new_cells, my_snake.obstacles, [])
                food_loc = [my_board.food]

        # update display each round
        displayHelper(playSurface, fpsClock, level, food_loc, my_snake)

    game_end(total_score)
예제 #15
0
def run_game():
    """
    主程序负责执行游戏
    """
    pygame.init()
    # 实例化设置类
    gm_setting = Settings()
    # 初始化屏幕
    screen = pygame.display.set_mode(
        (gm_setting.screen_width, gm_setting.screen_height))
    pygame.display.set_caption("Maze")
    # 获取迷宫数组
    maze = CreateMaze()
    # 生成迷宫
    maze.prim()
    # 生成迷宫的答案
    ans = PassageWay(gm_setting, maze.m)
    ans.get_path()
    ans.get_level()
    # print("ans.level", ans.level)
    # 实例化砖块,创建基本迷宫编组
    bricks = Group()
    gf.create_maze_group(screen, gm_setting, maze, bricks)
    # 创建四个方向键
    dir_button = DirectionButton(screen, gm_setting)
    # 实例化一条蛇
    snake = Snake(gm_setting)
    # 实例化果实障碍
    fruits = Fruits(maze, ans.path)
    # print(fruits.pos)
    # 设置响应长按键的时间间隔
    pygame.key.set_repeat(100, 100)
    # 实例化游戏状态
    state = Gamestate(gm_setting)
    # 实例化分数
    score = ScoreBored(screen, gm_setting, state)
    # 实例化等级面板
    level = LevelBored(screen, gm_setting, ans.level)
    # 实例化长度面板
    lenBoard = LenBored(screen, gm_setting, len(snake.coordinate))
    # 实例化排行榜
    ranklist = RankList(screen, gm_setting)
    # 实例化各种道具
    ans_prop = AnsProp(screen, gm_setting, state)

    # 实例化开始界面
    start_page = StartActivity(screen, gm_setting)
    # 实例化结束页面
    end_page = EndActivity(screen, gm_setting)
    # 实例化说明界面
    description_page = DescriptionActivity(screen, gm_setting)

    # 读取存档
    gf.init(ranklist)
    while True:
        # 主循环
        if state.gm_state == gm_setting.gm_welcome:
            # 实例化欢迎界面并显示欢迎界面1秒
            welcome_page = WelcomeActivity(screen, gm_setting)
            welcome_page.show_page()
            for event in pygame.event.get():
                if event.type in [pygame.KEYDOWN, pygame.MOUSEBUTTONDOWN]:
                    state.gm_state = gm_setting.gm_wait
                if event.type == pygame.QUIT:
                    sys.exit()
        elif state.gm_state == gm_setting.gm_run:
            # 进入游戏获取当前时间
            state.gm_end_time = datetime.datetime.now()
            ans.level = 0
            ans.get_level()
            level.update_level(ans.level)
            # 更新分数
            score.update_score(state)
            # 更新长度
            lenBoard.update_len(len(snake.coordinate))
            # 响应事件
            gf.check_events(screen, gm_setting, snake, maze, state, start_page,
                            end_page, ranklist, fruits, dir_button, ans_prop)
            # 使蛇的尾部每隔10秒就自增一格
            snake.tail_update(score.score, maze.m)
            # 用操作后位置变换的蛇、通路、障碍果实来更新迷宫矩阵
            gf.update_maze(gm_setting, maze, snake, bricks, state, fruits,
                           ans.path)
            # 检查蛇头是否已经成功逃出迷宫,若成功逃脱则更新排行榜
            gf.check_snake_out(screen, gm_setting, maze, snake, state,
                               ranklist, score)

            # 更新屏幕
            gf.update_screen(screen, gm_setting, bricks, dir_button, score,
                             ans_prop, level, lenBoard)
        elif state.gm_state == gm_setting.gm_wait:
            # 生成迷宫
            maze.prim()
            # 生成迷宫的答案
            ans = PassageWay(gm_setting, maze.m)
            ans.get_path()
            ans.get_level()
            fruits = Fruits(maze, ans.path)
            snake.Flag_Score = []
            # 响应事件
            gf.check_events(screen, gm_setting, snake, maze, state, start_page,
                            end_page, ranklist, fruits)
            start_page.show_page()
        elif state.gm_state == gm_setting.gm_end:
            snake.Flag_Score = []

            # 响应事件
            gf.check_events(screen, gm_setting, snake, maze, state, start_page,
                            end_page, ranklist, fruits)
            end_page.show_page()
        elif state.gm_state == gm_setting.gm_rank:
            # 响应事件
            gf.check_events(screen, gm_setting, snake, maze, state, start_page,
                            end_page, ranklist)
            ranklist.show_page()
        elif state.gm_state == gm_setting.gm_descr:
            # 响应事件
            gf.check_events(screen, gm_setting, snake, maze, state, start_page,
                            end_page, ranklist, fruits)
            description_page.show_page()
예제 #16
0
class State:
    LEFT = [-1, 0]
    RIGHT = [1, 0]
    UP = [0, -1]
    DOWN = [0, 1]
    # clock-wise
    DIRS = [UP, RIGHT, DOWN, LEFT]

    len = 20

    scale = 4
    scale_num = int(len / scale)  #5

    tile_n = scale_num * scale_num

    # snake head * tail * food * direction
    # 25*25*16*4+1
    total_state_num = 9 * 9 * 9 * 9 * 4 + 1
    # 3 actions keep, turn right, turn left
    turn = 0

    def __init__(self):
        self.snake = Snake(self.len, self.len)
        self.board = Board(self.len, self.len)

    def get_index(self):

        tile_n = self.tile_n
        scale_num = self.scale_num
        scale = self.scale
        # 0 - 19
        # 0,1,2,3,4
        self.head_x = self.snake.cells[-1][0] // 4
        self.head_y = self.snake.cells[-1][1] // 4
        self.tail_x = self.snake.cells[0][0] // 4
        self.tail_y = self.snake.cells[0][1] // 4
        self.food_x = self.board.food[0] // 4
        self.food_y = self.board.food[1] // 4

        # -4321, 0 , 1234
        self.diff_x = int(self.head_x - self.food_x + 4)
        self.diff_y = int(self.head_y - self.food_y + 4)

        self.ht_x = int(self.head_x - self.tail_x + 4)
        self.ht_y = int(self.head_y - self.tail_y + 4)

        size = scale_num * 2

        self.dir = self.snake.direction

        if self.snake.is_dead():
            index = self.total_state_num - 1
        else:
            index =  int( self.diff_x + 9*self.diff_y +\
                            self.ht_x*9*9+ self.ht_y*9*9*9 +\
                        #self.head_x + size*self.head_y + \
                         #tile_n*self.food_x + tile_n*size*self.food_y + \
                        #tile_n*tile_n*self.tail_x + tile_n*tile_n*size*self.tail_y +\
                         self.DIRS.index(self.dir)*9*9*9*9 )
        return index

    def turn_right(self):
        index = self.DIRS.index(self.dir)
        self.dir = self.DIRS[(index + 1) % 4]
        self.snake.turn(self.dir)

    def turn_left(self):
        index = self.DIRS.index(self.dir)
        self.dir = self.DIRS[(index - 1) % 4]
        self.snake.turn(self.dir)

    def move_get_rewards(self):
        # return 0 if nothing happen
        # return 1 if got food
        self.turn += 1
        self.snake.teleport_wall()
        reward = self.snake.tick(self.board.food, None)

        if reward == 0:
            reward = -1 / (self.len * 2)  # negative if in loop
        elif reward == 1:
            self.board.new_food(self.snake.obstacles, [])

        if self.snake.is_dead():
            reward = -1

        return reward
예제 #17
0
def standard_mode():
    # set up local player data
    addPlayerData(player_name)

    screen_size = [700, 700]
    pygame.init()
    fpsClock = pygame.time.Clock()
    playSurface = pygame.display.set_mode((screen_size[0], screen_size[1]))
    my_board = Board(50, 50)
    my_snake = Snake(50, 50)

    # set up food and snake
    food_loc = [my_board.food]
    worm_loc = []
    draw_surface(playSurface, redColour, [my_board.food], 10,
                 100)  # draw first food
    pygame.display.set_caption('Food Snake')
    total_score = 0
    level = 1
    score = 0
    isEnd = False
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quitHelper()
            elif event.type == pygame.KEYDOWN:
                # determine the event of keyBoard
                if event.key == pygame.K_RIGHT or event.key == ord('d'):
                    my_snake.turn(RIGHT)
                if event.key == pygame.K_LEFT or event.key == ord('a'):
                    my_snake.turn(LEFT)
                if event.key == pygame.K_UP or event.key == ord('w'):
                    my_snake.turn(UP)
                if event.key == pygame.K_DOWN or event.key == ord('s'):
                    my_snake.turn(DOWN)
                if event.key == ord('q'):
                    isEnd = True
                if event.key == pygame.K_ESCAPE:
                    pygame.event.post(pygame.event.Event(pygame.QUIT))
        # increase along the moving direction
        draw_surface(playSurface, blackColour, my_snake.get_cells(), 10, 100)
        status = my_snake.tick(my_board.food, my_board.wormhole)

        #if all snake body disappeared, go to next level!
        if my_snake.get_cells() == []:
            my_snake.cells = [[1, 1], [1, 2],
                              [1, 3]]  # reassign snake's position!
            level += 1
            score = 0
            if level == 2:
                for i in range(20, 30, 1):
                    my_snake.obstacles.append([i, 25])
            elif level == 3:
                for i in range(20, 30, 1):
                    my_snake.obstacles.append([i, 15])
                    my_snake.obstacles.append([i, 35])
            worm_loc = []
            my_board.new_food(my_new_cells, my_snake.obstacles, [])
            food_loc = [my_board.food]

        my_snake.teleport_wall()
        my_new_cells = my_snake.get_cells()
        if my_snake.is_dead([]) or isEnd:
            break
        if status == 1:
            score += my_board.foodWeight
            total_score += 1
            if score > 1:
                my_board.new_wormhole(my_new_cells, my_snake.obstacles, [])
                worm_loc = [my_board.wormhole]
                food_loc = []
            else:
                my_board.new_food(my_new_cells, my_snake.obstacles, [])
                food_loc = [my_board.food]

        playSurface.fill(blackColour)
        pygame.draw.polygon(playSurface, greenColour,
                            [[99, 99], [99, 601], [601, 601], [601, 99]], 1)
        show_message(playSurface, 'Score: ' + str(total_score), whiteColour,
                     40, 10, 10)
        show_message(playSurface, 'Level: ' + str(level), whiteColour, 40, 10,
                     50)
        screen.blit(avatar_image, (20, 615))
        show_message(playSurface, player_name, whiteColour, 40, 100, 630)
        draw_surface(playSurface, redColour, food_loc, 10, 100)
        draw_surface(playSurface, yellowColour, worm_loc, 10, 100)
        draw_surface(playSurface, greenColour, my_snake.obstacles, 10, 100)
        draw_surface(playSurface, whiteColour, my_new_cells, 10, 100)
        pygame.display.flip()
        # speed is changeable
        fpsClock.tick(my_snake.speed)
    game_end(total_score)
예제 #18
0
 def test_get_cells(self):
     my_snake = Snake(20, 60)
     self.assertEquals(my_snake.cells, my_snake.get_cells())
예제 #19
0
def duo_ai_mode():
    global player1_name, player2_name, avatar1_image, avatar2_image
    init_name()
    final_score1 = 0
    player1_name = player_name
    avatar1_image = avatar_image
    addPlayerData(player_name)

    init_name()
    final_score2 = 0
    player2_name = player_name
    avatar2_image = avatar_image
    addPlayerData(player2_name)

    screen_size = [700, 700]
    pygame.init()
    fpsClock = pygame.time.Clock()
    # create pyGame screen
    level = 1
    playSurface = pygame.display.set_mode((screen_size[0], screen_size[1]))
    my_board = Board(50, 50)
    my_snake = Snake(50, 50)
    op_snake = Snake(50, 50)
    op_snake.obstacles = my_snake.obstacles

    # set up food and snake
    food_loc = [my_board.food]
    draw_surface(playSurface, redColour, [my_board.food], 10,
                 100)  # draw first food
    pygame.display.set_caption('Food Snake')
    total_score = 0
    score = 0
    isEnd = False

    # check input and go as the direction
    while True:
        # give AI input, and let AI control snake
        dir = AI1(my_board, my_snake)
        my_snake.turn(dir)

        # op is pure AI
        dir = AI12(my_board, op_snake)
        op_snake.turn(dir)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quitHelper()

            elif event.type == pygame.KEYDOWN:
                # determine the event of keyBoard
                if event.key == pygame.K_RIGHT or event.key == ord('d'):
                    my_snake.turn(RIGHT)
                if event.key == pygame.K_LEFT or event.key == ord('a'):
                    my_snake.turn(LEFT)
                if event.key == pygame.K_UP or event.key == ord('w'):
                    my_snake.turn(UP)
                if event.key == pygame.K_DOWN or event.key == ord('s'):
                    my_snake.turn(DOWN)
                if event.key == ord('q'):
                    isEnd = True
                if event.key == pygame.K_ESCAPE:
                    pygame.event.post(pygame.event.Event(pygame.QUIT))

        # increase along the moving direction
        draw_surface(playSurface, blackColour, my_snake.get_cells(), 10, 100)
        status1 = my_snake.tick(my_board.food, [])
        my_snake.teleport_wall()

        # increase along the moving direction
        draw_surface(playSurface, blackColour, op_snake.get_cells(), 10, 100)
        status2 = op_snake.tick(my_board.food, [])
        op_snake.teleport_wall()

        my_new_cells = my_snake.get_cells()
        op_new_cells = op_snake.get_cells()

        if my_snake.is_dead(op_new_cells) or op_snake.is_dead(
                my_new_cells) or isEnd:
            break

        # When my snake eats the food
        if status1 == 1 or status2 == 1:
            score += my_board.foodWeight
            if status1 == 1:
                final_score1 += 1
            else:
                final_score2 += 1
            my_board.new_food(my_new_cells, my_snake.obstacles, op_new_cells)
            food_loc = [my_board.food]
            if score - level > level / 2:
                level += 1
            if level % 2 == 0:
                my_snake.add_obstcles(level)
            if level % 3 == 0:
                my_snake.speed += 1

        playSurface.fill(blackColour)
        pygame.draw.polygon(playSurface, greenColour,
                            [[99, 99], [99, 601], [601, 601], [601, 99]], 1)
        show_message(playSurface, 'Score: ' + str(total_score), whiteColour,
                     40, 10, 10)
        show_message(playSurface, 'Level: ' + str(level), whiteColour, 40, 10,
                     50)

        screen.blit(avatar1_image, (20, 615))
        show_message(playSurface, player1_name, whiteColour, 40, 100, 630)
        screen.blit(avatar2_image, (20, 650))
        show_message(playSurface, player2_name, whiteColour, 40, 100, 665)

        draw_surface(playSurface, redColour, food_loc, 10, 100)
        draw_surface(playSurface, greenColour, my_snake.obstacles, 10, 100)

        draw_surface(playSurface, whiteColour, my_new_cells, 10, 100)
        draw_surface(playSurface, greyColour, op_new_cells, 10, 100)
        pygame.display.flip()
        # speed is changeable
        fpsClock.tick(my_snake.speed)
    game_end(final_score1, final_score2)
예제 #20
0
class State:

    turn = 0

    LEFT = [-1, 0]
    RIGHT = [1, 0]
    UP = [0, -1]
    DOWN = [0, 1]
    # clock-wise
    DIRS = [UP,RIGHT,DOWN,LEFT]

    len = 20
    tile_n = 400

    # snake head * tail * food * direction
    # 400*4*4+1
    total_state_num = tile_n*4 * 4 + 1
    # 3 actions keep, turn right, turn left

    def __init__(self):
        self.snake = Snake(self.len, self.len)
        self.board = Board(self.len, self.len)

    def get_index(self):
        size = self.len
        tile_n = self.tile_n

        self.head_x = self.snake.cells[-1][0]
        self.head_y = self.snake.cells[-1][1]
        self.tail_x = self.snake.cells[0][0]
        self.tail_y = self.snake.cells[0][1]
        self.food_x = self.board.food[0]
        self.food_y = self.board.food[1]

        self.diff_x = self.head_x-self.food_x+size
        self.diff_y = self.head_y-self.food_y+size

        self.ht_x = self.head_x-self.tail_x
        self.ht_y = self.head_y-self.tail_y

        self.dir = self.snake.direction

        if self.snake.is_dead():
            index = self.total_state_num - 1
        else:
            index =  int( self.diff_x + size*2*self.diff_y +\
                        #self.head_x + size*self.head_y + \
                         #tile_n*self.food_x + tile_n*size*self.food_y + \
                        #tile_n*tile_n*self.tail_x + tile_n*tile_n*size*self.tail_y +\
                # self.ht_x*tile_n*4*4 + tile_n*4*4*size * 2 * self.ht_y
                         self.DIRS.index(self.dir)*tile_n*4  )
        return index

    def turn_right(self):
        index = self.DIRS.index(self.dir)
        self.dir = self.DIRS[(index+1)%4]
        self.snake.turn(self.dir)

    def turn_left(self):
        index = self.DIRS.index(self.dir)
        self.dir = self.DIRS[(index - 1) % 4]
        self.snake.turn(self.dir)

    def move_get_rewards(self):
        # return 0 if nothing happen
        # return 1 if got food
        self.snake.teleport_wall()
        reward = self.snake.tick(self.board.food,None)


        if reward == 0:
            reward = - 1 / self.len*2 # negative if in loop
        elif reward == 1:
            self.board.new_food(self.snake.obstacles,[])

        if self.snake.is_dead():
            reward = -1



        return reward