python 扫雷游戏

  • 前言
  • 开始
    • 献上代码
    • 代码剖析
    • 项目github
      • 作者

前言

又不知道该干啥了。。。。。。

开始

献上代码

from tkinter.messagebox import showinfo
from pygame.locals import *
import tkinter as tk
import random
import pygame
base = tk.Tk()
base.withdraw()
pygame.init()
WIDTH = 10
HEIGHT = 10
def generate(w,h):res = []for i in range(h):ls = []for j in range(w):ls.append(False)res.append(ls)bomb_total = random.randint(1,w * h // 4)for i in range(bomb_total):x = random.randint(0,w - 1)y = random.randint(0,h - 1)res[x][y] = Truereturn res
def show(surf,vals):font = pygame.font.Font('songti SC.TTF',100)for i in range(len(vals)):for j in range(len(vals[i])):x1,y1,x2,y2 = i * 50,j * 50,i * 50 + 50,j * 50 + 50rect = pygame.Rect((x1,y1,x2,y2))if(vals[i][j] == None):t = font.render(' ',True,(0,0,0),(255,255,255))else:t = font.render(str(vals[i][j]),True,(0,0,0),(255,255,255))t = pygame.transform.scale(t,(50,50))surf.blit(t,(50 * i,50 * j))pygame.draw.rect(surf,(0,0,0),rect,2)
def judge(vals,puzzle):for i in range(len(vals)):for j in range(len(vals[i])):if(vals[i][j] == None or (vals[i][j] == '!' and (not puzzle[j][i]))):return Falsereturn True
def sweep(display,puzzle,x,y,w,h):dir = [(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)]def _sweep(display,puzzle,x,y,w,h):dir = [(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)]display[x][y] = 0for dx,dy in dir:tx,ty = x + dx,y + dyif(tx in range(h) and ty in range(w) and \puzzle[ty][tx]):display[x][y] += 1return displayif(display[x][y] not in (None,'!') or puzzle[y][x]):return displaydisplay = _sweep(display,puzzle,x,y,w,h)if(display[x][y] == 0):for dx,dy in dir:tx,ty = x + dx,y + dyif(tx in range(h) and ty in range(w)):display = sweep(display,puzzle,tx,ty,w,h)return display
def main():src = pygame.display.set_mode((50 * WIDTH,50 * HEIGHT))puzzle = generate(WIDTH,HEIGHT)display = []for i in range(HEIGHT):ls = []for j in range(WIDTH):ls.append(None)display.append(ls)while(1):pygame.display.update()src.fill((255,255,255))show(src,display)if(judge(display,puzzle)):pygame.display.update()showinfo('Congratulations!','Congratulations!You\'ve done it!')exit()for ev in pygame.event.get():if(ev.type == QUIT):exit()elif(ev.type == MOUSEBUTTONDOWN):x = ev.pos[0] // 50y = ev.pos[1] // 50if(ev.button == 3):if(display[x][y] == '!'):display[x][y] = Noneelse:display[x][y] = '!'else:if(puzzle[y][x]):showinfo('Failed','You click a BOMB!')exit()else:display = sweep(display,puzzle,x,y,WIDTH,HEIGHT)
if(__name__ == '__main__'):main()

代码剖析

from tkinter.messagebox import showinfo
from pygame.locals import *
import tkinter as tk
import random
import pygame
base = tk.Tk()
base.withdraw()
pygame.init()
WIDTH = 10
HEIGHT = 10

导入库及初始化,其中变量WIDTHHEIGHT为方格的长和宽。

def generate(w,h):res = []for i in range(h):ls = []for j in range(w):ls.append(False)res.append(ls)bomb_total = random.randint(1,w * h // 4)for i in range(bomb_total):x = random.randint(0,w - 1)y = random.randint(0,h - 1)res[x][y] = Truereturn res

随机生成地雷,其中

bomb_total = random.randint(1,w * h // 4)

中的

  • 1可以更改成任意小于等于方格数的数字,表示地雷的最小个数
  • w * h // 4可以更改为任意小于等于方格数的数字,表示地雷的最大个数
def show(surf,vals):font = pygame.font.Font('songti SC.TTF',100)for i in range(len(vals)):for j in range(len(vals[i])):x1,y1,x2,y2 = i * 50,j * 50,i * 50 + 50,j * 50 + 50rect = pygame.Rect((x1,y1,x2,y2))if(vals[i][j] == None):t = font.render(' ',True,(0,0,0),(255,255,255))else:t = font.render(str(vals[i][j]),True,(0,0,0),(255,255,255))t = pygame.transform.scale(t,(50,50))surf.blit(t,(50 * i,50 * j))pygame.draw.rect(surf,(0,0,0),rect,2)

这里与2048游戏中我使用的代码类似,其中增加的三行代码以及更改的几个数字的解释如下:

增加的几行为

         x1,y1,x2,y2 = i * 50,j * 50,i * 50 + 50,j * 50 + 50rect = pygame.Rect((x1,y1,x2,y2))// ......pygame.draw.rect(surf,(0,0,0),rect,2)

解释如下:

  • 第一行,定义画矩形的位置。(x1,y1)为第一组坐标,左上角。(x2,y2)为第二组坐标,右下角。示意图如下:
  • 第二行,根据两组坐标确定一个 pygame.Rect位置描述对象
  • 第三行,根据第二行产生的位置描述对象画一个矩形

这样重复,就可以产生一个网格

更改的整数表示字符大小,尽量不要随意改变。

def judge(vals,puzzle):for i in range(len(vals)):for j in range(len(vals[i])):if(vals[i][j] == None or (vals[i][j] == '!' and (not puzzle[j][i]))):return Falsereturn True

判断游戏是否成功

这里认为满足如下两点的所有状态都可以认为游戏成功:

  1. 没有空格
  2. 所有!背后都是炸弹
def sweep(display,puzzle,x,y,w,h):dir = [(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)]def _sweep(display,puzzle,x,y,w,h):dir = [(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)]display[x][y] = 0for dx,dy in dir:tx,ty = x + dx,y + dyif(tx in range(h) and ty in range(w) and \puzzle[ty][tx]):display[x][y] += 1return displayif(display[x][y] not in (None,'!') or puzzle[y][x]):return displaydisplay = _sweep(display,puzzle,x,y,w,h)if(display[x][y] == 0):for dx,dy in dir:tx,ty = x + dx,y + dyif(tx in range(h) and ty in range(w)):display = sweep(display,puzzle,tx,ty,w,h)return display

使用类似深度优先搜索的方式实现点击效果
至于深度优先搜索是啥算法,出门左转百度

def main():src = pygame.display.set_mode((50 * WIDTH,50 * HEIGHT))puzzle = generate(WIDTH,HEIGHT)display = []for i in range(HEIGHT):ls = []for j in range(WIDTH):ls.append(None)display.append(ls)while(1):pygame.display.update()src.fill((255,255,255))show(src,display)if(judge(display,puzzle)):pygame.display.update()showinfo('Congratulations!','Congratulations!You\'ve done it!')exit()for ev in pygame.event.get():if(ev.type == QUIT):exit()elif(ev.type == MOUSEBUTTONDOWN):x = ev.pos[0] // 50y = ev.pos[1] // 50if(ev.button == 3):if(display[x][y] == '!'):display[x][y] = Noneelse:display[x][y] = '!'else:if(puzzle[y][x]):showinfo('Failed','You click a BOMB!')exit()else:display = sweep(display,puzzle,x,y,WIDTH,HEIGHT)

这里分开剖析

def main():src = pygame.display.set_mode((50 * WIDTH,50 * HEIGHT))puzzle = generate(WIDTH,HEIGHT)display = []for i in range(HEIGHT):ls = []for j in range(WIDTH):ls.append(None)display.append(ls)

初始化变量:

  • src为窗口对象
  • puzzle为炸弹的分布情况
  • display为显示情况
 while(1):pygame.display.update()src.fill((255,255,255))show(src,display)if(judge(display,puzzle)):pygame.display.update()showinfo('Congratulations!','Congratulations!You\'ve done it!')exit()

刷新窗口,判断游戏结束

     for ev in pygame.event.get():if(ev.type == QUIT):exit()

事件循环开始,判断关闭窗口事件

         elif(ev.type == MOUSEBUTTONDOWN):x = ev.pos[0] // 50y = ev.pos[1] // 50if(ev.button == 3):if(display[x][y] == '!'):display[x][y] = Noneelse:display[x][y] = '!'

判断右键键标记炸弹

             else:if(puzzle[y][x]):showinfo('Failed','You click a BOMB!')exit()else:display = sweep(display,puzzle,x,y,WIDTH,HEIGHT)

判断左键展示数字,踩雷扫雷结束游戏

if(__name__ == '__main__'):main()

运行游戏

项目github

项目github

作者

hit-road

拜拜,下课!

hit-road不定期跟新,不见不散!

python 扫雷游戏相关推荐

  1. python扫雷游戏课程设计小组任务计划与分配表_Python开源扫雷游戏由网瘾少年制作,转手后月入18K,附赠所有源文件...

    原标题:Python开源扫雷游戏由网瘾少年制作,转手后月入18K,附赠所有源文件 最近入手一款Python扫雷游戏,迫不及待的打开源文件试玩几次之后,颇感惭愧-惭愧这么经典的游戏居然不是由我这种&qu ...

  2. Python扫雷游戏源代码及图片素材

    Python扫雷游戏源代码.源程序共有两个文件及一个资源包:main.py及mineblock.py,资源包请前往百度网盘下载, https://pan.baidu.com/s/1u-qsJhAaCJ ...

  3. Python扫雷游戏代码

    这是一个 Python 扫雷游戏的示例代码: ``` 导入需要的库 import random import tkinter as tk 定义常量 SIZE = 400 GRID_LEN = 4 GR ...

  4. python扫雷游戏_python实现扫雷小游戏

    前面我们用python实现了贪吃蛇.坦克大战.飞船大战.五子棋等游戏 今天我们用python来实现一下扫雷游戏 本游戏代码量和源文件较多 可以从我的GitHub地址中获取 构建地雷区 import r ...

  5. python扫雷游戏课程设计小组任务计划与分配表_python实现扫雷游戏

    本文为大家分享了python实现扫雷游戏的具体代码,供大家参考,具体内容如下 本文实例借鉴mvc模式,核心数据为model,维护1个矩阵,0表无雷,1表雷,-1表已经检测过. 本例使用python的t ...

  6. python扫雷游戏实验分析_用python写扫雷游戏实例代码分享

    扫雷是一个非常经典的WIN游戏,我们教给大家用python语言来写出这个游戏,以下是全部实例代码: #!/usr/bin/python #coding:utf-8 #python 写的扫雷游戏 imp ...

  7. python扫雷游戏实验分析_529. 扫雷游戏(Python)

    题目 难度:★★★☆☆ 类型:二维数组 方法:深度优先搜索 力扣链接请移步本题传送门 更多力扣中等题的解决方案请移步力扣中等题目录 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵. 'M' ...

  8. python扫雷游戏代码_python实现扫雷游戏的示例

    扫雷是一款益智类小游戏,最早于 1992 年由微软在 Windows 上发行,游戏适合于全年龄段,规则简单,即在最短的时间内找出所有非雷格子且在中间过程中不能踩到雷, 踩到雷则失败,需重新开始. 本文 ...

  9. Python 扫雷游戏 完整源代码+图片素材

    代码的下载地址 截图 设计需求 基础功能 实现windows扫雷游戏初级的所有功能 扫雷尺寸99 方格 每个方格尺寸3030 游戏初始化时,随机分布10个地雷 当左键点击雷区任意方格时,则游戏开始 鼠 ...

最新文章

  1. Glusterfs 分布式存储安装部署
  2. 【数据挖掘】卷积神经网络 ( 池化 | 丢弃 | 批量规范化 | 卷积神经网络完整流程示例 | 卷积 | 池化 | 全连接 | 输出 | 卷积神经网络总结 )
  3. Fragment 的生命周期
  4. 孔子绝粮于陈蔡子贡孔子问答节选(白话)
  5. python 创建目录时间_在目录中创建带有日期时间名称和子文件的dir(Python)
  6. linux kernel defconfig和.config
  7. vue项目接口地址暴露_vue组件暴露和.js文件暴露接口操作
  8. 高效算法之动态规划(第15章)
  9. Word2Vec训练同义词模型
  10. 计算机大学生个人特长范文,计算机大学生个人简历范文
  11. Atitit.获得向上向下左的右的邻居的方法 软键盘的设计..
  12. 128道软件测试面试题,面试及答案,视频讲解
  13. 电路交换、报文交换、分组交换的特点和比较
  14. 台式计算机操作系统的安装,Win10X电脑操作系统可以装在台式机吗?
  15. python开发的军棋自动裁判软件
  16. 【ROS基础】ROS_c++ 语法记录
  17. 浅析国内指纹识别技术(附带小工具)
  18. #发现你#小说的交互——交互故事性
  19. 插入排序(Insertion Sort)
  20. web端登录需要验证码-python获取验证码数值

热门文章

  1. 一文详解4D Radar成像原理及其应用优势
  2. 机械行业ERP选型的两大原则
  3. 【电子杂志制作免费软件】云展网教程 | 如何上传PDF文档创建电子杂志?
  4. vivo手机光环助手下载游戏怎么打不开_全新5G自拍手机,vivo S6系列正式发布
  5. 能保存你之前复制的所有文字的软件,剪贴板工具
  6. [雕刻机笔记001]安川伺服单元SDGH+NS115+控制卡MP2101M的初始化连接
  7. 磁盘碎片以及磁盘碎片整理程序
  8. 数据采集研究背景和意义?
  9. 中国物联网产业将迎大爆发
  10. 菜鸟教程Cpp学习笔记