清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
import pygame,sys,random from pygame.locals import* FPS = 30 boardnum = 4 boardsize = 80 winx = 640 winy = 480 BASICFONTSIZE = 20 xmargin = int((winx - (boardnum*boardsize+(boardnum-1)))/2) ymargin = int((winy - (boardnum*boardsize+(boardnum-1)))/2) Blank = None green = (0,204,0) blue = (0,50,255) white = (255,255,255) dark = (3,54,73) up = 'up' down = 'down' L = 'left' R = 'right' def main(): global fpsclock,disp,BASICFONT,reset_surf,reset_rect,solved_surf,solved_rect,new_surf,new_rect pygame.init() fpsclock = pygame.time.Clock() disp = pygame.display.set_mode((winx,winy)) pygame.display.set_caption('slide puzzle') BASICFONT = pygame.font.Font('freesansbold.ttf',BASICFONTSIZE) reset_surf,reset_rect = maketext('reset',white,green,winx-120,winy-90) new_surf,new_rect = maketext('new',white,green,winx-120,winy-60) solved_surf,solved_rect = maketext('solve',white,green,winx-120,winy-30) mainboard,seq = newpuzzles(80) solvedboard = startboard() allmove = [] while True: slide = None msg = 'Click tile or press arrow keys to slide.' if mainboard == solvedboard: msg = 'win' drawboard(mainboard,msg) checkforquit() for event in pygame.event.get(): if event.type == MOUSEBUTTONUP: spotx,spoty = getclicked(mainboard,event.pos[0],event.pos[1]) if (spotx,spoty)==(None,None): if reset_rect.collidepoint(event.pos): resetpuzzles(mainboard,allmove) allmove = [] elif new_rect.collidepoint(event.pos): mainboard,seq = newpuzzles(20) allmove = [] elif solved_rect.collidepoint(event.pos): resetpuzzles(mainboard,seq+allmove) allmove = [] else: blankx,blanky = getblank(mainboard) if spotx == blankx and spoty == blanky - 1 : slide = down elif spotx == blankx and spoty == blanky + 1 : slide = up if spotx == blankx+1 and spoty == blanky : slide = L if spotx == blankx-1 and spoty == blanky : slide = R elif event.type == KEYUP: if event.key in (K_a, K_LEFT) and validmove(mainboard,L): slide == L elif event.key in (K_d,K_RIGHT) and validmove(mainboard,R): slide == R elif event.key in (K_w,K_UP) and validmove(mainboard,up): slide == up elif event.key in (K_s,K_DOWN) and validmove(mainboard,down): slide == down if slide: slideanimation(mainboard,slide,'Click tile or press arrow keys to slide.',8) makemove(mainboard,slide) allmove.append(slide) pygame.display.update() fpsclock.tick(FPS) def terminal(): pygame.quit() sys.exit() def checkforquit(): for event in pygame.event.get(QUIT): terminal() for event in pygame.event.get(KEYUP): if event.key == K_ESCAPE: terminal pygame.event.post(event) def startboard(): counter = 1 board = [] for x in range(boardnum): column = [] for y in range(boardnum): column.append(counter) counter+=boardnum board.append(column) counter-=boardnum*(boardnum-1)+boardnum-1 board[boardnum-1][boardnum-1] = Blank return board def getblank(board): for x in range(boardnum): for y in range(boardnum): if board[x][y] == Blank: return (x,y) def makemove(board,move): blankx,blanky = getblank(board) if move == up: board[blankx][blanky],board[blankx][blanky+1] = board[blankx][blanky+1],board[blankx][blanky] if move == down: board[blankx][blanky],board[blankx][blanky-1] = board[blankx][blanky-1],board[blankx][blanky] if move == L: board[blankx][blanky],board[blankx+1][blanky] = board[blankx+1][blanky],board[blankx][blanky] if move == R: board[blankx][blanky],board[blankx-1][blanky] = board[blankx-1][blanky],board[blankx][blanky] def validmove(board,move): blankx,blanky = getblank(board) return (move == up and blanky != boardnum-1) or (move==down and blanky != 0) or (move == L and blankx != boardnum-1)or (move==R and blankx != 0) def getrandommove(board,lastmove = None): validmoves = [up,down,L,R] if lastmove == up or not validmove(board,down): validmoves.remove(down) if lastmove == down or not validmove(board,up): validmoves.remove(up) if lastmove == L or not validmove(board,R): validmoves.remove(R) if lastmove == R or not validmove(board,L): validmoves.remove(L) return random.choice(validmoves) def leftop(tilex,tiley): left = xmargin + tilex*boardsize+tilex-1 top = ymargin + tiley*boardsize+tiley-1 return (left,top) def getclicked(board,x,y): for tilex in range(boardnum): for tiley in range(boardnum): left,top = leftop(tilex,tiley) b = pygame.Rect(left,top,boardsize,boardsize) if b.collidepoint(x,y): return (tilex,tiley) return(None,None) def drawtile(tilex,tiley,number,ax = 0,ay = 0): left,top = leftop(tilex,tiley) pygame.draw.rect(disp,green,(left+ax,top+ay,boardsize,boardsize)) textsuf = BASICFONT.render(str(number),True,white) textrect = textsuf.get_rect() textrect.center = left + int(boardsize/2)+ax,top + int(boardsize/2)+ay disp.blit(textsuf,textrect) def maketext(text,color,dark,top,left): textsuf = BASICFONT.render(text,True,color,dark) textrect = textsuf.get_rect() textrect.topleft = (top,left) return(textsuf,textrect) def drawboard(board,message): disp.fill(dark) if message: textsuf,textrect = maketext(message,white,dark,5,5) disp.blit(textsuf,textrect) for tilex in range(boardnum): for tiley in range(boardnum): if board[tilex][tiley]: drawtile(tilex,tiley,board[tilex][tiley]) left,top = leftop(0,0) size = boardsize*boardnum pygame.draw.rect(disp,blue,(left-5,top-5,size+11,size+11),4) disp.blit(reset_surf,reset_rect) disp.blit(new_surf,new_rect) disp.blit(solved_surf,solved_rect) def slideanimation(board,direction,message,animationspeed): blankx,blanky = getblank(board) if direction == up: movex =blankx movey = blanky+1 if direction == down: movex = blankx movey = blanky-1 if direction == L: movex = blankx + 1 movey = blanky if direction == R: movex = blankx - 1 movey = blanky drawboard(board,message) bash = disp.copy() moveleft,movetop = leftop(movex,movey) pygame.draw.rect(bash,dark,(moveleft,movetop,boardsize,boardsize)) # pygame.draw.rect(bash,dark,(moveleft,movetop,boardsize,boardsize)) for i in range(0,boardsize,animationspeed): checkforquit() disp.blit(bash,(0,0)) if direction == up: drawtile(movex,movey,board[movex][movey],0,-i) if direction == down: drawtile(movex,movey,board[movex][movey],0,i) if direction == L: drawtile(movex,movey,board[movex][movey],-i,0) if direction == R: drawtile(movex,movey,board[movex][movey],i,0) pygame.display.update() fpsclock.tick(FPS) def newpuzzles(numslide): board = startboard() seq = [] drawboard(board,'') pygame.display.update() pygame.time.wait(500) lastmove = None for i in range(numslide): move = getrandommove(board,lastmove) slideanimation(board,move,'generate new game',animationspeed = int(boardsize/3)) makemove(board,move) seq.append(move) lastmove = move return (board,seq) def resetpuzzles(board,allmove): revallmove = allmove[:] revallmove.reverse() for move in revallmove: if move == up: oppositemove = down elif move == down: oppositemove = up elif move == L: oppositemove = R elif move == R: oppositemove = L slideanimation(board,oppositemove,'',animationspeed=int(boardsize / 2)) makemove(board,oppositemove) if __name__ == '__main__': main()