测试小站: 处理网 回收帮 培训网 富贵论坛 老富贵论坛

python做的扫雷小游戏

  import pygame

  import os

  from sys import exit

  import random

  pygame.init()

  # 图片地址

  bg_img='E:\\Minesweeper\\ui\\BG\\background_1.png'

  # 前8是数字,9是旗帜, 10是问号, 11是地雷

  num_img=('E:\\Minesweeper\\ui\

  um_0.png',

  'E:\\Minesweeper\\ui\

  um_1.png',

  'E:\\Minesweeper\\ui\

  um_2.png',

  'E:\\Minesweeper\\ui\

  um_3.png',

  'E:\\Minesweeper\\ui\

  um_4.png',

  'E:\\Minesweeper\\ui\

  um_5.png',

  'E:\\Minesweeper\\ui\

  um_6.png',

  'E:\\Minesweeper\\ui\

  um_7.png',

  'E:\\Minesweeper\\ui\

  um_8.png',

  'E:\\Minesweeper\\ui\

  um_9.png',

  'E:\\Minesweeper\\ui\

  um_10.png',

  'E:\\Minesweeper\\ui\

  um_11.png'

  )

  # GUI 对象

  screen=pygame.display.set_mode((900, 510), 0, 32)

  pygame.display.set_caption('扫雷')

  background=pygameage.load(bg_img).convert()

  font=pygame.font.Font(None, 32)

  pos_t=pygame.font.Font(None, 32)

  # 游戏变量

  gameover=0

  ms_number=99

  grid_number=16 * 30 - ms_number

  vis=[[0 for x in range(18)] for y in range(32)]

  vv=[[0 for x in range(18)] for y in range(32)]

  di=[[0,1],[0,-1],[-1,0],[1,0],[1,-1],[-1,1],[1,1],[-1,-1]]

  def Init():

  global gameover

  gameover=0

  global ms_number

  ms_number=99

  global grid_number

  grid_number=16 * 30 - ms_number

  for i in range(0, 30):

  for j in range(0, 16):

  vis[i][j]=0

  vv[i][j]=0

  ans=0

  while ans < ms_number:

  x=random.randint(0, 29)

  y=random.randint(0, 15)

  if(vis[x][y]==0):

  vis[x][y]=-1

  ans +=1

  for i in range(0, 30):

  for j in range(0, 16):

  if vis[i][j]==0:

  for k in range(0, 8):

  xx=i + di[k][0]

  yy=j + di[k][1]

  if (0 <=xx < 30) and (0 <=yy < 16) and (vis[xx][yy]==-1):

  vis[i][j] +=1

  def dfs(x, y):

  vv[x][y]=1

  ans=1

  if vis[x][y]==0:

  for k in range(0, 8):

  xx=x + di[k][0]

  yy=y + di[k][1]

  if (0 <=xx < 30) and (0 <=yy < 16) and (vv[xx][yy]==0) and (vis[xx][yy] !=-1):

  ans +=dfs(xx, yy)

  return ans

  Init()

  # 显示(x, y)位置的图片

  def blit_png(num, x, y):

  x=x * 30

  y=y * 30 + 30

  image_png=pygameage.load(num_img[num]).convert_alpha()

  screen.blit(image_png, (x, y))

  # 遍历所有位置

  def display(game_f):

  for i in range(0, 30):

  for j in range(0, 16):

  if vv[i][j] > 0:

  blit_png(vis[i][j], i, j)

  # 标记旗帜

  elif vv[i][j]==-1:

  blit_png(9, i, j)

  # 问号

  elif vv[i][j]==-2:

  blit_png(10, i, j)

  # 如果游戏结束,输出所有地雷

  if (game_f==-1) and (vis[i][j]==-1) and (vv[i][j]==0):

  blit_png(11, i, j)

  while True:

  event=pygame.event.wait()

  if event.type==pygame.QUIT:

  exit()

  # 绘画背景和已确定格子

  screen.blit(background, (0, 0))

  display(gameover)

  # 左上角显示剩余地雷数

  text=fontder("number of mines: %d" % ms_number, 1, (0, 0, 0))

  screen.blit(text, (0, 0))

  if gameover==0:

  if event.type==pygame.MOUSEBUTTONDOWN:

  #定位鼠标按下时候的x,y坐标

  x, y=pygame.mouse.get_pos()

  pressed_array=pygame.mouse.get_pressed()

  if y < 30:

  continue

  xx=x // 30

  yy=(y - 30) // 30

  # 点击鼠标左键

  if pressed_array[0]:

  # 点中地雷

  if vis[xx][yy]==-1 and vv[xx][yy]==0:

  gameover=-1

  continue

  # 相邻8个位置有至少一个雷

  elif vis[xx][yy] >=0:

  grid_number -=dfs(xx, yy)

  # 单击鼠标右键

  elif pressed_array[2]:

  if vv[xx][yy] <=0:

  vv[xx][yy]=(vv[xx][yy] - 1) % -3

  if vv[xx][yy]==-1:

  ms_number -=1

  elif vv[xx][yy]==-2:

  ms_number +=1

  # 游戏胜利

  if grid_number==0:

  gameover=1

  # 游戏胜利

  elif gameover==1:

  text=fontder("Accepted!", 1, (150, 0, 0))

  screen.blit(text, (400, 170))

  # 游戏失败

  elif gameover==-1:

  text=fontder("Sorry, game over...", 1, (0, 0, 0))

  screen.blit(text, (350, 200))

  if (gameover !=0) and (event.type==pygame.MOUSEBUTTONDOWN):

  Init()

  pygame.display.update()

posted @ 2021-12-20 15:39  linjingyg  阅读(393)  评论(0)    收藏  举报