> 文档中心 > 10个python经典小游戏(上)-五一嗨起来(附源码分享)

10个python经典小游戏(上)-五一嗨起来(附源码分享)


🐚作者简介:苏凉(专注于网络爬虫,数据分析)
🐳博客主页:苏凉.py的博客
👑名言警句:海阔凭鱼跃,天高任鸟飞。
📰要是觉得博主文章写的不错的话,还望大家三连支持一下呀!!!
👉关注✨点赞👍收藏📂

这些游戏你玩过几个?

    • 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()

游戏演示:

在这里插入图片描述

结语

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