起初没看老师要求用Pygame写扫雷,后来发现要用tk写,就简单加了一个tk菜单,设置了三个级别难度,希望有所帮助
其中关于tk和pygame的下载仅对于VS
Ctrl+Alt+L打开解决方案资源管理器+右击Python环境+点击查看所有Python环境+下划线换成PYPI搜索pygame或tkinter,点击运行命令:pip install pygame就可以了
可参照下图:
运行截图:
源代码如下:
import sys
import random
import time
from tkinter import *
import tkinter as tk
import tkinter.messagebox
import pygame
SIZE = 20
def do_job():
s='左击方块为雷游戏结束,否则显示相邻8块地雷数,为空相邻无雷\n'+\
'右击方块标记红旗表示有雷,再右击变?,再右击无标记\n'+\
'方块显示为n,相邻8块有n块为雷'+\
'\n标记红旗排除所有雷即胜利。'
tkinter.messagebox.showinfo(title="帮助",message=s)
def create_random_board(row, col, mine_num):
"""
得到一个随机的棋盘
"""
# 随机布雷
nums = [{"opened": False, "opened_num": 0, 'closed_num': "空"} for _ in range(row * col - mine_num)] # 16x30-99 表示的是生成381个0
nums += [{"opened": False, "opened_num": "雷", 'closed_num': "空"} for _ in range(mine_num)] # 99颗地雷
random.shuffle(nums) # 乱序,此时nums是乱的
return [list(x) for x in zip(*[iter(nums)] * col)]
def click_block(x, y, board_list):
"""
检测点击的是哪个方格(即第x行,第y列)
"""
# 计算出点击的空格的行、列
for row, line in enumerate(board_list):
for col, _ in enumerate(line):
if col * SIZE <= x <= (col + 1) * SIZE and (row + 2) * SIZE <= y <= (row + 2 + 1) * SIZE:
print("点击的空格的位置是:", row, col)
return row, col
def left_click_block(row, col, board_list,BLOCK_ROW_NUM ,BLOCK_COL_NUM):
"""
左击空格后的处理
"""
if board_list[row][col].get("opened") is False and board_list[row][col].get("opened_num") != "雷":
# 如果不是雷,那么就计算当前位置数字
mine_num = get_mine_num(row, col, board_list,BLOCK_ROW_NUM,BLOCK_COL_NUM)
print("地雷数:", mine_num)
board_list[row][col]["opened_num"] = mine_num
board_list[row][col]["opened"] = True # 标记为"打开"状态
board_list[row][col]["closed_num"] = "空" # 标记为"未打开时的状态为空格",防止显示剩余雷数错误
if mine_num == 0:
# 如果方格周边没有雷此时,判断是否有连续空位置
set_nums_blank(row, col, board_list,BLOCK_ROW_NUM ,BLOCK_COL_NUM)
elif board_list[row][col].get("opened") is False and