猫史档案馆


【Python作品分享】羊了个羊(博文版)

用户:狂妄的彗星猫Ysck狂妄的彗星猫Ysck查看:0 回复:1 评论:0 创建时间:2023-02-10T11:03:45


【作品展示】

center_image

 

【作品介绍】

羊了个羊

 

【作品源代码】

import pgzrun
import pygame
import random
import math
import os

# 定义游戏相关属性
TITLE = '羊了个羊' 
WIDTH = 600
HEIGHT = 720

# 自定义游戏常量
T_WIDTH = 60
T_HEIGHT = 66

# 下方牌堆的位置
DOCK = Rect((90, 5喵), (T_WIDTH*7, T_HEIGHT))

# 上方的所有牌
tiles = []
# 牌堆里的牌
docks = []

# 初始化牌组,12*12张牌随机打乱
ts = list(range(1, 13))*12
random.shuffle(ts)
n = 0
for k in range(7):    # 7层
    for i in range(7-k):    #每层减1行
        for j in range(7-k):
            t = ts[n]        #获取排种类
            n += 1
            tile = Actor(f'tile{t}')       #使用tileX图片创建Actor对象
            tile.pos = 120 + (k * 0.5 + j) * tile.width, 100 + (k * 0.5 + i) * tile.height * 0.9    #设定位置
            tile.tag = t            #记录种类
            tile.layer = k          #记录层级
            tile.status = 1 if k == 6 else 0        #除了最顶层,状态都设置为0(不可点)这里是个简化实现
            tiles.append(tile)
for i in range(4):        #剩余的4张牌放下面(为了凑整能通关)
    t = ts[n]
    n += 1
    tile = Actor(f'tile{t}')
    tile.pos = 210 + i * tile.width, 516
    tile.tag = t
    tile.layer = 0
    tile.status = 1
    tiles.append(tile)


# 游戏帧绘制函数
def draw():
    screen.clear()
    screen.blit('back', (0, 0))      #背景图
    for tile in tiles:
        #绘制上方牌组
        tile.draw()
        if tile.status == 0:
            screen.blit('mask', tile.topleft)     #不可点的添加遮罩
    for i, tile in enumerate(docks):
        #绘制排队,先调整一下位置(因为可能有牌被消掉)
        tile.left = (DOCK.x + i * T_WIDTH)
        tile.top = DOCK.y
        tile.draw()

    # 超过7张,失败
    if len(docks) >= 7:
        screen.blit('end', (0, 0))
    # 没有剩牌,胜利
    if len(tiles) == 0:
        screen.blit('win', (0, 0))


# 鼠标点击响应
def on_mouse_down(pos):
    global docks
    if len(docks) >= 7 or len(tiles) == 0:      #游戏结束不响应
        return
    for tile in reversed(tiles):    #逆序循环是为了先判断上方的牌,如果点击了就直接跳出,避免重复判定
        if tile.status == 1 and tile.collidepoint(pos):
            # 状态1可点,并且鼠标在范围内
            tile.status = 2
            tiles.remove(tile)
            diff = [t for t in docks if t.tag != tile.tag]    #获取牌堆内不相同的牌
            if len(docks) - len(diff) < 2:    #如果相同的牌数量<2,就加进牌堆
                docks.append(tile)
            else:             #否则用不相同的牌替换牌堆(即消除相同的牌)
                docks = diff
            for down in tiles:      #遍历所有的牌
                if down.layer == tile.layer - 1 and down.colliderect(tile):   #如果在此牌的下一层,并且有重叠
                    for up in tiles:      #那就再反过来判断这种被覆盖的牌,是否还有其他牌覆盖它
                        if up.layer == down.layer + 1 and up.colliderect(down):     #如果有就跳出
                            break
                    else:      #如果全都没有,说明它变成了可点状态
                        down.status = 1
            return

music.play('bgm')

pgzrun.go()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
方圆三角方圆三角

为什么要导入pygame、os、math库呢?(pygame库在导入pgzrun库时已导入一次)

点赞0


评论