位置: IT常识 - 正文

PyGame做了一个扫雷(pygame编程)

编辑:rootadmin
1 # 这是一个示例 Python 脚本。 2 3 # 按 ⌃R 执行或将其替换为您的代码。 4 # 按 双击 ⇧ 在所有地方搜索类、文件、工具窗口、操作和设置。 5 import sys 6 import pygame 7 import random 8 9 game = None 10 BOMB ... 1 # 这是一个示例 Python 脚本。 2 3 # 按 ⌃R 执行或将其替换为您的代码。 4 # 按 双击 ⇧ 在所有地方搜索类、文件、工具窗口、操作和设置。 5 import sys 6 import pygame 7 import random 8 9 game = None 10 BOMB_COUNT = 1 11 12 # 空间 13 class Button(object): 14 pass 15 16 class Game(object): 17 screen = None 18 row_count = 0 19 bomb_location = [] 20 squares_list = [] 21 squares_val_dict = {} 22 win = False 23 24 def __init__(self, count): 25 pygame.init() 26 total_width = count * 18 + 100 * 2 27 total_height = count * 18 + 100 * 2 28 self.row_count = count 29 self.screen = pygame.display.set_mode((total_width, total_height)) 30 self.win = False 31 self.bomb_location = [] 32 self.squares_list = [] 33 self.squares_val_dict = {} 34 35 def __del__(self): 36 print('del game') 37 pygame.display.quit() 38 39 def is_over(self): 40 return self.win 41 42 def get_screen(self): 43 return self.screen 44 45 def random_bomb(self): 46 # 随机产生炸弹 47 for i in range(BOMB_COUNT): 48 while 1: 49 x = random.randint(0, 29) 50 y = random.randint(0, 29) 51 if (x, y) in self.bomb_location: 52 continue 53 else: 54 self.bomb_location.append((x, y)) 55 break 56 57 # 计算某个位置范围的数字 58 for x in range(self.row_count): 59 for y in range(self.row_count): 60 count = 0 61 if (x - 1, y) in self.bomb_location: 62 count += 1 63 if (x - 1, y - 1) in self.bomb_location: 64 count += 1 65 if (x - 1, y + 1) in self.bomb_location: 66 count += 1 67 68 if (x , y - 1) in self.bomb_location: 69 count += 1 70 if (x , y) in self.bomb_location: 71 count += 1 72 if (x , y + 1) in self.bomb_location: 73 count += 1 74 75 if (x + 1 , y - 1) in self.bomb_location: 76 count += 1 77 if (x + 1 , y) in self.bomb_location: 78 count += 1 79 if (x + 1, y + 1) in self.bomb_location: 80 count += 1 81 82 # print('%s,%s %d' % (x, y, count)) 83 self.squares_val_dict[(x, y)] = count 84 85 def init_square(self): 86 for i in range(self.row_count): 87 self.squares_list.append([]) 88 top = 100 + i * 18 89 for j in range(self.row_count): 90 left = 100 + j * 18 91 width = 18 92 height = 18 93 exist = False 94 if (i, j) in self.bomb_location: 95 # print('%s,%s exists' % (j, i)) 96 exist = True 97 98 # 周围的炸弹数量 99 around_count = self.squares_val_dict.get((i, j), 0)100 # print('init square %s,%s %d' % (i, j, around_count))101 self.squares_list[i].append(Square(exist, around_count, self.screen, left, top, width, height))102 self.squares_list[i][j].draw()103 pygame.display.update()104 105 def start_game(self):106 pass107 108 def display_win(self):109 font = pygame.font.SysFont("Andale Mono", 32)110 txt = font.render("Winner Winner Winner", True, 'Red')111 self.get_screen().blit(txt, (200, 0))112 113 font = pygame.font.SysFont("Andale Mono", 16)114 txt = font.render("uploading to dashboard...", True, 'green')115 self.get_screen().blit(txt, (260, 40))116 117 font = pygame.font.SysFont("Andale Mono", 16)118 txt = font.render("click to continue...", True, 'gray')119 self.get_screen().blit(txt, (280, 60))120 121 self.win = True122 123 def display_flag(self):124 for (x, y) in self.bomb_location:125 square = self.squares_list[x][y]126 square.right_click()127 square.draw()128 129 # 根据所有的旗帜来判断胜利130 def check_win_by_flag(self):131 for (x, y) in self.bomb_location:132 square = self.squares_list[x][y]133 if square.state == 'flag' and square.exist:134 continue135 return False136 self.display_win()137 return True138 139 # 根据已经没有格子点击了来判断胜利140 def check_win_by_click(self):141 # print('check by click')142 for x in range(self.row_count):143 for y in range(self.row_count):144 square = self.squares_list[x][y]145 if square.state == 'blank' or square.exist:146 # print(1)147 continue148 return False149 self.display_flag()150 self.display_win()151 return True152 153 def right_clicked(self, pos):154 left = pos[0]155 top = pos[1]156 x = int((top - 100) / 18)157 y = int((left - 100) / 18)158 159 # print('right clicked %s, %s' % (x, y))160 if x in range(0, self.row_count) and y in range(0, self.row_count):161 square = self.squares_list[x][y]162 if not square.right_click():163 return164 # 表示右键生效165 square.draw()166 167 if square.state == 'flag' and square.exist:168 # 只有当前标记是正确的时候才判断169 # 判断是否已经将所有的炸弹标记出来170 self.check_win_by_flag()171 pygame.display.update()172 173 def clicked(self, pos):174 left = pos[0]175 top = pos[1]176 x = int((top - 100) / 18)177 y = int((left - 100) / 18)178 179 def click_square(self, x, y):180 if x not in range(0, self.row_count) or y not in range(0, self.row_count):181 return False182 183 square = self.squares_list[x][y]184 if square.state != 'new':185 return False186 187 if not square.click():188 return False189 190 square.draw()191 if square.around_count == 0:192 # print('around is 0')193 for (x1, y1) in [194 (x - 1, y), (x - 1, y - 1), (x - 1, y + 1),195 (x, y - 1), (x, y), (x, y + 1),196 (x + 1, y - 1), (x + 1, y), (x + 1, y + 1),197 198 ]:199 click_square(self, x1, y1)200 return True201 202 if x in range(0, self.row_count) and y in range(0, self.row_count):203 if click_square(self, x, y):204 # 判断是否成功205 self.check_win_by_click()206 pygame.display.update()207 208 def refresh(self):209 pygame.display.update()210 211 212 class Square(object):213 exist = False214 surface = None215 rect = None216 state = '' # new, blank, flag, bomed217 face = None218 around_count = 0219 220 def __init__(self, exist, around_count, surface, left, top, width, height):221 self.rect = pygame.Rect(left, top, width, height)222 self.exist = exist223 self.surface = surface224 self.state = 'new'225 self.around_count = around_count226 # print('%s' % (self.around_count))227 228 def exists(self):229 return self.exist230 231 def draw(self):232 global game233 if self.state == 'new':234 self.face = pygame.Surface((self.rect.width, self.rect.height))235 self.face.fill('white')236 game.get_screen().blit(self.face, (self.rect.left, self.rect.top))237 pygame.draw.rect(self.surface, 'gray', self.rect, 1)238 239 elif self.state == 'blank':240 self.face.fill('gray')241 game.get_screen().blit(self.face, (self.rect.left, self.rect.top))242 pygame.draw.rect(self.surface, 'white', self.rect, 1)243 244 # 在格子中间画上数字245 font = pygame.font.SysFont("Andale Mono", 16)246 txt = font.render("%s" % (self.around_count if self.around_count > 0 else ''), True, 'blue')247 # print('%s, %s' % (txt.get_rect(), self.around_count))248 game.get_screen().blit(txt, (self.rect.left + 4, self.rect.top))249 250 pass251 elif self.state == 'flag':252 # 在格子中间画上 F253 font = pygame.font.SysFont("Andale Mono", 16)254 txt = font.render("F", True, 'green')255 # print('%s, %s' % (txt.get_rect(), self.around_count))256 game.get_screen().blit(txt, (self.rect.left + 4, self.rect.top))257 258 elif self.state == 'boom':259 self.face.fill('red')260 game.get_screen().blit(self.face, (self.rect.left, self.rect.top))261 pygame.draw.rect(self.surface, 'white', self.rect, 1)262 pass263 264 def click(self):265 need_update = False266 if self.state == 'new':267 if self.exist:268 self.state = 'boom'269 need_update = True270 else:271 self.state = 'blank'272 need_update = True273 return need_update274 275 def right_click(self):276 need_update = False277 if self.state == 'new':278 self.state = 'flag'279 need_update = True280 elif self.state == 'flag':281 self.state = 'new'282 need_update = True283 return need_update284 285 286 def init_game(count, x=18, y=18):287 global game288 if game:289 del game290 game = Game(count)291 game.random_bomb()292 game.init_square()293 294 295 # 按间距中的绿色按钮以运行脚本。296 if __name__ == '__main__':297 init_game(30)298 299 while True:300 for event in pygame.event.get():301 if event.type == pygame.MOUSEBUTTONUP:302 if game.is_over():303 init_game(30)304 continue305 pos = event.pos306 if event.button == 1:307 game.clicked(pos)308 elif event.button == 3:309 game.right_clicked(pos)310 # 获取当前那个格子被点击了311 if event.type == pygame.QUIT:312 sys.exit(0)313 pygame.display.update()
本文链接地址:https://www.jiuchutong.com/zhishi/313311.html 转载请保留说明!

上一篇:织梦dedecms友情链接底层模板样式(织梦cms怎么样)

下一篇:python Unittest的组成(pytest unittest)

  • 钉钉怎样将家长身份改为学生(钉钉怎样将家长身份改为老师)

    钉钉怎样将家长身份改为学生(钉钉怎样将家长身份改为老师)

  • word怎么把右侧栏目去掉(word怎么把右侧标注栏打开)

    word怎么把右侧栏目去掉(word怎么把右侧标注栏打开)

  • 华为mate30pro充电显示怎么调(华为mate30pro充电器多少瓦)

    华为mate30pro充电显示怎么调(华为mate30pro充电器多少瓦)

  • 苹果原壁纸如何设置回来(苹果手机怎么原壁纸)

    苹果原壁纸如何设置回来(苹果手机怎么原壁纸)

  • 华为p20原装充电器型号是(华为手机p20原装充电器)

    华为p20原装充电器型号是(华为手机p20原装充电器)

  • iphone11快充多少瓦(iphone11快充多少A)

    iphone11快充多少瓦(iphone11快充多少A)

  • 蓝牙耳放可以提高手机音质吗(蓝牙耳放能提升蓝牙耳机音质吗)

    蓝牙耳放可以提高手机音质吗(蓝牙耳放能提升蓝牙耳机音质吗)

  • iphone抖音评论为什么是白色(苹果抖音评论界面)

    iphone抖音评论为什么是白色(苹果抖音评论界面)

  • 运行环境加载失败怎么回事(运行环境加载失败2117)

    运行环境加载失败怎么回事(运行环境加载失败2117)

  • 抖音上的文案怎么复制(抖音上的文案怎么去掉)

    抖音上的文案怎么复制(抖音上的文案怎么去掉)

  • 淘宝延迟发货可以延迟多久(淘宝延迟发货可以投诉多少次)

    淘宝延迟发货可以延迟多久(淘宝延迟发货可以投诉多少次)

  • 充电仓需要充电几小时(充电仓需要充电多长时间)

    充电仓需要充电几小时(充电仓需要充电多长时间)

  • 华为手机摔后屏幕好的但黑屏(华为手机摔后屏幕绿屏变闪怎么办)

    华为手机摔后屏幕好的但黑屏(华为手机摔后屏幕绿屏变闪怎么办)

  • 小米蓝牙强制开启aac(小米 蓝牙 开关)

    小米蓝牙强制开启aac(小米 蓝牙 开关)

  • 电热水袋水少了怎么办(电热水袋水少了还可以充电吗)

    电热水袋水少了怎么办(电热水袋水少了还可以充电吗)

  • 如何找回回收站的文件

    如何找回回收站的文件

  • 安卓手机怎么打开wim文件(安卓手机怎么打开OTG功能)

    安卓手机怎么打开wim文件(安卓手机怎么打开OTG功能)

  • iphone6电池多少毫安(iphone6系列电池容量表)

    iphone6电池多少毫安(iphone6系列电池容量表)

  • 手机的字体怎么改(手机的字体怎么改变繁体字)

    手机的字体怎么改(手机的字体怎么改变繁体字)

  • 陌陌甜蜜约会5分钟是啥(陌陌甜蜜约会5级多少钱)

    陌陌甜蜜约会5分钟是啥(陌陌甜蜜约会5级多少钱)

  • 华为手机支付保护中心在哪里(华为手机支付保护中心需要开启吗)

    华为手机支付保护中心在哪里(华为手机支付保护中心需要开启吗)

  • qq照片按5秒销毁怎么发(qq照片按5秒销毁会怎么样)

    qq照片按5秒销毁怎么发(qq照片按5秒销毁会怎么样)

  • 三星S10背面摔碎能换吗(三星s10后壳碎了还防水吗)

    三星S10背面摔碎能换吗(三星s10后壳碎了还防水吗)

  • 电脑表格怎么自动换行(电脑表格怎么自动排日期)

    电脑表格怎么自动换行(电脑表格怎么自动排日期)

  • iqoo支持nfc吗(iqoo支持nfc的型号)

    iqoo支持nfc吗(iqoo支持nfc的型号)

  • airpods进水了能修吗(airpods进水了能保修吗)

    airpods进水了能修吗(airpods进水了能保修吗)

  • 手机用什么剪裁gif尺寸(手机用什么剪裁最好)

    手机用什么剪裁gif尺寸(手机用什么剪裁最好)

  • 开视频怎么用美颜相机镜头(开视频怎么美颜加滤镜)

    开视频怎么用美颜相机镜头(开视频怎么美颜加滤镜)

  • win11怎么使用快捷键打开小组件和通知中心?(win11怎么桌面快捷方式)

    win11怎么使用快捷键打开小组件和通知中心?(win11怎么桌面快捷方式)

  • 车船使用税怎么网上缴费
  • 酒店摆放物品是什么
  • 员工工作服怎么做分录
  • 银行转账结算方式的种类及适用范围
  • 确认收入时需要结转成本吗
  • 研发折旧会计分录
  • 个人转让不动产给个人独资企业
  • 运输企业桥票怎么做会计分录
  • 自己做的房子可以办房产证吗
  • 二手车融资租赁公司
  • 计提租金分录怎么处理
  • 存货盘亏怎么做账务处理
  • 城市维护建设税减免税优惠政策
  • 国税和地税归哪里管
  • 特定行业如何界定
  • 年薪超过12万交多少税
  • 营改增后建筑业分包怎么交税
  • 银行借款用于在建工程
  • 研究开发费用扣除标准
  • 已进行账务处理怎么处理
  • 工程款的材料商可以直接起诉业主吗
  • 以股权增资的税费怎么算
  • windows10开机如何换帐号
  • 半成品核算工作步骤及要求
  • 哪些抵押物必须登记才有效
  • 玫瑰小镇的玫瑰有什么用
  • 安装win7教程
  • 免征的增值税需要纳税调整吗
  • php中变量有哪些基本数据类型?
  • 雨林木风win10安装失败
  • 公司买了一辆二手汽车,怎么入账
  • 房地产企业增值税扣除土地成本
  • PHP:JDToGregorian()的用法_日历函数
  • 总资产周转次数与总资产周转率
  • 销售滞后税务处理
  • 哪些免征增值税
  • vue的mvvm模型
  • 什么是CHATGPT
  • ajax自动带cookie
  • pd python
  • 房地产预计毛利率企业所得税
  • 企业公司怎么申请
  • 综合所得减除费用标准
  • 建筑劳务公司一年赚多少钱
  • 未开票收入如何计提增值税
  • 为取得固定资产而发生的什么支出可计入固定资产成本
  • 贷款利息进项税为什么不能抵扣
  • 现在勾选认证是可以下月初认证?
  • 施工一个月多少钱
  • 留底税额怎么形成的
  • 弥补以前年度亏损后缴纳所得税
  • 工程材料增值税税率是多少
  • 总公司与分公司账务处理
  • 文化事业费的费率是多少?
  • 其他应收款款项性质如何填写
  • 固定资产报废由谁审批
  • 什么是盈余公积和资本公积的区别
  • 会计科目中英文对照表下载
  • mysql同步问题之Slave延迟很大优化方法
  • reg.exe是什么程序
  • xp怎么解压文件
  • xp系统为什么不能用了
  • xp系统怎么找回删除的文件
  • mac上安装ios app
  • 远程关机对话框怎么打开
  • win7系统无法修复怎么办
  • win8.1专业版是哪个
  • windows8怎么设置开机密码
  • win7免费升级永久win8
  • win7打开摄像头权限
  • WIN10系统怎么删除软件
  • 关于session的用法哪些是错误的
  • disk指令
  • AndroidManifest.xml文件属性详解
  • js中遍历数组的方法
  • 字典树原理
  • 小程序河南税务局
  • 工资薪金的税收金额是填实际发生还是帐载金额
  • 福建省运会2022年
  • 企业房产如何过户给个人
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设