这些游戏你玩过几个?
- 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()
游戏演示:
结语
以上就是今天的小游戏分享了,后续出下篇。
关注我咱们下期再见!!