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 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
Python学习笔记(二)基础语法
Jun 06 Python
python根据开头和结尾字符串获取中间字符串的方法
Mar 26 Python
Python决策树和随机森林算法实例详解
Jan 30 Python
Python命令行解析模块详解
Feb 01 Python
Python向MySQL批量插数据的实例讲解
Mar 31 Python
python脚本生成caffe train_list.txt的方法
Apr 27 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
Jun 27 Python
Python字符串对象实现原理详解
Jul 01 Python
Python爬取知乎图片代码实现解析
Sep 17 Python
python析构函数用法及注意事项
Jun 22 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
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
深入PHP FTP类的详解
2013/06/13 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
php实现xml转换数组的方法示例
2017/02/03 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
Extjs中DisplayField的日期或者数字格式化扩展
2010/09/03 Javascript
javascript表单验证 - Parsley.js使用和配置
2013/01/25 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
2016/08/01 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
2018/05/09 Javascript
代码整洁之道(重构)
2018/10/25 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
微信小程序 button样式设置为图片的方法
2020/06/19 Javascript
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
Python列表元素常见操作简单示例
2019/10/25 Python
使用TensorFlow-Slim进行图像分类的实现
2019/12/31 Python
40行Python代码实现天气预报和每日鸡汤推送功能
2020/02/27 Python
Clarks鞋美国官网:全球领军鞋履品牌
2017/05/13 全球购物
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
如何查看在weblogic中已经发布的EJB
2012/06/01 面试题
Python使用openpyxl复制整张sheet
2021/03/24 Python
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
体育运动会广播稿
2014/10/05 职场文书
感谢信格式范文
2015/01/22 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
javascript数组includes、reduce的基本使用
2021/07/02 Javascript