无聊小游戏(Python)

这是我从答案中翻出来的

1.贪吃蛇:

# 为了解决中文编码,字符串前面请添加反斜杠‘\’,
# 为了输出/游戏提示显示优雅,自定义coduck转换API  
# 使用方法:coduck.font('\可达鸭')
# el: print('\可达鸭编程')  print(coduck.font('\可达鸭编程'))

import pygame as pg
import coduck 
from random import randint

print('\可达鸭编程')  
print(coduck.font('\可达鸭编程'))


pg.init()
side = 30
w = 17
h = 15
disp = pg.display.set_mode((w * side, h * side))

game_running = 0

dirs = [pg.K_RIGHT, pg.K_DOWN, pg.K_LEFT, pg.K_UP]
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
snake = [(7, 3), (7, 4)]
direction = 0


def place_apple():
    a = (randint(0, w - 1), randint(0, h - 1))
    while a in snake:
        a = (randint(0, w - 1), randint(0, h - 1))
    return a


apple = place_apple()


def check_collisions():
    head = snake[-1]
    for i in range(len(snake) - 1):
        if head == snake[i]:
            return 2
    if head[0] >= w or head[0] < 0:
        return 3
    if head[1] >= h or head[1] < 0:
        return 3
    if head == apple:
        return 1
    return 0


clock = pg.time.Clock()
f = pg.font.SysFont('console', 24, True)

while True:
    clock.tick(8)
    for e in pg.event.get():
        if e.type == pg.QUIT:
            pg.quit()
            break
        if e.type == pg.KEYDOWN:
            if game_running == 0:
                game_runnig = 1
            if e.key == pg.K_SPACE:
                game_running = 0
                snake = [(7, 3), (7, 4)]
                direction = 0
                apple = place_apple()
            for i in range(4):
                if e.key == dirs[i] and direction != (i + 2) % 4:
                    direction = i
    if game_running == 2:
        disp.fill(pg.Color("black"))
        disp.blit(f.render(coduck.font("\游戏结束!"), False, pg.Color("blue")), (3 * side, 3 * side))
        pg.display.update()
        game_running = 3
    if game_running == 3:
        continue
    snake.append((snake[-1][0] + dx[direction], snake[-1][1] + dy[direction]))
    coll = check_collisions()
    if coll >= 2:
        game_running = 2
        pass
    elif coll == 1:
        apple = place_apple()
        pass
    elif coll == 0:
        snake.pop(0)
    disp.fill(pg.Color("black"))
    for i in range(len(snake)):
        pg.draw.rect(disp, pg.Color("green"), pg.Rect(snake[i][0] * side, snake[i][1] * side, side, side))
    pg.draw.rect(disp, pg.Color("red"), pg.Rect(apple[0] * side, apple[1] * side, side, side))
    pg.display.update()

剩下的自己看

2.

import math
import pygame as pg


pg.init()

pg.display.set_caption("Spirograph")
(sirina, visina) = (400, 400)
prozor = pg.display.set_mode((sirina, visina))

(cx, cy) = (sirina // 2, visina // 2)
R = min(sirina//2, visina//2)
k = 0.67
l = 0.67
r = round(k * R)
alpha = 0

kriva = pg.Surface((sirina, visina))
kriva.fill(pg.Color("white"))

pg.time.set_timer(pg.USEREVENT, 1000 // 50)

kraj = False
treba_crtati = True
while not kraj:
    if treba_crtati:
        prozor.fill(pg.Color("white"))
        prozor.blit(kriva, (0, 0))
        pg.draw.circle(prozor, pg.Color("black"), (cx, cy), R, 3)
        pg.draw.circle(prozor, pg.Color("red"), (round(cx + R * math.cos(alpha)), round(cy - R * math.sin(alpha))), 5)
        (mx, my) = (round(cx + (R-r)*math.cos(alpha)), round(cy - (R-r)*math.sin(alpha)))
        pg.draw.circle(prozor, pg.Color("blue"), (mx, my), r, 3)
        beta = - (R - r)/r*alpha
        (Ax, Ay) = (round(mx + l*r*math.cos(beta)), round(my - l*r*math.sin(beta)))
        pg.draw.circle(prozor, pg.Color("red"), (Ax, Ay), 5)

        hue = round(((alpha + math.pi) % (2*math.pi)) / (2*math.pi) * 360)
        boja = pg.Color("black")
        boja.hsva = (hue, 100, 100, 1)
        pg.draw.circle(kriva, boja, (Ax, Ay), 2)
        
        pg.display.update()
        treba_crtati = False
    dogadjaj = pg.event.wait()
    if dogadjaj.type == pg.QUIT:
        kraj = True
    elif dogadjaj.type == pg.USEREVENT:
        alpha += math.pi / 90
        treba_crtati = True
    elif dogadjaj.type == pg.MOUSEMOTION:
        (x, y) = dogadjaj.pos
        phi0 = (alpha + math.pi) % (2*math.pi) - math.pi
        phi = math.atan2(cy - y, x - cx)
        d_phi = phi - phi0
        if d_phi > math.pi:
            d_phi -= 2*math.pi
        if d_phi < -math.pi:
            d_phi += 2*math.pi
        alpha += d_phi
        treba_crtati = True
        
pg.quit()

3.

# -*- acsection: general-init -*-
import pygame as pg, random

# 测试地址
# https://coduckfile.oss-cn-hangzhou.aliyuncs.com/kdyc588f4dc3588492d8f7aaa19de153226.png
# https://img0.baidu.com/it/u=1743372805,634718051&fm=253&fmt=auto&app=138&f=JPEG?w=667&h=500

# uključujemo rad biblioteke PyGame
pg.init()

# podešavamo događaje tastaturom - prvi događaj se generiše nakon
# 50ms, a svaki naredni nakon 25ms
pg.key.set_repeat(50, 25)

# postavljamo naslov prozora
pg.display.set_caption("setanje broda")

# otvaramo prozor dimenzije 400x400 piksela
(sirina, visina) = (400, 400)
prozor = pg.display.set_mode((sirina, visina))

# -*- acsection: main -*-
# učitavamo sliku svemirskog broda
brod = pg.image.load('./test/spaceship.png')
# očitavamo dimenzije slike
brod_sirina = brod.get_width()
brod_visina = brod.get_height()

# koordinate centra prozora
(x, y) = (sirina / 2, visina / 2)
# pomeraji po x i y koordinati
(dx, dy) = (10, 10)

pomeraj = {pg.K_LEFT: (-dx, 0),
           pg.K_RIGHT: (dx, 0),
           pg.K_DOWN: (0, dy),
           pg.K_UP: (0, -dy)}

# u prvom koraku je potrebno nacrtati lopticu
treba_crtati = True
kraj = False
while not kraj:
    # ako je potrebno аžurirati sliku
    if treba_crtati:
       # bojimo prozor u belo
       prozor.fill(pg.Color("black"))
       # crtamo svemirski brod
       prozor.blit(brod, (x - brod_sirina / 2, y - brod_visina / 2))
       # ažuriramo prikaz sadržaja prozora
       pg.display.update()
       treba_crtati = False

    # obrađujemo prvi događaj koji se desi
    dogadjaj = pg.event.wait()
    # isključivanje prozora
    if dogadjaj.type == pg.QUIT:
        kraj = True
    # pritisak tastera na tastaturi
    if dogadjaj.type == pg.KEYDOWN:
        if dogadjaj.key in pomeraj:
           # pomeramo centar broda za odgovarajući pomeraj
           (DX, DY) = pomeraj[dogadjaj.key]
           x += DX
           y += DY
           # pošto je brod pomeren, ponovo ćemo crtati scenu
           treba_crtati = True

# -*- acsection: after-main -*-
# isključujemo rad biblioteke PyGame
pg.quit()

4.

import math, random
import pygame as pg

pg.init()

pg.display.set_caption("krugovi na dijagonali")
(sirina, visina) = (400, 500)
prozor = pg.display.set_mode((sirina, visina))


def nasumicna_boja():
    return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)


def crtaj():
    r = d / (2 * n)
    kx = sirina / (2 * n)
    ky = visina / (2 * n)
    prozor.fill(pg.Color("white"))
    for i in range(n):
        (cx, cy) = ((2 * i + 1) * kx, visina - (2 * i + 1) * ky)
        pg.draw.circle(prozor, nasumicna_boja(), (round(cx), round(cy)), round(r), 2)
    pg.display.update()


d = math.sqrt(sirina ** 2 + visina ** 2)

n = 5
crtaj()

kraj = False
while not kraj:
    dogadjaj = pg.event.wait()
    if dogadjaj.type == pg.QUIT:
        kraj = True
    elif dogadjaj.type == pg.MOUSEBUTTONDOWN:
        if dogadjaj.button == 1:
            n += 1
            crtaj()
        elif dogadjaj.button == 3 and n > 1:
            n -= 1
            crtaj()
    if dogadjaj.type == pg.KEYDOWN:
        if dogadjaj.key == pg.K_UP:
            n += 1
            crtaj()
        elif dogadjaj.key == pg.K_DOWN and n > 1:
            n -= 1
            crtaj()

pg.quit()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值