【pygame】Python 制作 XP 经典扫雷游戏
本扫雷也不必多说,先看文件格式:
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 经典扫雷游戏相关推荐
- python小游戏源代码pygame_【pygame】Python 制作 XP 经典扫雷游戏(附源码)
importsysimporttimefrom enum importEnumimportpygamefrom pygame.locals import * from mineblock import ...
- 带你用Python制作一个经典小游戏:扫雷
名字:阿玥的小东东 学习:Python.C/C++ 主页链接:阿玥的小东东的博客_CSDN博客-python&&c++高级知识,过年必备,C/C++知识讲解领域博主 目录 游戏界面尺寸 ...
- python简单代码制作小游戏-用Python设计一个经典小游戏
本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...
- java制作扫雷游戏中埋雷的难点_Java 实现经典扫雷游戏
最后一次更新于 2019/07/08 效果演示图 Java 实现经典扫雷游戏 本扫雷游戏有以下功能: 如果点中炸弹会显示炸弹. 玩家左键点击方块能显示该方块周围会出现几个炸弹,如果不存在炸弹的话扫描范 ...
- 如何用python编一个扫雷游戏_用 Python 做一个 Windows 扫雷游戏
原标题:用 Python 做一个 Windows 扫雷游戏 本文代码基于 python3.6 和 pygame1.9.4. Windows XP 上的扫雷是无数80/90后的集体回忆,今天我们就用 P ...
- 【源代码】Python制作的赛车小游戏,逆行飙车
python制作的赛车小游戏,逆行飙车,通过键盘方向键控制 程序运行截图 源代码 import pygame, sys, time, random# pygame 初始化 pygame.init() ...
- Python制作的赛车小游戏源代码,逆行飙车
python制作的赛车小游戏,逆行飙车,通过键盘方向键控制 程序运行截图: 源代码 import pygame, sys, time, random# pygame 初始化 pygame.init() ...
- 用python tkinter组件实现扫雷游戏
首先介绍扫雷游戏规则.扫雷游戏界面是有若干行和列的方块矩阵,用矩阵的行列号定位矩阵中的方块.每个方块都有一些状态,例如有无雷.有无标记等,用一个2维列表记录这些状态,为了和方块矩阵形成对应关系,把矩阵 ...
- python经典小游戏-用Python设计一个经典小游戏:猜大小
码农那点事儿 关注我们,一起学习进步 本文主要介绍如何用Python设计一个经典小游戏:猜大小. 游戏规则: 初始本金是1000元,默认赔率是1倍,赢了,获得一倍金额,输了,扣除1倍金额. 玩家选择下 ...
最新文章
- 图像处理学习三(频域图像增强)
- android ListView中长按背景颜色可见性设置
- C#读取Adams的Shell文件(*.shl)
- java编译器 Javac 编译原理
- java 四种实现延迟加载的方法
- 通过nodejs插入删除MongoDB数据
- java new thread参数_java线程池01-ThreadPoolExecutor构造方法参数的使用规则
- win10怎么共享打印机_共享打印机添加不上怎么办?建议收藏备用
- 大道至简(第六章)读后感
- 蚂蚁技术专家:一篇文章带你学习分布式事务
- java语言情话_程序员的浪漫:用 java 实现每天给对象法发情话
- 计算机专业术语的通俗解释,计算机专业术语解释
- php 操件文件指定编码,(PHP帮助)如果文件中存在特定编号,请执行此操作
- myeclipse以及tomcat乱码解决
- 离线强化学习(Offline RL)系列3: (算法篇) TD3+BC 算法详解与实现(经验篇)
- gb2312 转 unicode 转 utf-8
- 论文分享 Simple Baselines for Human Pose Estimation and Tracking
- 建模思路|彩色C4D人物元素设计灵感
- 机器视觉光源的分类及各种光源的特点
- 一个二维表查询的实现