当前位置:   article > 正文

python+pygame实现小游戏连连看之一

python+pygame实现小游戏连连看之一

连连看是一个小游戏,主要是打发时间的,闲来无事,记录一下编写的过程。

设想步骤:1、在图片中

截取几个小的图片作为连连看的小图标

2、随机实现小图片的排列(注意一定是成对出现,不然咋连),为方便测试,先弄6*6的

3、连连看逻辑实现

4、通关后的界面

以下是过程:

一、界面初始化等基本动作

没有啥好讲的,直接上代码:

  1. import pygame
  2. import sys
  3. from pygame.locals import *
  4. import time
  5. import traceback
  6. import os,random
  7. def main():
  8. pygame.init()
  9. game_size = width,height = 700,500
  10. bg_color = (255,255,255) #白色底
  11. game_cols = 6
  12. game_rows = 6
  13. imgs_repeat = game_cols * game_rows / 4
  14. cell_size = 40
  15. pygame.display.set_caption('Hi,连连看!')
  16. '''
  17. 让游戏界面居中显示
  18. '''
  19. os.environ['SDL_VIDEO_CENTERED'] = '1'
  20. game_screen = pygame.display.set_mode(game_size)
  21. # 获取屏幕的宽度和高度
  22. game_screen_width = game_screen.get_width()
  23. game_screen_height = game_screen.get_height()
  24. # 计算图片应该被放置的位置,使其居中
  25. x_position = (game_screen_width // 2) - (game_cols * cell_size // 2)
  26. y_position = (game_screen_height // 2) - (game_rows * cell_size // 2)
  27. game_screen.fill(bg_color) #1、填充背景颜色,这样也把上一次的图像刷掉了。
  28. pygame.display.flip() #3、双缓冲机制,一次性将缓冲好的内容显示在屏幕上
  29. while True:
  30. for event in pygame.event.get():
  31. if event.type == pygame.QUIT:
  32. sys.exit()
  33. # 检查鼠标事件
  34. elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1 :
  35. print("鼠标点击:", event.pos[0])
  36. if __name__ == "__main__":
  37. try:
  38. main()
  39. except SystemExit:
  40. pass
  41. except:
  42. traceback.print_exc()
  43. pygame.quit()
  44. input()

简单起见,目前只搞6*6,每个小图标是40*40,imgs_repeat表示的是一个图片可以出现4次。上述代码将其设置为居中:游戏居中,未来的图片显示在游戏中也是居中。

框架已有了,下面就慢慢添砖加瓦。

二、切出小图片

利用pygame中对象Surface的subsurface方法即可实现,它返回一个子 Surface 对象,它将与父对象共享所有的像素。有4个参数,依次为左上角坐标(x,y)及截取的宽度,高度。依赖左上角坐标x的值可以循环截取了。

实现的方法就是这样的:

  1. def main():
  2. ...
  3. cell_size = 40
  4. small_imgs = [] #新增
  5. ...
  1. '''
  2. 分割小图标
  3. '''
  4. def splitImg():
  5. llk_base = pygame.image.load("imgs\\llk.png") #图片加载成功后,pygame将图片转换为一个Surface对象
  6. for i in range(0, int(imgs_repeat)):
  7. i_left = i * cell_size
  8. small_imgs.append(llk_base.subsurface(i_left,0,cell_size,cell_size))

三、随机将小图片放在屏幕上

选图片有三步

1、将需要的图放在一个列表tmp_game中

2、随机选中放到列表mid_game,并从tmp_game删除

3、将mid_game转为一个二维的,这样对应了屏幕的2D空间

  1. def main():
  2. ...
  3. cur_game = [] #游戏 ,新增
  4. tmp_game = [] #临时游戏内容 ,新增
  5. mid_game = [] #中间游戏 ,新增
  6. '''
  7. 初始化游戏
  8. '''
  9. def iniGame():
  10. for i in range(0, int(imgs_repeat)):
  11. for j in range(0, 4):
  12. tmp_game.append(i)
  13. total = game_cols * game_rows
  14. for x in range(0, total):
  15. index = random.randint(0, total - x - 1)
  16. mid_game.append(tmp_game[index])
  17. del tmp_game[index]
  18. # 一维转为二维,y为高
  19. for y in range(0, game_rows):
  20. for x in range(0, game_cols):
  21. if x == 0:
  22. cur_game.append([])
  23. cur_game[y].append(mid_game[x + y * game_rows])

最后的cur_game就是对应的屏幕上的二维数组了。数组的内容就是小图标small_imgs的下标。

选完后将小图片按规定的二维顺序显示到页面上即可。显示时还是利用循环按行列顺序blit组成一个大的Surface,然后再flip刷到屏幕上就可以了。注意,在后面消掉后也要调用该方法,所以设置一个EMPTYCELL常量,对应-1,这样就表示当前的格子上的小图标已经消掉了。

  1. def main():
  2. ...
  3. EMPTYCELL = -1 #新增
  4. '''
  5. 显示 game_screen.blit(small_imgs[0],(x_position,y_position))
  6. '''
  7. def drawGame():
  8. game_screen.fill(bg_color)
  9. for y in range(0, game_rows):
  10. for x in range(0, game_cols):
  11. if cur_game[y][x] != EMPTYCELL:
  12. game_screen.blit(small_imgs[cur_game[y][x]],(x_position + x * cell_size,y_position + y * cell_size))
  13. pygame.display.flip()

修改main代码,把程序完善一下。

  1. def main():
  2. ...
  3. # 计算图片应该被放置的位置,使其居中
  4. x_position = (game_screen_width // 2) - (game_cols * cell_size // 2)
  5. y_position = (game_screen_height // 2) - (game_rows * cell_size // 2)
  6. splitImg() #新增
  7. game_screen.fill(bg_color) #1、填充背景颜色,这样也把上一次的图像刷掉了。
  8. '''
  9. 初始化,并显示
  10. '''
  11. iniGame() #新增
  12. drawGame() #新增
  13. pygame.display.flip() #3、双缓冲机制,一次性将缓冲好的内容显示在屏幕上

调试程序:

对应的例如cur_game[0][5]的值是2,对应的图片就是

待续。。。

python+pygame实现小游戏连连看之二

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/854304
推荐阅读
相关标签
  

闽ICP备14008679号