目标:

了解pygame模块的框架与基础函数;
熟悉MVC设计模式;
掌握自顶向下的程序设计方式。

内容:

完成数字推盘游戏设计

步骤:

代码如下:

import pygame
import time
import random
import sys
import random
from pygame.locals import *
#定义常量
WINWIDTH = 640                     #窗口宽度
WINHEIGHT = 480                        #窗口高度
ROW = 3
COL = 3
BLANK = None
#####颜色预设####
DARKGRAY =         (  60, 60,  60)
WHITE =         (255, 255, 255)
BLUE=         ( 32, 178, 170)
GRAY  =         (128, 128, 128)
BRIGHTBLUE =    (138, 228, 221)
BLEAK = (50,255,50)
#######颜色变量#####
BLANKCOLOR = DARKGRAY              #预设背景颜色
MSGCOLOR = WHITE                   #提示信息颜色
BTCOLOR = BLUE                 #按钮底色
BTTEXTCOLOR = GRAY                 #选项字体颜色
BDCOLOR = BRIGHTBLUE
BTCOLOR_NEW = BLEAK
#######静态常量#####
BLOCKSIZE = 80     #滑块边长
FPS = 60
UP = 'up'
DOWN = 'down'
LEFT = 'left'
RIGHT = 'right'
NEWGAME = 'newgame'
AUTOMOVE = random.randint(50,100)
print(AUTOMOVE)def main():global FPSCLOCK,WINSET,STATICSURF,BASICFONTglobal NEW_SURF,NEW_RECTglobal SOLVEDBOARD##流程pygame.init()FPSCLOCK = pygame.time.Clock()                                         BASICFONT = pygame.font.Font('STKAITI.TTF',24)                           #初始化initBoard = getStartingBoard()print(initBoard)WINSET,NEW_SURF,NEW_RECT = drawStaticWin()STATICSURF = WINSET.copy()mainBoard = generateNewPuzzle(AUTOMOVE)   msg = Nonewhile True:FPSCLOCK.tick(FPS)drawBoard(mainBoard,msg)            pygame.display.update()checkForQuit()                               userInput = getInput(mainBoard)                mainBoard,msg = processing(userInput,mainBoard,msg)def getInput(mainBoard):events = pygame.event.get()userInput= Nonefor event in events:    if event.type == MOUSEBUTTONUP:spotx,spoty = getSpotClicked(mainBoard,event.pos[0],event.pos[1])if (spotx,spoty)==(None,None) and NEW_RECT.collidepoint(event.pos):    userInput = NEWGAMEelse:if mainBoard == getStartingBoard():breakblankx,blanky = getBlankPosition(mainBoard)if spotx == blankx + 1 and spoty == blanky:     userInput = LEFT                                   elif spotx == blankx -1 and spoty == blanky:        userInput = RIGHT                                  elif spotx == blankx and spoty == blanky + 1:      userInput = UPelif spotx == blankx and spoty == blanky - 1:    userInput = DOWNreturn userInputdef processing(userInput,mainBoard,msg):if mainBoard == getStartingBoard():      msg = ' very good!'else:msg = '任何你想说的话,这里老师要求我们班级加姓名'if userInput:             if userInput == NEWGAME:initBoard = getStartingBoard()mainBoard = generateNewPuzzle(AUTOMOVE)else:slideAnimation(mainBoard,userInput,msg,8)makeMove(mainBoard,userInput)return mainBoard,msgdef getSpotClicked(board,x,y):for tilex in range(len(board)):for tiley in range(len(board[0])):left,top = getLeftTopOfTile(tilex,tiley)tileRect = pygame.Rect(left,top,BLOCKSIZE,BLOCKSIZE)if tileRect.collidepoint(x,y):     #如果x,y在碎方块内return tilex,tiley               #返回方块坐标return None,Nonedef getStartingBoard():initBoard = []for i in range(COL):i = i+1column = []for j in range(ROW):column.append(i)i += COL                    initBoard.append(column)initBoard[ROW-1][COL-1] = BLANKreturn initBoarddef generateNewPuzzle(numSlides):mianBoard = getStartingBoard()        drawBoard(mianBoard,'')lastMove = Nonefor i in range(numSlides):move = getRandomMove(mianBoard,lastMove)slideAnimation(mianBoard,move,'初始化中...',animationSpeed=int(BLOCKSIZE / 3))makeMove(mianBoard,move)lastMove = movereturn mianBoarddef makeMove(board,move):blankx,blanky = getBlankPosition(board)if move == UP:board[blankx][blanky],board[blankx][blanky+1] = board[blankx][blanky+1],board[blankx][blanky]elif move == DOWN:board[blankx][blanky],board[blankx][blanky-1] = board[blankx][blanky-1],board[blankx][blanky]elif move == LEFT:board[blankx][blanky],board[blankx+1][blanky] = board[blankx+1][blanky],board[blankx][blanky]elif move == RIGHT:board[blankx][blanky],board[blankx-1][blanky] = board[blankx-1][blanky],board[blankx][blanky]def getRandomMove(board,lastMove=None):validMoves = [UP,DOWN,LEFT,RIGHT]if lastMove == UP or not isValidMove(board,DOWN):validMoves.remove(DOWN)if lastMove == DOWN or not isValidMove(board,UP):validMoves.remove(UP)if lastMove == LEFT or not isValidMove(board,RIGHT):validMoves.remove(RIGHT)if lastMove == RIGHT or not isValidMove(board,LEFT):validMoves.remove(LEFT)return random.choice(validMoves)def isValidMove(board,move):blankx,blanky = getBlankPosition(board)if move == UP:return blanky != len(board[0])-1if move == DOWN:return blanky != 0if move == LEFT:return blankx != len(board)-1if move == RIGHT:return blankx != 0def getBlankPosition(board):for x in range(COL):for y in range(ROW):if board[x][y] == BLANK:return (x,y)def drawStaticWin():#窗口winSet = pygame.display.set_mode((WINWIDTH,WINHEIGHT))#名字       pygame.display.set_caption('数字推盘')#背景图片                       image = pygame.image.load('bg.jpg')#绘制到窗口中                           winSet.blit(image,(0,0))#新游戏按钮new_surf,new_rect = makeText('新游戏',BTTEXTCOLOR,BTCOLOR_NEW,WINWIDTH-85,WINHEIGHT-40)#绘制到窗口中winSet.blit(new_surf,new_rect)#返回return winSet,new_surf,new_rectdef makeText(text,tColor,btColor,top,left):textSurf = BASICFONT.render(text,True,tColor,btColor)textRect = textSurf.get_rect()textRect.topleft = (top,left)return textSurf,textRectdef slideAnimation(board,direction,msg,animationSpeed):blankx,blanky = getBlankPosition(board)if direction == UP:movex = blankxmovey = blanky + 1elif direction == DOWN:movex = blankxmovey = blanky - 1elif direction == LEFT:movex = blankx + 1movey = blankyelif direction == RIGHT:movex = blankx - 1movey = blankydrawBoard(board,msg)BASESURF = WINSET.copy()       moveLeft,moveTop = getLeftTopOfTile(movex,movey)pygame.draw.rect(BASESURF,BLANKCOLOR,(moveLeft,moveTop,BLOCKSIZE,BLOCKSIZE))for i in range(0,BLOCKSIZE,animationSpeed):checkForQuit()WINSET.blit(BASESURF,(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 == LEFT:drawTile(movex,movey,board[movex][movey],-i,0)if direction == RIGHT:drawTile(movex,movey,board[movex][movey],i,0)pygame.display.update()FPSCLOCK.tick(FPS)
#动态界面
def drawBoard(board,msg):WINSET.blit(STATICSURF,(0,0))#提示信息if msg:                          msgSurf,msgRect = makeText(msg,MSGCOLOR,None,5,5)pygame.image.save(msgSurf,'msg.png')imgSurf = pygame.image.load('msg.png')WINSET.blit(imgSurf,msgRect)#绘制推盘for i in range(len(board)):           for j in range(len(board[0])):if board[i][j]:#绘制方块drawTile(i,j,board[i][j])#计算方块距离原点的横纵坐标left,top= getLeftTopOfTile(0,0)width = COL * BLOCKSIZEheight = ROW * BLOCKSIZE#绘制外边框pygame.draw.rect(WINSET,BDCOLOR,(left - 5,top - 5,width + 11,height + 11),4)def drawTile(tilex,tiley,number,adjx=0,adjy=0):left,top = getLeftTopOfTile(tilex,tiley)pygame.draw.rect(WINSET,BTCOLOR,(left+adjx,top+adjy,BLOCKSIZE,BLOCKSIZE))textSurf = BASICFONT.render(str(number),True,BTTEXTCOLOR)textRect = textSurf.get_rect()textRect.center = left+int(BLOCKSIZE/2)+adjx,top+int(BLOCKSIZE/2)+adjyWINSET.blit(textSurf,textRect)def getLeftTopOfTile(tilex,tiley):xMargin = int((WINWIDTH - (BLOCKSIZE * COL + (COL -1)))/2)yMargin = int((WINHEIGHT - (BLOCKSIZE * ROW + (ROW-1)))/2)left = xMargin + (tilex * BLOCKSIZE) + (tilex - 1)top = yMargin + (tiley * BLOCKSIZE) + (tiley - 1)return left,topdef checkForQuit():for event in pygame.event.get(QUIT):       terminate()                             for event in pygame.event.get(KEYUP):       if event.key == K_ESCAPE:              terminate()                         pygame.event.post(event)               def terminate():pygame.quit()sys.exit()if __name__ == '__main__':main()

运行结果:

Python—数字推盘游戏设计相关推荐

  1. python数字推盘游戏怎么显示步数_Python游戏开发:《最强大脑》同款游戏【数字华容道】...

    今年年初,新一季的<最强大脑>开播了,第一集选拔的时候大家做了一个数字游戏,名叫<数字华容道>,当时何猷君以二十几秒的成绩夺得该项目的冠军,看了这个游戏之后我决定要写一个< ...

  2. python数字推盘游戏怎么显示步数_Python游戏开发:数字华容道

    今年年初,新一季的<最强大脑>开播了,第一集选拔的时候大家做了一个数字游戏,名叫<数字华容道>,当时何猷君以二十几秒的成绩夺得该项目的冠军,看了这个游戏之后我决定要写一个< ...

  3. python数字推盘游戏怎么显示步数_python机器人行走步数问题的解决

    本文实例为大家分享了python机器人行走步数问题,供大家参考,具体内容如下 #! /usr/bin/env python3 # -*- coding: utf-8 -*- # fileName : ...

  4. python数字推盘游戏怎么显示步数_用 Python 实现手机自动答题,这下百万答题游戏谁也玩不过我!...

    引言 如果谈到这几年手机上各平台最常见的引流福利,必然是答题赢大奖系列小游戏了.像什么头号英雄,百万玩家之类的,充斥在我们生活中,同时也成为了我们生活中常见的娱乐方式. 但是有时候就会想,能不能实现手 ...

  5. python数字推盘游戏怎么显示步数_python初学---猜数字游戏(游戏与AI,原创)

    最近在学习python,并用python写了一个小时候玩的益智游戏,猜数字游戏,python语言真的是简洁啊,上来就是写代码逻辑,不用加一堆外壳的东西,话不多说,贴代码,取个名字叫guessL1.py ...

  6. python数字推盘游戏怎么显示步数_用 Python 修改微信(支付宝)运动步数,轻松 TOP1...

    原标题:用 Python 修改微信(支付宝)运动步数,轻松 TOP1 作者:Tsubasa_Ou 今天分享的文章让你霸屏微信运动,横扫支付宝榜单 1 项目意义 如果你想在支付宝蚂蚁森林收集很多能量种树 ...

  7. python数字推盘_从零开始学编程做游戏:一个文科生策划的14周

    点击 "humans flee" 按钮则人类移动一回合,点击 "zombies stalk" 按钮则僵尸移动一回合.它们采取的寻路策略都是广度优先搜索.游戏不会 ...

  8. Python实现数字推盘游戏重排九宫8-puzzle

    Python实现数字推盘游戏重排九宫8-puzzle 数字推盘游戏是一种经典的智力拼图游戏,玩家需要移动数字块,将它们按照正确的顺序排列.而8-puzzle就是数字推盘游戏中最经典的版本之一.本文将介 ...

  9. python:实现数字推盘游戏重排九宫8-puzzle(附完整源码)

    python:实现数字推盘游戏重排九宫8-puzzle from collections import deque from copy import deepcopy from queue impor ...

最新文章

  1. python工具使用笔记
  2. NVIDIA专家实战演示,教你快速搭建基于Python的车辆信息识别系统
  3. 加固工程验收规范50550_石家庄栾城县厂房梁柱加固施工队规范作业-建筑加固
  4. 解决各大浏览器兼容问题hack方法总结
  5. 11.13 模10计数器设计
  6. bootsect Linux,linux_bootsect选读.doc
  7. web报表工具finereport常用函数的用法总结(数组函数)
  8. python 下载公众号文章_python如何导出微信公众号文章方法详解
  9. ul1977标准_UL1977标准连接器UL认证测试内容
  10. 计算机快速看图教程,cad快速看图制图
  11. Spring框架概要
  12. MIMO与Beamforming技术学习
  13. java老九_【老九】【Java】小议转义字符
  14. 《葬花吟》笛箫简谱-红楼梦主题曲
  15. Kvsc autorun.inf病毒
  16. Let‘sEncrypt快速颁发及自动续签泛域名证书实践指南
  17. ABB 120 六轴机械手臂编程调试(四) 三菱plc控制器配套程序
  18. 恐鬼症不显示服务器区域,《Phasmophobia》恐鬼症怎么证明鬼存在?鬼存在证明方法...
  19. java里用idea是什么意思_idea什么意思?啥意思?idea简介
  20. 通过反编译分析骑砍2俘虏招募机制

热门文章

  1. equation buu
  2. ChatGPT中的提示工程(Prompt Engineering)怎么做?50页最新PPT下载
  3. Python——内置库函数
  4. InfluxDB SpringBoot Docker Grafana实战监控数据统计
  5. Hfish开源蜜罐初探
  6. c语言属于高级语言吗,c语言属于高级语言吗
  7. 暴力破解zip加密压缩包
  8. Python学习笔记:7.5.1 Django快速建站 -源码版本管理
  9. 利用TensorRT实现神经网络提速(读取ONNX模型并运行)
  10. Excel行数多,如何快速定位到最后一行空白行?