唤醒童年记忆的经典Python游戏

这些游戏你玩过几个?

  • 1.贪吃蛇
  • 2.吃豆人
  • 3.加农炮
  • 4.四子棋
  • 5. Fly Bird
  • <font color = #f3704ab>6.记忆:数字对拼图游戏(欢迎挑战!用时:2min)
  • 7.乒乓球
  • 8.上课划水必备-井字游戏(我敢说100%的人都玩过)
  • 9.将数字滑动到位的拼图游戏
  • 10.迷宫(我己经晕了,你们来)
  • 获取更多
  • 1.贪吃蛇

    👉游戏规则:使用方向键控制蛇去吃球。每吃一次球,蛇身就长出一格。吃到自己或者出界游戏结束。

    from random import randrange
    from turtle import *
    from freegames import square, vector
    
    food = vector(0, 0)
    snake = [vector(10, 0)]
    aim = vector(0, -10)
    
    
    def change(x, y):
        """Change snake direction."""
        aim.x = x
        aim.y = y
    
    
    def inside(head):
        """Return True if head inside boundaries."""
        return -200 < head.x < 190 and -200 < head.y < 190
    
    
    def move():
        """Move snake forward one segment."""
        head = snake[-1].copy()
        head.move(aim)
    
        if not inside(head) or head in snake:
            square(head.x, head.y, 9, 'red')
            update()
            return
    
        snake.append(head)
    
        if head == food:
            print('Snake:', len(snake))
            food.x = randrange(-15, 15) * 10
            food.y = randrange(-15, 15) * 10
        else:
            snake.pop(0)
    
        clear()
    
        for body in snake:
            square(body.x, body.y, 9, 'black')
    
        square(food.x, food.y, 9, 'green')
        update()
        ontimer(move, 100)
    
    
    setup(420, 420, 370, 0)
    hideturtle()
    tracer(False)
    listen()
    onkey(lambda: change(10, 0), 'Right')
    onkey(lambda: change(-10, 0), 'Left')
    onkey(lambda: change(0, 10), 'Up')
    onkey(lambda: change(0, -10), 'Down')
    move()
    done()
    

    游戏演示:

    2.吃豆人

    👉游戏规则:用箭头导航控制黄色吃豆人吃掉所有白色食物,若被红色的鬼魂抓住,游戏结束。

    from random import choice
    from turtle import *
    
    from freegames import floor, vector
    
    state = {'score': 0}
    path = Turtle(visible=False)
    writer = Turtle(visible=False)
    aim = vector(5, 0)
    pacman = vector(-40, -80)
    ghosts = [
        [vector(-180, 160), vector(5, 0)],
        [vector(-180, -160), vector(0, 5)],
        [vector(100, 160), vector(0, -5)],
        [vector(100, -160), vector(-5, 0)],
    ]
    # fmt: off
    tiles = [
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
        0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
        0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
        0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
        0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0,
        0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
        0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
        0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
        0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
        0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
        0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
        0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
        0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0,
        0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
        0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0,
        0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
        0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    ]
    # fmt: on
    
    
    def square(x, y):
        """Draw square using path at (x, y)."""
        path.up()
        path.goto(x, y)
        path.down()
        path.begin_fill()
    
        for count in range(4):
            path.forward(20)
            path.left(90)
    
        path.end_fill()
    
    
    def offset(point):
        """Return offset of point in tiles."""
        x = (floor(point.x, 20) + 200) / 20
        y = (180 - floor(point.y, 20)) / 20
        index = int(x + y * 20)
        return index
    
    
    def valid(point):
        """Return True if point is valid in tiles."""
        index = offset(point)
    
        if tiles[index] == 0:
            return False
    
        index = offset(point + 19)
    
        if tiles[index] == 0:
            return False
    
        return point.x % 20 == 0 or point.y % 20 == 0
    
    
    def world():
        """Draw world using path."""
        bgcolor('black')
        path.color('blue')
    
        for index in range(len(tiles)):
            tile = tiles[index]
    
            if tile > 0:
                x = (index % 20) * 20 - 200
                y = 180 - (index // 20) * 20
                square(x, y)
    
                if tile == 1:
                    path.up()
                    path.goto(x + 10, y + 10)
                    path.dot(2, 'white')
    
    
    def move():
        """Move pacman and all ghosts."""
        writer.undo()
        writer.write(state['score'])
    
        clear()
    
        if valid(pacman + aim):
            pacman.move(aim)
    
        index = offset(pacman)
    
        if tiles[index] == 1:
            tiles[index] = 2
            state['score'] += 1
            x = (index % 20) * 20 - 200
            y = 180 - (index // 20) * 20
            square(x, y)
    
        up()
        goto(pacman.x + 10, pacman.y + 10)
        dot(20, 'yellow')
    
        for point, course in ghosts:
            if valid(point + course):
                point.move(course)
            else:
                options = [
                    vector(5, 0),
                    vector(-5, 0),
                    vector(0, 5),
                    vector(0, -5),
                ]
                plan = choice(options)
                course.x = plan.x
                course.y = plan.y
    
            up()
            goto(point.x + 10, point.y + 10)
            dot(20, 'red')
    
        update()
    
        for point, course in ghosts:
            if abs(pacman - point) < 20:
                return
    
        ontimer(move, 100)
    
    
    def change(x, y):
        """Change pacman aim if valid."""
        if valid(pacman + vector(x, y)):
            aim.x = x
            aim.y = y
    
    
    setup(420, 420, 370, 0)
    hideturtle()
    tracer(False)
    writer.goto(160, 160)
    writer.color('white')
    writer.write(state['score'])
    listen()
    onkey(lambda: change(5, 0), 'Right')
    onkey(lambda: change(-5, 0), 'Left')
    onkey(lambda: change(0, 5), 'Up')
    onkey(lambda: change(0, -5), 'Down')
    world()
    move()
    done()
    

    游戏演示:

    3.加农炮

    👉游戏规则:点击屏幕发射炮弹。炮弹在它的路径上弹出蓝色气球。在气球穿过屏幕之前把它们全部弹出。

    from random import randrange
    from turtle import *
    
    from freegames import vector
    
    ball = vector(-200, -200)
    speed = vector(0, 0)
    targets = []
    
    
    def tap(x, y):
        """Respond to screen tap."""
        if not inside(ball):
            ball.x = -199
            ball.y = -199
            speed.x = (x + 200) / 25
            speed.y = (y + 200) / 25
    
    
    def inside(xy):
        """Return True if xy within screen."""
        return -200 < xy.x < 200 and -200 < xy.y < 200
    
    
    def draw():
        """Draw ball and targets."""
        clear()
    
        for target in targets:
            goto(target.x, target.y)
            dot(20, 'blue')
    
        if inside(ball):
            goto(ball.x, ball.y)
            dot(6, 'red')
    
        update()
    
    
    def move():
        """Move ball and targets."""
        if randrange(40) == 0:
            y = randrange(-150, 150)
            target = vector(200, y)
            targets.append(target)
    
        for target in targets:
            target.x -= 0.5
    
        if inside(ball):
            speed.y -= 0.35
            ball.move(speed)
    
        dupe = targets.copy()
        targets.clear()
    
        for target in dupe:
            if abs(target - ball) > 13:
                targets.append(target)
    
        draw()
    
        for target in targets:
            if not inside(target):
                return
    
        ontimer(move, 50)
    
    
    setup(420, 420, 370, 0)
    hideturtle()
    up()
    tracer(False)
    onscreenclick(tap)
    move()
    done()
    

    游戏演示:

    4.四子棋

    👉 游戏规则:单击行可放置光盘。第一个垂直、水平或对角连接四张光盘的玩家获胜。

    from turtle import *
    
    from freegames import line
    
    turns = {'red': 'yellow', 'yellow': 'red'}
    state = {'player': 'yellow', 'rows': [0] * 8}
    
    
    def grid():
        """Draw Connect Four grid."""
        bgcolor('light blue')
    
        for x in range(-150, 200, 50):
            line(x, -200, x, 200)
    
        for x in range(-175, 200, 50):
            for y in range(-175, 200, 50):
                up()
                goto(x, y)
                dot(40, 'white')
    
        update()
    
    
    def tap(x, y):
        """Draw red or yellow circle in tapped row."""
        player = state['player']
        rows = state['rows']
    
        row = int((x + 200) // 50)
        count = rows[row]
    
        x = ((x + 200) // 50) * 50 - 200 + 25
        y = count * 50 - 200 + 25
    
        up()
        goto(x, y)
        dot(40, player)
        update()
    
        rows[row] = count + 1
        state['player'] = turns[player]
    
    
    setup(420, 420, 370, 0)
    hideturtle()
    tracer(False)
    grid()
    onscreenclick(tap)
    done()
    

    游戏演示:

    5. Fly Bird

    👉 游戏规则:点击屏幕来拍打鸟的翅膀。飞过屏幕被黑色乌鸦碰到,游戏结束。

    from random import *
    from turtle import *
    
    from freegames import vector
    
    bird = vector(0, 0)
    balls = []
    
    
    def tap(x, y):
        """Move bird up in response to screen tap."""
        up = vector(0, 30)
        bird.move(up)
    
    
    def inside(point):
        """Return True if point on screen."""
        return -200 < point.x < 200 and -200 < point.y < 200
    
    
    def draw(alive):
        """Draw screen objects."""
        clear()
    
        goto(bird.x, bird.y)
    
        if alive:
            dot(10, 'green')
        else:
            dot(10, 'red')
    
        for ball in balls:
            goto(ball.x, ball.y)
            dot(20, 'black')
    
        update()
    
    
    def move():
        """Update object positions."""
        bird.y -= 5
    
        for ball in balls:
            ball.x -= 3
    
        if randrange(10) == 0:
            y = randrange(-199, 199)
            ball = vector(199, y)
            balls.append(ball)
    
        while len(balls) > 0 and not inside(balls[0]):
            balls.pop(0)
    
        if not inside(bird):
            draw(False)
            return
    
        for ball in balls:
            if abs(ball - bird) < 15:
                draw(False)
                return
    
        draw(True)
        ontimer(move, 50)
    
    
    setup(420, 420, 370, 0)
    hideturtle()
    up()
    tracer(False)
    onscreenclick(tap)
    move()
    done()
    

    游戏演示:

    6.记忆:数字对拼图游戏(欢迎挑战!用时:2min)

    👉游戏规则:单击方格用于显示数字。匹配两个数字,方格将显示从而显示图像。

    from random import *
    from turtle import *
    
    from freegames import path
    
    car = path('car.gif')
    tiles = list(range(32)) * 2
    state = {'mark': None}
    hide = [True] * 64
    
    
    def square(x, y):
        """Draw white square with black outline at (x, y)."""
        up()
        goto(x, y)
        down()
        color('black', 'white')
        begin_fill()
        for count in range(4):
            forward(50)
            left(90)
        end_fill()
    
    
    def index(x, y):
        """Convert (x, y) coordinates to tiles index."""
        return int((x + 200) // 50 + ((y + 200) // 50) * 8)
    
    
    def xy(count):
        """Convert tiles count to (x, y) coordinates."""
        return (count % 8) * 50 - 200, (count // 8) * 50 - 200
    
    
    def tap(x, y):
        """Update mark and hidden tiles based on tap."""
        spot = index(x, y)
        mark = state['mark']
    
        if mark is None or mark == spot or tiles[mark] != tiles[spot]:
            state['mark'] = spot
        else:
            hide[spot] = False
            hide[mark] = False
            state['mark'] = None
    
    
    def draw():
        """Draw image and tiles."""
        clear()
        goto(0, 0)
        shape(car)
        stamp()
    
        for count in range(64):
            if hide[count]:
                x, y = xy(count)
                square(x, y)
    
        mark = state['mark']
    
        if mark is not None and hide[mark]:
            x, y = xy(mark)
            up()
            goto(x + 2, y)
            color('black')
            write(tiles[mark], font=('Arial', 30, 'normal'))
    
        update()
        ontimer(draw, 100)
    
    
    shuffle(tiles)
    setup(420, 420, 370, 0)
    addshape(car)
    hideturtle()
    tracer(False)
    onscreenclick(tap)
    draw()
    done()
    

    游戏演示:

    7.乒乓球

    👉游戏规则:用键盘上下移动划桨,谁先丢失球,谁输!(左ws上下,右ik上下)

    from random import choice, random
    from turtle import *
    
    from freegames import vector
    
    
    def value():
        """Randomly generate value between (-5, -3) or (3, 5)."""
        return (3 + random() * 2) * choice([1, -1])
    
    
    ball = vector(0, 0)
    aim = vector(value(), value())
    state = {1: 0, 2: 0}
    
    
    def move(player, change):
        """Move player position by change."""
        state[player] += change
    
    
    def rectangle(x, y, width, height):
        """Draw rectangle at (x, y) with given width and height."""
        up()
        goto(x, y)
        down()
        begin_fill()
        for count in range(2):
            forward(width)
            left(90)
            forward(height)
            left(90)
        end_fill()
    
    
    def draw():
        """Draw game and move pong ball."""
        clear()
        rectangle(-200, state[1], 10, 50)
        rectangle(190, state[2], 10, 50)
    
        ball.move(aim)
        x = ball.x
        y = ball.y
    
        up()
        goto(x, y)
        dot(10)
        update()
    
        if y < -200 or y > 200:
            aim.y = -aim.y
    
        if x < -185:
            low = state[1]
            high = state[1] + 50
    
            if low <= y <= high:
                aim.x = -aim.x
            else:
                return
    
        if x > 185:
            low = state[2]
            high = state[2] + 50
    
            if low <= y <= high:
                aim.x = -aim.x
            else:
                return
    
        ontimer(draw, 50)
    
    
    setup(420, 420, 370, 0)
    hideturtle()
    tracer(False)
    listen()
    onkey(lambda: move(1, 20), 'w')
    onkey(lambda: move(1, -20), 's')
    onkey(lambda: move(2, 20), 'i')
    onkey(lambda: move(2, -20), 'k')
    draw()
    done()
    

    游戏演示:

    8.上课划水必备-井字游戏(我敢说100%的人都玩过)

    👉游戏规则:点击屏幕放置一个X或O。连续连接三个,就赢了!

    from turtle import *
    
    from freegames import line
    
    
    def grid():
        """Draw tic-tac-toe grid."""
        line(-67, 200, -67, -200)
        line(67, 200, 67, -200)
        line(-200, -67, 200, -67)
        line(-200, 67, 200, 67)
    
    
    def drawx(x, y):
        """Draw X player."""
        line(x, y, x + 133, y + 133)
        line(x, y + 133, x + 133, y)
    
    
    def drawo(x, y):
        """Draw O player."""
        up()
        goto(x + 67, y + 5)
        down()
        circle(62)
    
    
    def floor(value):
        """Round value down to grid with square size 133."""
        return ((value + 200) // 133) * 133 - 200
    
    
    state = {'player': 0}
    players = [drawx, drawo]
    
    
    def tap(x, y):
        """Draw X or O in tapped square."""
        x = floor(x)
        y = floor(y)
        player = state['player']
        draw = players[player]
        draw(x, y)
        update()
        state['player'] = not player
    
    
    setup(420, 420, 370, 0)
    hideturtle()
    tracer(False)
    grid()
    update()
    onscreenclick(tap)
    done()
    

    游戏演示:

    9.将数字滑动到位的拼图游戏

    👉 游戏规则:单击靠近空正方形的方格以交换位置。将所有数字从左到右按顺序排列。

    from random import *
    from turtle import *
    
    from freegames import floor, vector
    
    tiles = {}
    neighbors = [
        vector(100, 0),
        vector(-100, 0),
        vector(0, 100),
        vector(0, -100),
    ]
    
    
    def load():
        """Load tiles and scramble."""
        count = 1
    
        for y in range(-200, 200, 100):
            for x in range(-200, 200, 100):
                mark = vector(x, y)
                tiles[mark] = count
                count += 1
    
        tiles[mark] = None
    
        for count in range(1000):
            neighbor = choice(neighbors)
            spot = mark + neighbor
    
            if spot in tiles:
                number = tiles[spot]
                tiles[spot] = None
                tiles[mark] = number
                mark = spot
    
    
    def square(mark, number):
        """Draw white square with black outline and number."""
        up()
        goto(mark.x, mark.y)
        down()
    
        color('black', 'white')
        begin_fill()
        for count in range(4):
            forward(99)
            left(90)
        end_fill()
    
        if number is None:
            return
        elif number < 10:
            forward(20)
    
        write(number, font=('Arial', 60, 'normal'))
    
    
    def tap(x, y):
        """Swap tile and empty square."""
        x = floor(x, 100)
        y = floor(y, 100)
        mark = vector(x, y)
    
        for neighbor in neighbors:
            spot = mark + neighbor
    
            if spot in tiles and tiles[spot] is None:
                number = tiles[mark]
                tiles[spot] = number
                square(spot, number)
                tiles[mark] = None
                square(mark, None)
    
    
    def draw():
        """Draw all tiles."""
        for mark in tiles:
            square(mark, tiles[mark])
        update()
    
    
    setup(420, 420, 370, 0)
    hideturtle()
    tracer(False)
    load()
    draw()
    onscreenclick(tap)
    done()
    

    游戏演示:

    10.迷宫(我己经晕了,你们来)

    👉游戏规则:从一边移到另一边。轻触屏幕可跟踪从一侧到另一侧的路径。

    from random import random
    from turtle import *
    
    from freegames import line
    
    
    def draw():
        """Draw maze."""
        color('black')
        width(5)
    
        for x in range(-200, 200, 40):
            for y in range(-200, 200, 40):
                if random() > 0.5:
                    line(x, y, x + 40, y + 40)
                else:
                    line(x, y + 40, x + 40, y)
    
        update()
    
    
    def tap(x, y):
        """Draw line and dot for screen tap."""
        if abs(x) > 198 or abs(y) > 198:
            up()
        else:
            down()
    
        width(2)
        color('red')
        goto(x, y)
        dot(4)
    
    
    setup(420, 420, 370, 0)
    hideturtle()
    tracer(False)
    draw()
    onscreenclick(tap)
    done()
    

    游戏演示:

    获取更多

    更多好玩小游戏,可以直接点击获取哦!!

    物联沃分享整理
    物联沃-IOTWORD物联网 » 唤醒童年记忆的经典Python游戏

    发表评论