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 相关文章推荐
Python中的Numeric包和Numarray包使用教程
Apr 13 Python
Python文件去除注释的方法
May 25 Python
python实现基本进制转换的方法
Jul 11 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
python pygame实现2048游戏
Nov 20 Python
python 实现调用子文件下的模块方法
Dec 07 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
python3 实现的对象与json相互转换操作示例
Aug 17 Python
python调用接口的4种方式代码实例
Nov 19 Python
Python过滤序列元素的方法
Jul 31 Python
Python Pygame实战之塔防游戏的实现
Mar 17 Python
Elasticsearch 基本查询和组合查询
Apr 19 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 cookies中删除的一般赋值方法
2011/05/07 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
JavaScript 动态改变图片大小
2009/06/11 Javascript
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
Python使用multiprocessing创建进程的方法
2015/06/04 Python
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
python逆序打印各位数字的方法
2018/06/25 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
实例详解Python模块decimal
2019/06/26 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
建筑工程实习自我鉴定
2013/09/19 职场文书
公司领导推荐信
2013/11/12 职场文书
员工培训邀请函
2014/01/11 职场文书
作文评语集锦大全
2014/04/23 职场文书
先进员工事迹材料
2014/12/20 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
JavaScript canvas实现流星特效
2021/05/20 Javascript