10个python经典小游戏(上)-五一嗨起来(动图演示+源码分享)

这些游戏你玩过几个

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

1.贪吃蛇

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

from random import randrangefrom turtle import *from freegames import square, vectorfood = vector(0, 0)snake = [vector(10, 0)]aim = vector(0, -10)def change(x, y):    """Change snake direction."""    aim.x = x    aim.y = ydef inside(head):    """Return True if head inside boundaries."""    return -200 < head.x < 190 and -200 < head.y < 190def 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 choicefrom turtle import *from freegames import floor, vectorstate = {'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: offtiles = [    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: ondef 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 indexdef 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 == 0def 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 = ysetup(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 randrangefrom turtle import *from freegames import vectorball = 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) / 25def inside(xy):    """Return True if xy within screen."""    return -200 < xy.x < 200 and -200 < xy.y < 200def 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 lineturns = {'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 vectorbird = 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 < 200def 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 pathcar = path('car.gif')tiles = list(range(32)) * 2state = {'mark': None}hide = [True] * 64def 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 - 200def 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'] = Nonedef 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, randomfrom turtle import *from freegames import vectordef 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] += changedef 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 linedef 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 - 200state = {'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 playersetup(420, 420, 370, 0)hideturtle()tracer(False)grid()update()onscreenclick(tap)done()

游戏演示

在这里插入图片描述

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

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

from random import *from turtle import *from freegames import floor, vectortiles = {}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 = spotdef 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 randomfrom turtle import *from freegames import linedef 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()

游戏演示

在这里插入图片描述

结语

以上就是今天的小游戏分享了,后续出下篇。
关注我咱们下期再见

 
友情链接
鄂ICP备19019357号-22