最近,要说最火的编程语言莫过于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
领取专属 10元无门槛券
私享最新 技术干货