代码有点多
函数式编程
纯原创手打,详细注释,不容易啊,搞了两天
UI有点low,目前还咩有自学到UI美化方面的内容 只会画形状填颜色
写到后面,头大了,有很多坐标索引方面的变量都直接用数字算出来代替了,以后改面向对象编程的时候再慢慢改吧
ps:修改了一个bug 之前定义if count_click==1的时候,t_start=time.time()
导致第一次点击不计时,第二次点击的时候才开始计时
修正之后,应该是定义if count_click==0的时候,t_start=time.time()
然后把这个if 判断放在while True循环内部 ,表示没点击之前,会一直刷新t_start的值,但是不计时,count_click>=1开始计时,且因为此时count_click不等于0,t_start不再刷新,而变成一个固定值 ,用当前时间-t_start,得到的计时显示到窗口上就可以了
原理:
我定义了一个二维列表list_block,这个数组一共有长*宽个元素,每个元素也是一个列表,这个列表里放了4个元素【格子的x坐标,格子的y坐标,格子是否是雷,格子当前的状态】
格子是否是雷:
定义-1是雷,0是空格(即周围8个格子都不是雷),1-8表示不是雷,也不是空格时,周边雷的数量
格子当前的状态:
0-未标记(初始化时的空方块)
1-标记为雷(没有小红旗的图片,就画了一个红色的圆)
2-标记为?
3-表示鼠标左键点开过
扫雷的难点分析:
1.鼠标左键点击,如果点击的格子是个空格(周围8个格子都没有雷),则需要再调用左键点击这8个格子,然后如果这8个格子里有某些格子也是空格,那就要继续调用点开该格子周围的8个格子,就是一个递归的思想了,边界就是点开的格子都不是空格,递归就结束了
2.定义鼠标中键点击 扫描点开周围的非雷的格子
(1)前提是点击的这个格子已经被左击打开过,该格子显示周围雷的数量,这个时候中键才能起作用
(2)对比格子上显示的周围雷的数量和该格子周围被右键标记为雷的数量,如果相等,中键才能起作用
(3) 同时满足上面两个条件的情况下,调用鼠标左击的函数点开该格子周围没有被标记的格子
(4)如果标记错误,点开的格子中有雷,触发游戏失败
# -*- coding: utf-8 -*-
# __/author__by:Kevin_F/__
import random
import time
import pygame
num_w = 30 # 横向格子数
num_h = 16 # 竖向格子数
# 界面初始化
def window_init():
pygame.init()
global window
# 格子尺寸30*30,状态栏高度100,上下左右边界20
window = pygame.display.set_mode((30 * num_w + 20 * 2, 100 + 30 * num_h + 2 * 20))
pygame.display.set_caption('扫雷 by:Kevin_X')
window.fill((128, 138, 135)) # 背景色:冷灰
pygame.draw.rect(window, (192, 192, 192), (0, 0, 30 * num_w + 20 * 2, 100)) # 最上面状态框
for j in range(num_h):
for i in range(num_w):
# 格子坐标
block_x = 20 + i * 30
block_y = 100 + 20 + j * 30
list_block.append([block_x, block_y, 0, 0])
list_block_pos.append((block_x, block_y))
"""
list_temp生成存放每一行中格子的坐标信息
block_x:格子的x坐标
block_y:格子的y坐标 (坐标信息是固定不可修改的,所以用元组表示)
0:定义此格子是否是雷 是雷:-1 不是雷:表示周边相邻非雷格子的数量,先写入默认值为0
0:定义格子的标记状态 0-未标记,即初始值 1-标记是雷 2-标记问号 3-左击点开
"""
pygame.draw.rect(window, (192, 192, 192), (block_x, block_y, 30, 30), 0) # 实心格子
pygame.draw.rect(window, (220, 220, 220), (block_x, block_y, 30, 30), 2) # 格子边线
pygame.display.flip()
# 状态栏 雷剩余数
def bomb_les():
global count_bomb
if count_bomb<0:
count_bomb=0
# 不存在标记雷超过99的可能,因为未标记的状态只有先标记成雷-1,再右键取消标记雷+1
pygame.draw.rect(window,(192,192,192),(0,0,150,100),0)
font_bomb_num=pygame.font.SysFont('Microsoft YaHei',60,bold=True)
bomb_num=font_bomb_num.render(str(count_bomb),True,(255,0,0))
window.blit(bomb_num,(20,10))
pygame.display.update()
# 状态栏 状态显示
def game_stat