本扫雷也不必多说,先看文件格式:

main.py
Saolei

_pycache_

mineblock.py

mineblock.cpython-39.pyc

resources 文章结尾有素材

再看截图:

之后就是上代码了:

main.py

"""
工作室:凌天
作者:M一个劲
日期:2021年8月30日
时间:20:52:35
"""
import sys
import time
import pygame
from pygame.locals import *
from SaoLei.mineblock import  *
n = input("输入 1 开始游戏\n输入 其他键 帮助:")
if n != "1":input("""左键单击:挖掘
右键单击:插旗
右键双击:不确定是不是雷
右键单击后想回到原始状态:右键双击
右键双击后想回到原始状态:右键单击
右键单击后想变成不确定是不是雷的状态:右键单击
看完回车""")
# 游戏屏幕的宽
SCREEN_WIDTH = BLOCK_WIDTH * SIZE
# 游戏屏幕的高
SCREEN_HEIGHT = (BLOCK_HEIGHT + 2) * SIZEclass GameStatus(Enum):readied = 1,started = 2,over = 3,win = 4def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)):imgText = font.render(text, True, fcolor)screen.blit(imgText, (x, y))def main():pygame.init()screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))pygame.display.set_caption('扫雷')font1 = pygame.font.Font("freesansbold.ttf", SIZE * 2)  # 得分的字体fwidth, fheight = font1.size('999')red = (200, 40, 40)# 加载资源图片,因为资源文件大小不一,所以做了统一的缩放处理img0 = pygame.image.load('resources/0.gif').convert()img0 = pygame.transform.smoothscale(img0, (SIZE, SIZE))img1 = pygame.image.load('resources/1.gif').convert()img1 = pygame.transform.smoothscale(img1, (SIZE, SIZE))img2 = pygame.image.load('resources/2.gif').convert()img2 = pygame.transform.smoothscale(img2, (SIZE, SIZE))img3 = pygame.image.load('resources/3.gif').convert()img3 = pygame.transform.smoothscale(img3, (SIZE, SIZE))img4 = pygame.image.load('resources/4.gif').convert()img4 = pygame.transform.smoothscale(img4, (SIZE, SIZE))img5 = pygame.image.load('resources/5.gif').convert()img5 = pygame.transform.smoothscale(img5, (SIZE, SIZE))img6 = pygame.image.load('resources/6.gif').convert()img6 = pygame.transform.smoothscale(img6, (SIZE, SIZE))img7 = pygame.image.load('resources/7.gif').convert()img7 = pygame.transform.smoothscale(img7, (SIZE, SIZE))img8 = pygame.image.load('resources/8.gif').convert()img8 = pygame.transform.smoothscale(img8, (SIZE, SIZE))img_blank = pygame.image.load('resources/blank1.gif').convert()img_blank = pygame.transform.smoothscale(img_blank, (SIZE, SIZE))img_flag = pygame.image.load('resources/flag.gif').convert()img_flag = pygame.transform.smoothscale(img_flag, (SIZE, SIZE))img_ask = pygame.image.load('resources/ask.gif').convert()img_ask = pygame.transform.smoothscale(img_ask, (SIZE, SIZE))img_mine = pygame.image.load('resources/mine.gif').convert()img_mine = pygame.transform.smoothscale(img_mine, (SIZE, SIZE))img_blood = pygame.image.load('resources/blood.gif').convert()img_blood = pygame.transform.smoothscale(img_blood, (SIZE, SIZE))img_error = pygame.image.load('resources/error.gif').convert()img_error = pygame.transform.smoothscale(img_error, (SIZE, SIZE))face_size = int(SIZE * 1.25)img_face_fail = pygame.image.load('resources/Ooo.gif').convert()img_face_fail = pygame.transform.smoothscale(img_face_fail, (face_size, face_size))img_face_normal = pygame.image.load('resources/Ooo.gif').convert()img_face_normal = pygame.transform.smoothscale(img_face_normal, (face_size, face_size))img_face_success = pygame.image.load('resources/smile.gif').convert()img_face_success = pygame.transform.smoothscale(img_face_success, (face_size, face_size))face_pos_x = (SCREEN_WIDTH - face_size) // 2face_pos_y = (SIZE * 2 - face_size) // 2img_dict = {0: img0,1: img1,2: img2,3: img3,4: img4,5: img5,6: img6,7: img7,8: img8}bgcolor = (225, 225, 225)   # 背景色block = MineBlock()game_status = GameStatus.readiedstart_time = None   # 开始时间elapsed_time = 0    # 耗时while True:# 填充背景色screen.fill(bgcolor)for event in pygame.event.get():if event.type == QUIT:sys.exit()elif event.type == MOUSEBUTTONDOWN:mouse_x, mouse_y = event.posx = mouse_x // SIZEy = mouse_y // SIZE - 2b1, b2, b3 = pygame.mouse.get_pressed()if game_status == GameStatus.started:# 鼠标左右键同时按下,如果已经标记了所有雷,则打开周围一圈# 如果还未标记完所有雷,则有一个周围一圈被同时按下的效果if b1 and b3:mine = block.getmine(x, y)if mine.status == BlockStatus.opened:if not block.double_mouse_button_down(x, y):game_status = GameStatus.overelif event.type == MOUSEBUTTONUP:if y < 0:if face_pos_x <= mouse_x <= face_pos_x + face_size \and face_pos_y <= mouse_y <= face_pos_y + face_size:game_status = GameStatus.readiedblock = MineBlock()start_time = time.time()elapsed_time = 0continueif game_status == GameStatus.readied:game_status = GameStatus.startedstart_time = time.time()elapsed_time = 0if game_status == GameStatus.started:mine = block.getmine(x, y)if b1 and not b3:       # 按鼠标左键if mine.status == BlockStatus.normal:if not block.open_mine(x, y):game_status = GameStatus.overelif not b1 and b3:     # 按鼠标右键if mine.status == BlockStatus.normal:mine.status = BlockStatus.flagelif mine.status == BlockStatus.flag:mine.status = BlockStatus.askelif mine.status == BlockStatus.ask:mine.status = BlockStatus.normalelif b1 and b3:if mine.status == BlockStatus.double:block.double_mouse_button_up(x, y)flag_count = 0opened_count = 0for row in block.block:for mine in row:pos = (mine.x * SIZE, (mine.y + 2) * SIZE)if mine.status == BlockStatus.opened:screen.blit(img_dict[mine.around_mine_count], pos)opened_count += 1elif mine.status == BlockStatus.double:screen.blit(img_dict[mine.around_mine_count], pos)elif mine.status == BlockStatus.bomb:screen.blit(img_blood, pos)elif mine.status == BlockStatus.flag:screen.blit(img_flag, pos)flag_count += 1elif mine.status == BlockStatus.ask:screen.blit(img_ask, pos)elif mine.status == BlockStatus.hint:screen.blit(img0, pos)elif game_status == GameStatus.over and mine.value:screen.blit(img_mine, pos)elif mine.value == 0 and mine.status == BlockStatus.flag:screen.blit(img_error, pos)elif mine.status == BlockStatus.normal:screen.blit(img_blank, pos)print_text(screen, font1, 30, (SIZE * 2 - fheight) // 2 - 2, '%02d' % (MINE_COUNT - flag_count), red)if game_status == GameStatus.started:elapsed_time = int(time.time() - start_time)print_text(screen, font1, SCREEN_WIDTH - fwidth - 30, (SIZE * 2 - fheight) // 2 - 2, '%03d' % elapsed_time, red)if flag_count + opened_count == BLOCK_WIDTH * BLOCK_HEIGHT:game_status = GameStatus.winif game_status == GameStatus.over:screen.blit(img_face_fail, (face_pos_x, face_pos_y))elif game_status == GameStatus.win:screen.blit(img_face_success, (face_pos_x, face_pos_y))else:screen.blit(img_face_normal, (face_pos_x, face_pos_y))pygame.display.update()if __name__ == '__main__':main()

首先,如何表示雷和非雷,一开始想的是,建立一个二维数组表示整个区域,0表示非地雷,1表示地雷。后来一想不对,还有标记为地雷,标记为问号,还有表示周边雷数的数字,好多状态,干脆就做个类吧。

布雷就很简单了,随机取99个数,从上往下顺序排就是了。

我们点击一个格子的时候,只要根据点击的坐标,找到对应的 Mine,看它的值是多少,就知道有没有踩中雷了。

如果没踩中雷的话,要计算周边8个位置中有几个雷,以便显示对应的数字。

如果周边有雷,那么显示数字,这个简单,可是如果周边没有雷,那就要显示一片区域,直到有雷出现,如下图,我只点了当中一下,就出现了那么大一片区域。

这个计算其实也容易,只要用递归就可以了,如果计算出周围的雷数为0,则递归计算周边8个位置的四周雷数,直到雷数不为0。

接下来还有一个麻烦的地方,我们经常鼠标左右键同时按下,如果雷被全部标记,则会一下子打开周围所有的格子,如果其中有标记错的,那么不好意思,GAME OVER。

如果没有全标记完,会有一个效果显示周围一圈未被打开和标记的格子。

剩下的就是SaoLei文件了

网盘下载:

链接: https://pan.baidu.com/s/1a_oBB8SvYJ6ocnRgsT8GUg

提取码进群领取

以后我会定时更新群二维码,通过第一批二维码进群的可称为内测,限50名

第一批群二维码:

【pygame】Python 制作 XP 经典扫雷游戏相关推荐

  1. python小游戏源代码pygame_【pygame】Python 制作 XP 经典扫雷游戏(附源码)

    importsysimporttimefrom enum importEnumimportpygamefrom pygame.locals import * from mineblock import ...

  2. 带你用Python制作一个经典小游戏:扫雷

    名字:阿玥的小东东 学习:Python.C/C++ 主页链接:阿玥的小东东的博客_CSDN博客-python&&c++高级知识,过年必备,C/C++知识讲解领域博主 目录 游戏界面尺寸 ...

  3. python简单代码制作小游戏-用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  4. java制作扫雷游戏中埋雷的难点_Java 实现经典扫雷游戏

    最后一次更新于 2019/07/08 效果演示图 Java 实现经典扫雷游戏 本扫雷游戏有以下功能: 如果点中炸弹会显示炸弹. 玩家左键点击方块能显示该方块周围会出现几个炸弹,如果不存在炸弹的话扫描范 ...

  5. 如何用python编一个扫雷游戏_用 Python 做一个 Windows 扫雷游戏

    原标题:用 Python 做一个 Windows 扫雷游戏 本文代码基于 python3.6 和 pygame1.9.4. Windows XP 上的扫雷是无数80/90后的集体回忆,今天我们就用 P ...

  6. 【源代码】Python制作的赛车小游戏,逆行飙车

    python制作的赛车小游戏,逆行飙车,通过键盘方向键控制 程序运行截图 源代码 import pygame, sys, time, random# pygame 初始化 pygame.init() ...

  7. Python制作的赛车小游戏源代码,逆行飙车

    python制作的赛车小游戏,逆行飙车,通过键盘方向键控制 程序运行截图: 源代码 import pygame, sys, time, random# pygame 初始化 pygame.init() ...

  8. 用python tkinter组件实现扫雷游戏

    首先介绍扫雷游戏规则.扫雷游戏界面是有若干行和列的方块矩阵,用矩阵的行列号定位矩阵中的方块.每个方块都有一些状态,例如有无雷.有无标记等,用一个2维列表记录这些状态,为了和方块矩阵形成对应关系,把矩阵 ...

  9. python经典小游戏-用Python设计一个经典小游戏:猜大小

    码农那点事儿 关注我们,一起学习进步 本文主要介绍如何用Python设计一个经典小游戏:猜大小. 游戏规则: 初始本金是1000元,默认赔率是1倍,赢了,获得一倍金额,输了,扣除1倍金额. 玩家选择下 ...

最新文章

  1. 图像处理学习三(频域图像增强)
  2. android ListView中长按背景颜色可见性设置
  3. C#读取Adams的Shell文件(*.shl)
  4. java编译器 Javac 编译原理
  5. java 四种实现延迟加载的方法
  6. 通过nodejs插入删除MongoDB数据
  7. java new thread参数_java线程池01-ThreadPoolExecutor构造方法参数的使用规则
  8. win10怎么共享打印机_共享打印机添加不上怎么办?建议收藏备用
  9. 大道至简(第六章)读后感
  10. 蚂蚁技术专家:一篇文章带你学习分布式事务
  11. java语言情话_程序员的浪漫:用 java 实现每天给对象法发情话
  12. 计算机专业术语的通俗解释,计算机专业术语解释
  13. php 操件文件指定编码,(PHP帮助)如果文件中存在特定编号,请执行此操作
  14. myeclipse以及tomcat乱码解决
  15. 离线强化学习(Offline RL)系列3: (算法篇) TD3+BC 算法详解与实现(经验篇)
  16. gb2312 转 unicode 转 utf-8
  17. 论文分享 Simple Baselines for Human Pose Estimation and Tracking
  18. 建模思路|彩色C4D人物元素设计灵感
  19. 机器视觉光源的分类及各种光源的特点
  20. 一个二维表查询的实现

热门文章

  1. glibc,libc,glib简介
  2. iOS录音和音频播放
  3. 【解决】农行在win7中不能支付解决办法
  4. js判断isNumber(obj)
  5. JPG转PDF转换器免费下载
  6. STM32L1系列I2C读取mpu9250数据
  7. 计算机网络FMD是什么,计算机网络中的数据交换
  8. Lucene安装及入门
  9. 内行看门道,外行看热闹,阿里 P8 大能离职带出内网专属“高并发系统设计”学习笔记,涨薪跳槽 10k 不成问题吧?
  10. 如何在linux系统安装igh,Linux下IGH Ethercat Master安装