鱼C论坛

 找回密码
 立即注册
查看: 1710|回复: 4

[作品展示] 扫雷源代码

[复制链接]
发表于 2020-11-28 15:07:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 张育玮 于 2020-11-28 18:36 编辑

由于python样式没学好,所以不是很好看,请大家原谅 ^  -  ^

上代码!!!

  1. # author:zwj
  2. # date:2018-1-30
  3. # 扫雷 v1.0

  4. import random
  5. import tkinter

  6. # 创建程序窗口
  7. root = tkinter.Tk()
  8. # 窗口标题
  9. root.title("扫雷v1.0")
  10. # 窗口大小和显示位置
  11. root.geometry('470x425+500+150')

  12. btns = []  # 存储生成的按钮
  13. mines = []  # 存储地雷


  14. # 按钮类
  15. class MyButton(tkinter.Button):
  16.     # 剩余安全按钮的个数
  17.     left = 71

  18.     def __init__(self, obj, string, wid, hei):
  19.         self.flag = True
  20.         # 按钮上显示的字符
  21.         self.strvar = tkinter.StringVar()
  22.         # 调用父类的__init__方法
  23.         super(MyButton, self).__init__(obj, textvariable=self.strvar, width=wid, height=hei, command=self.check)
  24.         self.index = int(string)

  25.     # 设置按钮上要显示的字符
  26.     def settext(self, text):
  27.         self.strvar.set(text)

  28.     # 判断是否为雷
  29.     def check(self):
  30.         # 判断所有安全的按钮是否全部别点击了
  31.         if MyButton.left == 0:
  32.             # 游戏胜利
  33.             win()
  34.         # 判断点击的按钮是否为雷
  35.         else:
  36.             index_x = 0
  37.             if self.index < 10:
  38.                 index_y = self.index - 1
  39.             else:
  40.                 tmp = int(self.index / 9)
  41.                 index_y = self.index - tmp * 9
  42.                 if index_y == 0:
  43.                     index_x = tmp - 1
  44.                     index_y = 8
  45.                 else:
  46.                     index_x = tmp
  47.                     index_y = index_y - 1

  48.             if mines[index_x][index_y] == -99:
  49.                 # 游戏失败,游戏结束
  50.                 gameover()
  51.             # 按钮上显示周围雷的数量
  52.             else:
  53.                 self.strvar.set(str(mines[index_x][index_y]))
  54.                 # 安全按钮的个数减一
  55.                 if self.flag:
  56.                     MyButton.left -= 1
  57.                     self.flag = False


  58. def init(x=9, y=9):
  59.     # 按钮的序号
  60.     count = 1
  61.     for index in range(x):
  62.         for index2 in range(y):
  63.             # 生成新的按钮
  64.             btn = MyButton(root, str(count), 6, 2)
  65.             count += 1
  66.             # 将生成的按钮加入按钮列表中
  67.             btns.append(btn)
  68.     for i in range(x):
  69.         for j in range(y):
  70.             # 按钮布置到窗口中
  71.             btns[i * 9 + j].grid(row=i, column=j)


  72. # 设置雷
  73. def set_mine():
  74.     for rand in range(9):
  75.         # 每个位置的初始值设为0,-99代表雷
  76.         mines.append([0, 0, 0, 0, 0, 0, 0, 0, 0])
  77.     # 随机生成1~81中的十个数,用来设置雷
  78.     random_list = []
  79.     for i in range(10):
  80.         tmp = random.randint(1, 81)
  81.         if tmp not in random_list:
  82.             random_list.append(tmp)
  83.     # 在相应的位置设置-99表示雷
  84.     for each in random_list:
  85.         if each < 10:
  86.             mines[0][each - 1] = -99
  87.         else:
  88.             tmp = int(each / 9)
  89.             index = each - tmp * 9
  90.             if index == 0:
  91.                 mines[tmp - 1][8] = -99
  92.             else:
  93.                 mines[tmp][(each - tmp * 9) - 1] = -99

  94.     # 计算mines[0][0]周围地雷的数量
  95.     if mines[0][0] != -99:
  96.         if mines[0][1] == -99:
  97.             mines[0][0] += 1
  98.         if mines[1][0] == -99:
  99.             mines[0][0] += 1
  100.         if mines[1][1] == -99:
  101.             mines[0][0] += 1

  102.     # 计算mines[0][8]周围地雷的数量
  103.     if mines[0][8] != -99:
  104.         if mines[0][7] == -99:
  105.             mines[0][8] += 1
  106.         if mines[1][7] == -99:
  107.             mines[0][8] += 1
  108.         if mines[1][8] == -99:
  109.             mines[0][8] += 1

  110.     # 计算mines[8][0]周围地雷的数量
  111.     if mines[8][0] != -99:
  112.         if mines[7][0] == -99:
  113.             mines[8][0] += 1
  114.         if mines[7][1] == -99:
  115.             mines[8][0] += 1
  116.         if mines[8][1] == -99:
  117.             mines[8][0] += 1

  118.     # 计算mines[8][8]周围地雷的数量
  119.     if mines[8][8] != -99:
  120.         if mines[7][7] == -99:
  121.             mines[8][8] += 1
  122.         if mines[8][7] == -99:
  123.             mines[8][8] += 1
  124.         if mines[7][8] == -99:
  125.             mines[8][8] += 1

  126.     # 计算上侧按钮附近雷的个数
  127.     for i in range(1, 8):
  128.         if mines[0][i] != -99:
  129.             if mines[0][i - 1] == -99:
  130.                 mines[0][i] += 1
  131.             if mines[0][i + 1] == -99:
  132.                 mines[0][i] += 1
  133.             if mines[1][i - 1] == -99:
  134.                 mines[0][i] += 1
  135.             if mines[1][i] == -99:
  136.                 mines[0][i] += 1
  137.             if mines[1][i + 1] == -99:
  138.                 mines[0][i] += 1

  139.     # 计算下侧按钮附近雷的个数
  140.     for i in range(1, 8):
  141.         if mines[8][i] != -99:
  142.             if mines[8][i - 1] == -99:
  143.                 mines[8][i] += 1
  144.             if mines[8][i + 1] == -99:
  145.                 mines[8][i] += 1
  146.             if mines[7][i - 1] == -99:
  147.                 mines[8][i] += 1
  148.             if mines[7][i] == -99:
  149.                 mines[8][i] += 1
  150.             if mines[7][i + 1] == -99:
  151.                 mines[8][i] += 1

  152.     # 计算左侧按钮附近雷的个数
  153.     for i in range(1, 8):
  154.         if mines[i][0] != -99:
  155.             if mines[i - 1][0] == -99:
  156.                 mines[i][0] += 1
  157.             if mines[i + 1][0] == -99:
  158.                 mines[i][0] += 1
  159.             if mines[i - 1][1] == -99:
  160.                 mines[i][0] += 1
  161.             if mines[i][1] == -99:
  162.                 mines[i][0] += 1
  163.             if mines[i + 1][1] == -99:
  164.                 mines[i][0] += 1

  165.     # 计算右侧按钮附近雷的个数
  166.     for i in range(1, 8):
  167.         if mines[i][8] != -99:
  168.             if mines[i - 1][8] == -99:
  169.                 mines[i][8] += 1
  170.             if mines[i + 1][8] == -99:
  171.                 mines[i][8] += 1
  172.             if mines[i - 1][7] == -99:
  173.                 mines[i][8] += 1
  174.             if mines[i][7] == -99:
  175.                 mines[i][8] += 1
  176.             if mines[i + 1][7] == -99:
  177.                 mines[i][8] += 1

  178.     # 计算中间剩余7x7每个按钮周围的雷数
  179.     for i in range(1, 8):
  180.         for j in range(1, 8):
  181.             if mines[i][j] != -99:
  182.                 if mines[i - 1][j - 1] == -99:
  183.                     mines[i][j] += 1
  184.                 if mines[i + 1][j + 1] == -99:
  185.                     mines[i][j] += 1
  186.                 if mines[i - 1][j] == -99:
  187.                     mines[i][j] += 1
  188.                 if mines[i - 1][j + 1] == -99:
  189.                     mines[i][j] += 1
  190.                 if mines[i][j - 1] == -99:
  191.                     mines[i][j] += 1
  192.                 if mines[i][j + 1] == -99:
  193.                     mines[i][j] += 1
  194.                 if mines[i + 1][j - 1] == -99:
  195.                     mines[i][j] += 1
  196.                 if mines[i + 1][j] == -99:
  197.                     mines[i][j] += 1


  198. # 玩家胜利
  199. def win():
  200.     record = []
  201.     count = 0
  202.     # 找出所有地雷的位置
  203.     for item in mines:
  204.         for each in item:
  205.             if each == -99:
  206.                 record.append(count)
  207.                 count += 1
  208.             else:
  209.                 count += 1
  210.     # 显示所有地雷
  211.     for index in record:
  212.         btns[index]["bg"] = "red"
  213.         btns[index]["fg"] = "yellow"
  214.         btns[index].settext("√")

  215.     # 此时其余按钮不可按下
  216.     for i in range(0, 81):
  217.         if i not in record:
  218.             btns[i].config(state="disabled")


  219. # 游戏失败
  220. def gameover():
  221.     record = []
  222.     count = 0
  223.     for item in mines:
  224.         for each in item:
  225.             if each == -99:
  226.                 record.append(count)
  227.                 count += 1
  228.             else:
  229.                 count += 1

  230.     for index in record:
  231.         btns[index]["fg"] = "red"
  232.         btns[index]["bg"] = "black"
  233.         btns[index].settext("×")

  234.     for i in range(0, 81):
  235.         if i not in record:
  236.             btns[i].config(state="disabled")


  237. # 初始化游戏界面
  238. init()
  239. # 设置地雷
  240. set_mine()
  241. # 窗口时间循环
  242. root.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-28 15:40:24 From FishC Mobile | 显示全部楼层
先来支持一波
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-28 15:51:31 | 显示全部楼层
底纹很影响阅读体验
建议楼主换掉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-28 15:59:57 From FishC Mobile | 显示全部楼层
昨非 发表于 2020-11-28 15:51
底纹很影响阅读体验
建议楼主换掉

好的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-28 19:33:29 | 显示全部楼层
1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-30 22:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表