Python加pyGame实现的简单拼图游戏实例


Posted in Python onMay 15, 2015

本文实例讲述了Python加pyGame实现的简单拼图游戏。分享给大家供大家参考。具体实现方法如下:

import pygame, sys, random
from pygame.locals import *
# 一些常量
WINDOWWIDTH = 500
WINDOWHEIGHT = 500
BACKGROUNDCOLOR = (255, 255, 255)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
FPS = 40
VHNUMS = 3
CELLNUMS = VHNUMS*VHNUMS
MAXRANDTIME = 100
# 退出
def terminate():
  pygame.quit()
  sys.exit()
# 随机生成游戏盘面
def newGameBoard():
  board = []
  for i in range(CELLNUMS):
    board.append(i)
  blackCell = CELLNUMS-1
  board[blackCell] = -1
  for i in range(MAXRANDTIME):
    direction = random.randint(0, 3)
    if (direction == 0):
      blackCell = moveLeft(board, blackCell)
    elif (direction == 1):
      blackCell = moveRight(board, blackCell)
    elif (direction == 2):
      blackCell = moveUp(board, blackCell)
    elif (direction == 3):
      blackCell = moveDown(board, blackCell)
  return board, blackCell
# 若空白图像块不在最左边,则将空白块左边的块移动到空白块位置 
def moveRight(board, blackCell):
  if blackCell % VHNUMS == 0:
    return blackCell
  board[blackCell-1], board[blackCell] = board[blackCell], board[blackCell-1]
  return blackCell-1
# 若空白图像块不在最右边,则将空白块右边的块移动到空白块位置 
def moveLeft(board, blackCell):
  if blackCell % VHNUMS == VHNUMS-1:
    return blackCell
  board[blackCell+1], board[blackCell] = board[blackCell], board[blackCell+1]
  return blackCell+1
# 若空白图像块不在最上边,则将空白块上边的块移动到空白块位置 
def moveDown(board, blackCell):
  if blackCell < VHNUMS:
    return blackCell
  board[blackCell-VHNUMS], board[blackCell] = board[blackCell], board[blackCell-VHNUMS]
  return blackCell-VHNUMS
# 若空白图像块不在最下边,则将空白块下边的块移动到空白块位置 
def moveUp(board, blackCell):
  if blackCell >= CELLNUMS-VHNUMS:
    return blackCell
  board[blackCell+VHNUMS], board[blackCell] = board[blackCell], board[blackCell+VHNUMS]
  return blackCell+VHNUMS
# 是否完成
def isFinished(board, blackCell):
  for i in range(CELLNUMS-1):
    if board[i] != i:
      return False
  return True
# 初始化
pygame.init()
mainClock = pygame.time.Clock()
# 加载图片
gameImage = pygame.image.load('pic.bmp')
gameRect = gameImage.get_rect()
# 设置窗口
windowSurface = pygame.display.set_mode((gameRect.width, gameRect.height))
pygame.display.set_caption('拼图')
cellWidth = int(gameRect.width / VHNUMS)
cellHeight = int(gameRect.height / VHNUMS)
finish = False
gameBoard, blackCell = newGameBoard()
# 游戏主循环
while True:
  for event in pygame.event.get():
    if event.type == QUIT:
      terminate()
    if finish:
      continue
    if event.type == KEYDOWN:
      if event.key == K_LEFT or event.key == ord('a'):
        blackCell = moveLeft(gameBoard, blackCell)
      if event.key == K_RIGHT or event.key == ord('d'):
        blackCell = moveRight(gameBoard, blackCell)
      if event.key == K_UP or event.key == ord('w'):
        blackCell = moveUp(gameBoard, blackCell)
      if event.key == K_DOWN or event.key == ord('s'):
        blackCell = moveDown(gameBoard, blackCell)
    if event.type == MOUSEBUTTONDOWN and event.button == 1:
      x, y = pygame.mouse.get_pos()
      col = int(x / cellWidth)
      row = int(y / cellHeight)
      index = col + row*VHNUMS
      if (index == blackCell-1 or index == blackCell+1 or index == blackCell-VHNUMS or index == blackCell+VHNUMS):
        gameBoard[blackCell], gameBoard[index] = gameBoard[index], gameBoard[blackCell]
        blackCell = index
  if (isFinished(gameBoard, blackCell)):
    gameBoard[blackCell] = CELLNUMS-1
    finish = True
  windowSurface.fill(BACKGROUNDCOLOR)
  for i in range(CELLNUMS):
    rowDst = int(i / VHNUMS)
    colDst = int(i % VHNUMS)
    rectDst = pygame.Rect(colDst*cellWidth, rowDst*cellHeight, cellWidth, cellHeight)
    if gameBoard[i] == -1:
      continue
    rowArea = int(gameBoard[i] / VHNUMS)
    colArea = int(gameBoard[i] % VHNUMS)
    rectArea = pygame.Rect(colArea*cellWidth, rowArea*cellHeight, cellWidth, cellHeight)
    windowSurface.blit(gameImage, rectDst, rectArea)
  for i in range(VHNUMS+1):
    pygame.draw.line(windowSurface, BLACK, (i*cellWidth, 0), (i*cellWidth, gameRect.height))
  for i in range(VHNUMS+1):
    pygame.draw.line(windowSurface, BLACK, (0, i*cellHeight), (gameRect.width, i*cellHeight))
  pygame.display.update()
  mainClock.tick(FPS)

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python3.6正式版新特性预览
Dec 15 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
Python清空文件并替换内容的实例
Oct 22 Python
Python中一些深不见底的“坑”
Jun 12 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
python读取raw binary图片并提取统计信息的实例
Jan 09 Python
Python使用多进程运行含有任意个参数的函数
May 02 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
python上selenium的弹框操作实现
Jul 13 Python
Jupyter Notebook安装及使用方法解析
Nov 12 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 Python
Python实现从URL地址提取文件名的方法
May 15 #Python
Python基础入门之seed()方法的使用
May 15 #Python
Python中的random()方法的使用介绍
May 15 #Python
Python的randrange()方法使用教程
May 15 #Python
Python中的choice()方法使用详解
May 15 #Python
Python中利用sqrt()方法进行平方根计算的教程
May 15 #Python
简单介绍Python中的round()方法
May 15 #Python
You might like
php中数据的批量导入(csv文件)
2006/10/09 PHP
PHP入门速成教程
2007/03/19 PHP
献给php初学者(入门学习经验谈)
2010/10/12 PHP
php生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
微信自定义菜单的处理开发示例
2015/04/16 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
基于jQuery的仿flash的广告轮播代码
2010/11/04 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
jquery实现对联广告的方法
2015/02/05 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
JavaScript实现百度搜索框效果
2020/03/26 Javascript
JavaScript设计模式之装饰者模式实例详解
2019/01/17 Javascript
Vue响应式原理Observer、Dep、Watcher理解
2019/06/06 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
python实现折半查找和归并排序算法
2017/04/14 Python
python递归打印某个目录的内容(实例讲解)
2017/08/30 Python
Python实现简单的HttpServer服务器示例
2017/09/25 Python
深入理解Python中的*重复运算符
2017/10/28 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
python3中布局背景颜色代码分析
2020/12/01 Python
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
社区居务公开实施方案
2014/03/27 职场文书
运动会标语
2014/06/21 职场文书
放飞理想演讲稿
2014/09/09 职场文书