pygame memory puzzle

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

import pygame,random,sys
from pygame.locals import *

FPS = 30
boxwidth = 3
boxheight = 2
assert boxwidth*boxheight%2 == 0,'board number needs to be even'
winx = 640
winy = 480
between = 10
boxsize = 40
xmargin = int((winx-(boxsize+between)*boxwidth)/2)
ymargin = int((winy-(boxsize+between)*boxheight)/2)
speed = 8

#color inuse
navyblue = (60,60,100)#dispfill
white = (255,255,255)#boardcover
blue = (0,0,255) #highlighrect
#icons color
red = (255,0,0)
yellow = (255,255,0)
purple = (255,0,255)
green = (0,255,0)
gray = (0,255,255)


#icons shape
rectan = 'rectan'
lines = 'lines'
circ = 'circ'
poly = 'poly'

allcolor = (red,yellow,purple,green)
allshape = (rectan,lines,circ,poly)
assert len(allcolor)*len(allshape*2)>= boxwidth*boxheight,'board is too big for the number of color and shape'

def main():
    
    global fpsclock,disp
    pygame.init()
    disp = pygame.display.set_mode((winx,winy))
    pygame.display.set_caption('memory puzzle')
    fpsclock = pygame.time.Clock()
    disp.fill(navyblue)
    reveal = getrevealed(False)
    mainboard = randomboard()
    drawboard(mainboard,reveal)
    startanimation(mainboard)
    first = None
    mousex = 0
    mousey = 0
    while True:
        mouseclicked = False
        
        disp.fill(navyblue)
        drawboard(mainboard,reveal)
        
        
        for event in pygame.event.get():
            if event.type == QUIT or (  event.type == KEYUP and event.key == K_ESCAPE):
                pygame.quit()
                sys.exit()
            elif event.type == MOUSEMOTION:
                mousex,mousey = event.pos
            elif event.type == MOUSEBUTTONUP:
                mousex,mousey = event.pos
                mouseclicked = True

        boxx,boxy = getpixel(mousex,mousey)
        if boxx!=None and boxy!= None:
            if not reveal[boxx][boxy]:
                highlighrect(boxx,boxy)
            if not reveal[boxx][boxy] and mouseclicked:
                revealboardanimation(mainboard,[(boxx,boxy)])
                reveal[boxx][boxy] = True
                if first == None:
                    first = (boxx,boxy)
                else:
                    icon1shape,icon1color = getshapeandcolor(mainboard,first[0],first[1])
                    icon2shape,icon2color = getshapeandcolor(mainboard,boxx,boxy)
                    if icon1shape!= icon2shape or icon1color!= icon2color:
                        pygame.time.wait(1000)
                        coverboardanimation(mainboard,[(first[0],first[1]),(boxx,boxy)])
                        reveal[first[0]][first[1]] = False
                        reveal[boxx][boxy] = False
                        
                    elif haswon(reveal):
                        wonanimation(mainboard)
                        pygame.time.wait(2000)

                        mainboard = randomboard()
                        startanimation(mainboard)
                        reveal = getrevealed(False)
                        drawboard(mainboard,reveal)
                    first = None
                
        pygame.display.update()
        fpsclock.tick(FPS)
    
                
                
            
            

def leftop(boxx,boxy):
    left = xmargin + boxx*(boxsize + between)
    top = ymargin + boxy*(boxsize + between)
    return left,top
    
def highlighrect(boxx,boxy):
    left,top = leftop(boxx,boxy)
    pygame.draw.rect(disp,blue,(left-between/2,top-between/2,boxsize+between,boxsize+between),4)
    
def randomboard():
    box = []
    for shape in allshape:
        for color in allcolor:
            box.append((shape,color))
    random.shuffle(box)
    iconsnum = boxwidth*boxheight/2
    icons = box[:iconsnum]*2
    random.shuffle(icons)

    board = []
    for boxx in range(boxwidth):
        column = []
        for boxy in range(boxheight):
            column.append(icons[0])
            del icons[0]
        board.append(column)
    return board
            
def getrevealed(val):
    revealedbox = []
    for i in range(boxwidth):
        revealedbox.append([val]*boxheight)
    return revealedbox

def getpixel(x,y):
    for boxx in range(boxwidth):
        for boxy in range(boxheight):
            left,top = leftop(boxx,boxy)    
            b = pygame.Rect((left,top,boxsize,boxsize))
            if b.collidepoint(x,y):
                return(boxx,boxy)
    return(None,None)

def split(group,thelist):
    result = []
    for i in range(0,len(thelist),group):
        result.append(thelist[i:group+i])
    random.shuffle(result)
    return result

def getshapeandcolor(board,boxx,boxy):
    return board[boxx][boxy][0],board[boxx][boxy][1]

def drawicon(shape,color,boxx,boxy):
    left,top = leftop(boxx,boxy)
    if shape == rectan:
        pygame.draw.rect(disp,color,(left+5,top+5,boxsize-10,boxsize-10))
    elif shape == lines:
        for i in range(0,boxsize,10):
            pygame.draw.line(disp,color,(left+i,top),(left,top+i))
            pygame.draw.line(disp,color,(left+boxsize-i,top+boxsize),(left+boxsize,top+boxsize-i))
    elif shape == circ:
        pygame.draw.circle(disp,color,(left+boxsize/2,top+boxsize/2),boxsize/2-5)
    elif shape == poly:
        pygame.draw.polygon(disp,color,((left+boxsize/2,top),(left+boxsize,top+boxsize/2),(left+boxsize/2,top+boxsize),(left,top+boxsize/2)))
        
def drawoneboard(board,boxes,coverage):
    for box in boxes:
        shape,color = getshapeandcolor(board,box[0],box[1])
        left,top = leftop(box[0],box[1])
        pygame.draw.rect(disp,navyblue,(left,top,boxsize,boxsize))
        drawicon(shape,color,box[0],box[1])
        if coverage>0:
            pygame.draw.rect(disp,white,(left,top,coverage,boxsize))
    pygame.display.update()
    fpsclock.tick(FPS)

def coverboardanimation(board,boxcover):
    for coverage in range(0,boxsize+speed,speed):
        drawoneboard(board,boxcover,coverage)

def revealboardanimation(board,boxreveal):
    for coverage in range(boxsize,-speed-1,-speed):
        drawoneboard(board,boxreveal,coverage)

def drawboard(board,revealbox):
    for boxx in range(boxwidth):        
        for boxy in range(boxheight):
            left,top = leftop(boxx,boxy)
            if not revealbox[boxx][boxy]:
                pygame.draw.rect(disp,white,(left,top,boxsize,boxsize))
            else:
                shape,color = getshapeandcolor(board,boxx,boxy)
                drawicon(shape,color,boxx,boxy)


def startanimation(board):
    boxes = []
    for boxx in range(boxwidth):
        for boxy in range(boxheight):
            boxes.append((boxx,boxy))
            random.shuffle(boxes)
    revealbox = getrevealed(False)    
    drawboard(board,revealbox)
    boxgroups = split(8,boxes)
    for boxgroup in boxgroups:
        revealboardanimation(board,boxgroup)
        pygame.time.wait(300)
        coverboardanimation(board,boxgroup)
    pygame.display.update()
    fpsclock.tick(FPS)
    
def wonanimation(board):
    color1 = gray
    color2 = navyblue
    revealbox = getrevealed(True)
    for i in range(13):
        color1,color2 = color2,color1
        drawboard(board,revealbox)
        disp.fill(color1)
       
        pygame.time.wait(300)
        pygame.display.update()

def haswon(reveal):
    for i in reveal:
        if False in i:
            return False
        
    return True
        

if __name__ == '__main__':
    main()