Python实现拼图游戏

最近,要说最火的编程语言莫过于Python了。除了占据各种网站编程语言的排行榜之外,最劲爆的消息就是教育部将Python语言纳入计算机等级考试,并且山东某学校已将Python引入课堂。这无疑给Python语言给予了极大的肯定。也必将极大助力Python的发展壮大。当然我也是Python的爱好者,"Life is short, we need Python.",我喜欢这句话。

我为什么喜欢Python

这两三年随着大数据的火爆,Python也是大红大紫,我始终相信被大多数人接受的东西自然有它的优点,我相信Python也不例外,所以也好奇,想一探究竟。于是抱着好奇和对流行的兴趣,初次接触,并真实感受了下Python,也就这样喜欢上了。刚开始学习感觉语法简单,功能强大,可能得益于语言起步晚,设计完善。学以致用,工作中平时经常抢不到会议室,那么就想用Python小试牛刀,于是用Python写了一个凌晨1点(应该没人变态到凌晨去订会议室吧,but exclude me,^_^)自动订会议室的程序。基本功能是用我的账户密码登录,然后预定我事先设置好的会议室信息(包括会议室、主题、电话等),大概一共代码也就100行,确实很好用。后来有用Python做一些界面类东东,来直观的展示某些过程,很是易学易用。

当然Python也确实能够极大的节约程序员的开发时间,在C语言中需要很多代码来实现的功能,对于Python来说可能也就一两行代码就可以实现,生命苦短,快用Python。花几分钟可以实现的功能,为什么要花一两天去实现呢?生命苦短啊,^_^。

另一方面,由于Python的流行,很多大牛和组织都在参与,并开源出很多包,很方便且免费的就可以得到,而且代码质量也肯定比大多数人的代码质量高,那么,别人都造好轮子了,为什么自己还要再造呢? 为什么不站在巨人的肩膀上前进。

今天用Python实现一个拼图游戏,经测试可以正常运行,运行效果如下视频。

源码如下,当然也可以用git下载,https://github.com/ggangliu/puzzle_for_9.git

#_*_ coding:gbk _*_

importpygame, sys, random

frompygame.localsimport *

# 一些常量

WINDOWWIDTH=500

WINDOWHEIGHT=500

BACKGROUNDCOLOR=(255,255,255)

BLUE=(,,255)

BLACK=(,,)

FPS=40

VHNUMS=3

CELLNUMS=VHNUMS*VHNUMS

MAXRANDTIME=100

# 退出

defterminate():

pygame.quit()

sys.exit()

# 随机生成游戏盘面

defnewGameBoard():

board=[]

foriinrange(CELLNUMS):

board.append(i)

blackCell=CELLNUMS-1

board[blackCell]= -1

foriinrange(MAXRANDTIME):

direction=random.randint(,3)

if(direction==):

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)

returnboard, blackCell

# 若空白图像块不在最左边,则将空白块左边的块移动到空白块位置

defmoveRight(board,blackCell):

ifblackCell%VHNUMS==:

returnblackCell

board[blackCell-1],board[blackCell]=board[blackCell],board[blackCell-1]

returnblackCell-1

# 若空白图像块不在最右边,则将空白块右边的块移动到空白块位置

defmoveLeft(board,blackCell):

ifblackCell%VHNUMS==VHNUMS-1:

returnblackCell

board[blackCell+1],board[blackCell]=board[blackCell],board[blackCell+1]

returnblackCell+1

# 若空白图像块不在最上边,则将空白块上边的块移动到空白块位置

defmoveDown(board,blackCell):

ifblackCell

returnblackCell

board[blackCell-VHNUMS],board[blackCell]=board[blackCell],board[blackCell-VHNUMS]

returnblackCell-VHNUMS

# 若空白图像块不在最下边,则将空白块下边的块移动到空白块位置

defmoveUp(board,blackCell):

ifblackCell>=CELLNUMS-VHNUMS:

returnblackCell

board[blackCell+VHNUMS],board[blackCell]=board[blackCell],board[blackCell+VHNUMS]

returnblackCell+VHNUMS

# 是否完成

defisFinished(board,blackCell):

foriinrange(CELLNUMS-1):

ifboard[i]!=i:

returnFalse

returnTrue

# 初始化

pygame.init()

mainClock=pygame.time.Clock()

# 加载图片

gameImage=pygame.image.load('pic.jpg')

gameRect=gameImage.get_rect()

# 设置窗口

windowSurface=pygame.display.set_mode((gameRect.width, gameRect.height))

pygame.display.set_caption((u'puzzle').encode('utf-8'))

#font = pygame.font.SysFont('楷体', 60)

cellWidth=int(gameRect.width/VHNUMS)

cellHeight=int(gameRect.height/VHNUMS)

finish=False

gameBoard, blackCell=newGameBoard()

# 游戏主循环

whileTrue:

foreventinpygame.event.get():

ifevent.type==QUIT:

terminate()

iffinish:

continue

ifevent.type==KEYDOWN:

ifevent.key==K_LEFTorevent.key==ord('a'):

blackCell=moveLeft(gameBoard, blackCell)

ifevent.key==K_RIGHTorevent.key==ord('d'):

blackCell=moveRight(gameBoard, blackCell)

ifevent.key==K_UPorevent.key==ord('w'):

blackCell=moveUp(gameBoard, blackCell)

ifevent.key==K_DOWNorevent.key==ord('s'):

blackCell=moveDown(gameBoard, blackCell)

ifevent.type==MOUSEBUTTONDOWNandevent.button==1:

x, y=pygame.mouse.get_pos()

col=int(x/cellWidth)

row=int(y/cellHeight)

index=col+row*VHNUMS

if(index==blackCell-1orindex==blackCell+1orindex==blackCell-VHNUMSorindex==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)

foriinrange(CELLNUMS):

rowDst=int(i/VHNUMS)

colDst=int(i%VHNUMS)

rectDst=pygame.Rect(colDst*cellWidth, rowDst*cellHeight, cellWidth, cellHeight)

ifgameBoard[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)

foriinrange(VHNUMS+1):

pygame.draw.line(windowSurface, BLACK, (i*cellWidth,), (i*cellWidth, gameRect.height))

foriinrange(VHNUMS+1):

pygame.draw.line(windowSurface, BLACK, (, i*cellHeight), (gameRect.width, i*cellHeight))

pygame.display.update()

mainClock.tick(FPS)

源码大概有150行左右,有很大的优化空间,后面会加入自动恢复的算法,该算法会基于一个随机初始状态,进行计算,算出恢复原图的最小步骤,并自动执行恢复过程。

生命苦短,快用Python

本文来自企鹅号 - 程序猿GGang媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员八阿哥

你是如何自学 Python 的?

我是自学的Python。从对Python一无所知,到在博客上写Python相关的系列文章(Python快速教程),前后有将近三年的时间。期间有不少门槛,但也充满...

20510
来自专栏java一日一条

4个理由告诉你Java为何排行第一

Java已经有20年的历史了,甚至更久,而这取决于你所询问的人和你的计算方式。忽略它的年龄不看,Java依然排行第一。它的实用性、性能和向后兼容性都彰显其价值所...

7720
来自专栏余林丰

桥接模式

桥接模式要把握的很重要的一点就是:类的继承关系和类的组合/聚合关系,何时应该考虑使用何种关系。是不是在编程过程中一味地使用类的继承关系就代表这就是面向对象编程了...

22670
来自专栏CSDN技术头条

帮你提升 Python 的 27 种编程语言

【编者按】本文作者是 Python 的设计者之一 Nick Coghlan,总结了提升 Python 的 27 种编程语言,包括过程式编程、面向对象的数据模型、...

36080
来自专栏PPV课数据科学社区

为什么要选择Python语言实现机器学习算法

点击上方 “蓝色字” 可关注我们! 我们选择Python作为实现机器学习算法的编程语言:(1) Python的语法清晰;(2) 易于操作纯文本文件;(3) 使用...

38380
来自专栏北京马哥教育

从入门到上手,如何快速学会Python?

因为清晰易读的风格,广泛的适用性,Python已经成为最受欢迎的编程语言之一。在TIOBE 排行榜中位居第四,是名副其实的人工智能第一语言。 风靡的另一个原因...

373110
来自专栏互联网技术栈

领域驱动模型(DDD)

2004年Eric Evans 发表《领域驱动设计——软件核心复杂性应对之道》(Domain-Driven Design –Tackling Complexit...

40810
来自专栏PPV课数据科学社区

Eric Raymond 对于几大开发语言的评价

来源:孟岩 英文:Eric Raymond 链接:blog.csdn.net/myan/article/details/1923 【译注】:Eric Raym...

36660
来自专栏java一日一条

4个理由告诉你Java为何排行第一

Java已经有20年的历史了,甚至更久,而这取决于你所询问的人和你的计算方式。忽略它的年龄不看,Java依然排行第一。它的实用性、性能和向后兼容性都彰显其价值所...

9720
来自专栏牛客网

滴滴android实习面经

29400

扫码关注云+社区

领取腾讯云代金券