pygame—炸弹牌(可做课设)

2024-08-24 05:12
文章标签 炸弹 pygame 课设

本文主要是介绍pygame—炸弹牌(可做课设),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

游戏介绍

  1. 在5X5的数字宫格里翻牌,翻出所有的2和3即可获胜
  2. 每一格只能是0、1、2、3,
  3. 第六列和最第六行为 X | Y,X代表该列或该行的数字总和,Y代表该列或该行的0的个数
  4. 控制难度,每行每列的数字总和不超过9
  5. 该游戏需要一定运气及技巧

核心代码

生成二维数字列表

def createNumList() -> list:arr = []for i in range(6):row = []row_sum = 0col_sum = 0row_zeros = 0col_zeros = 0for j in range(5):# 从第二行开始计算每列当前和col_sum = sum([arr[s - 1][j] for s in range(i)]) if i > 0 else Noneif i < 5:num = random.randint(0, 3)if col_sum:while row_sum + num > 9 or col_sum + num > 9: # 控制总和num = random.randint(0, 3)else:while row_sum + num > 9: # 控制总和num = random.randint(0, 3)row.append(num)row_sum += numrow_zeros = row_zeros + 1 if num == 0 else row_zeroselse:# 第六行开始计算每列0的数量col_zeros = [arr[s][j] for s in range(5)].count(0)row.append((col_sum, col_zeros))row.append((row_sum, row_zeros))arr.append(row)return arr

绘制宫格

def makePalace(numList, window, screen, click_list=[]):"""绘制宫格,根据是否被点击来更改样式:param click_list: 被点击的格子,默认没有:param numList: 数字列表:param window:  surface:param screen: screen:return: 宫格列表(一维)"""palace_list = []for i in range(6):for j in range(6):# 特殊格子的内容if i == 5 or j == 5:text = f'{numList[i][j][0]} | {numList[i][j][1]}'if i == 5 and j == 5:text = ' 'else:text = numList[i][j]# 每一个的样式border = 2palace_color = color_dict['black']if (i, j) in click_list:if text == '0':border = 0palace_color = color_dict['red']text_color = color_dict['white']else:border = 1text_color = color_dict['black']else:text_color = color_dict['white']if i == 5 or j == 5:text_color = color_dict['black']palace = makeAndDrawRect(surface=window,x=(screen.width - screen.height) / 2 + j * screen.height / 6,y=i * screen.height / 6,width=screen.height / 6,height=screen.height / 6,border=border,color=palace_color,text=text,text_color=text_color,font_size=70)palace_list.append({'rect': palace,'click': False,'index': (i, j),'data': text if len(text) == 1 else None})return palace_list

完整代码

import pygame
import screeninfo
import gameNumfrom color import color_dictpygame.init()def makeText(surface, txt, x, y, text_color=color_dict['white'], size=40):"""绘制以(x, y)为中心的文本:param size::param surface::param txt::param x::param y::param text_color::return:"""font_name = pygame.font.match_font('Microsoft YaHei')font = pygame.font.Font(font_name, size)text = font.render(txt, True, text_color)text_rect = text.get_rect(center=(x, y))surface.blit(text, text_rect)def makeAndDrawRect(surface, x, y, width, height, text=None, border=0, color=color_dict['white'],text_color=color_dict['white'], font_size=40, border_radius=0):"""生成按钮,生成以(x, y)为顶点,文本在中间的按钮:param border_radius::param font_size::param text_color::param color::param border::param surface::param x::param y::param width::param height::param text::return: button"""button = pygame.Rect(x, y, width, height)pygame.draw.rect(surface, color, rect=button, width=border, border_radius=border_radius)if text:makeText(surface, text, x + width / 2, y + height / 2, text_color, font_size)return buttondef makePalace(numList, window, screen, click_list=[]):"""绘制宫格,根据是否被点击来更改样式:param click_list: 被点击的格子,默认没有:param numList: 数字列表:param window:  surface:param screen: screen:return: 宫格列表(一维)"""palace_list = []for i in range(6):for j in range(6):# 特殊格子的内容if i == 5 or j == 5:text = f'{numList[i][j][0]} | {numList[i][j][1]}'if i == 5 and j == 5:text = ' 'else:text = numList[i][j]# 每一个的样式border = 2palace_color = color_dict['black']if (i, j) in click_list:if text == '0':border = 0palace_color = color_dict['red']text_color = color_dict['white']else:border = 1text_color = color_dict['black']else:text_color = color_dict['white']if i == 5 or j == 5:text_color = color_dict['black']palace = makeAndDrawRect(surface=window,x=(screen.width - screen.height) / 2 + j * screen.height / 6,y=i * screen.height / 6,width=screen.height / 6,height=screen.height / 6,border=border,color=palace_color,text=text,text_color=text_color,font_size=70)palace_list.append({'rect': palace,'click': False,'index': (i, j),'data': text if len(text) == 1 else None})return palace_listdef main():screen = screeninfo.get_monitors()[0]window = pygame.display.set_mode((screen.width, screen.height))pygame.display.set_caption('炸弹牌')Gameplay = "每一个格子的数字只能是1、2、3, \n" \"'X | Y' 代表了该行或该列的数字之和为X,炸弹数量为Y\n" \"找出所有的2和3即为胜利"numList = []  # 每一局的数字列表clickPalace_indexList = []  # 被点击的格子now_2_3_Count = 0bt_again = Nonesound_click = pygame.mixer.Sound('turn.wav')sound_over = pygame.mixer.Sound('dedede.wav')sound_win = pygame.mixer.Sound('win.mp3')running = Trueplaying = Falseresult = None  # True则赢,False则输while running:window.fill(color_dict['black'])# 开始界面if playing is False:bt_start = makeAndDrawRect(surface=window,x=(screen.width - 200) / 2,y=screen.height * 0.7,width=200,height=80,text='开始游戏',border=5,border_radius=5)bt_exit = makeAndDrawRect(surface=window,x=(screen.width - 200) / 2,y=screen.height * 0.7 + 120,width=200,height=80,text='退出游戏',border=5,border_radius=5)lines = Gameplay.split('\n')offset = -60for line in lines:makeText(window, line, screen.width / 2, screen.height / 2 + offset)offset += 60else:# 生成当局数字if numList:passelse:numList = gameNum.elementToStr()bt_exit = makeAndDrawRect(surface=window,x=50,y=screen.height * 0.7 + 120,width=200,height=80,text='退出游戏',border=5,border_radius=5)# 正方形白色背景makeAndDrawRect(surface=window,x=(screen.width - screen.height) / 2,y=0,width=screen.height,height=screen.height)# 根据是否被点击显示内容palace_list = makePalace(numList, window, screen, clickPalace_indexList if clickPalace_indexList else [])# 游戏结束所显示的内容if result is not None:bt_again = bt_start = makeAndDrawRect(surface=window,x=50,y=screen.height * 0.7,width=200,height=80,text='再玩一局',border=5,border_radius=5)if result is True:makeText(window, '你赢了!', screen.width * 0.1, screen.height * 0.5)else:makeText(window, '翻到炸弹了!', screen.width * 0.1, screen.height * 0.5)for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseif event.type == pygame.MOUSEBUTTONDOWN:if bt_exit.collidepoint(event.pos):sound_click.play()running = Falseif playing is False:if bt_start.collidepoint(event.pos):sound_click.play()playing = Truedel bt_startelse:# 点击宫格count_2_3 = len([x for x in palace_list if x['data'] in ['2', '3']])for palace in palace_list:if palace['rect'].collidepoint(event.pos) and result is None:  # 被点击且游戏还没有结束if palace['index'] not in clickPalace_indexList and palace['data']:  # 去重插入数字区数据if palace['data'] == '0':sound_over.play()result = Falseelse:sound_click.play()if palace['data'] != '1':now_2_3_Count += 1clickPalace_indexList.append(palace['index'])# 所有2和3被找出if count_2_3 == now_2_3_Count and result is not True:sound_win.play()result = True# 游戏结束if result is not None and bt_again:if bt_again.collidepoint(event.pos):sound_click.play()result = Nonenow_2_3_Count = 0numList = []clickPalace_indexList = []bt_again = Nonepygame.display.flip()pygame.quit()if __name__ == '__main__':main()

这篇关于pygame—炸弹牌(可做课设)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101546

相关文章

java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频) 停车管理信息系统是为了提升停车场的运营效率和管理水平而设计的综合性平台。系统涵盖用户信息管理、车位管理、收费管理、违规车辆处理等多个功能模块,旨在实现对停车场资源的高效配置和实时监控。此外,系统还提供了资讯管理和统计查询功能,帮助管理者及时发布信息并进行数据分析,为停车场的科学

java计算机毕设课设—企业员工信息管理系统(附源码、文章、相关截图、部署视频)

这是什么系统? 获取资料方式在最下方 java计算机毕设课设—企业员工信息管理系统(附源码、文章、相关截图、部署视频) 企业员工信息管理系统旨在为公司提供高效的员工信息管理解决方案。该系统的核心功能涵盖密码修改、员工管理、部门管理、出勤管理、工资管理、请假审核等方面,帮助企业优化人力资源管理流程。系统结构如下: (1)前端(员工端): 1.密码修改:员工可以修改自己的密码,提升账户的安全

【每日一题】LeetCode 1652.拆炸弹(数组、滑动窗口)

【每日一题】LeetCode 1652.拆炸弹(数组、滑动窗口) 题目描述 你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为 n 的循环数组 code 以及一个密钥 k。 为了获得正确的密码,你需要替换掉每一个数字。所有数字会同时被替换。 如果 k > 0,将第 i 个数字用接下来 k 个数字之和替换。如果 k < 0,将第 i 个数字用之前 k 个数字之和替换。如果 k ==

Pygame游戏编程入门笔记

目录 1. Python游戏编程入门2. 建立开发环境3. 简单示例4. 绘制不同形状5. 事件监听举例6. 用pygame打印文本7. 键盘事件8. 鼠标事件9. 轮询键盘10. 轮询鼠标11. 角度与弧度12. 遍历圆周13. 矢量图与位图14. 获取已有的surface15. 加载位图16. 绘制位图17. 绘制游戏背景图18. 缩放图像19. 旋转20. 用精灵实现动画 20.1.

[YM]课设-C#-WebApi-Vue-员工管理系统 (五)登录

分析: 请求路径:/login 请求方式:POST 接口描述:该接口用于员工登录Tlias智能学习辅助系统,登录完毕后,系统下发JWT令牌。 => api文档中提到JWT令牌 这个相对来说比较复杂 是用来加密,防止未登录而意外访问内部页面 之后会出扩展篇 => emp表中有用户名和密码 说明了登录是调用的emp信息 反过来想 除了api接口的控制器LoginControl

[YM]课设-C#-WebApi-Vue-员工管理系统-前端文件

声明: 前言中已经声明 本前端是借用黑马课程,在此基础上进行增改 可以到黑马课程中下载(未根据本课设进行改动) 最好尽量还是下载本资源 不然会出现各类错误  ——————————— 持续更新中... 关注[YM]课设专栏[YM]课设_夜喵YM的博客-CSDN博客 文章: [YM]课设-C#-WebApi-Vue-员工管理系统 (前言)-CSDN博客 [YM]课设-C#-Web

今日算法:蓝桥杯基础题之“星系炸弹”

你好,我是沐爸,欢迎点赞、收藏、评论和关注。 今日算法第4题,如何布置星系炸弹,一起看看吧。 题目 在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。每个炸弹都可以设定多少天之后爆炸。比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。有一个贝塔炸弹,2024年8月30日放置,定时为1000天,请你计算它爆炸的准确日期。 JS 代码实现

linux bash shell之递归函数:fork炸弹

所谓fork炸弹是一种恶意程序,它的内部是一个不断在fork进程的无限循环,fork炸弹并不需要有特别的权限即可对系统造成破坏。fork炸弹实质是一个简单的递归程序。由于程序是递归的,如果没有任何限制,这会导致这个简单的程序迅速耗尽系统里面的所有资源。下面是Jaromil设计的最简单的fork炸弹: :() { :|:& };: 或者是 .() { .|.& };. 这么一行只有13个字符

python小游戏——躲避球(可当课设)

游戏简介: 没有美术,画面简洁(懒得做)。玩家控制小球躲避敌人(上下左右,闪避),敌人体积越大速度越慢,随机生成道具球(目前只有生命球),靠近道具球可拾取。 未来展望: 1. 添加其他道具球 2. 添加攻击手段,目前只能闪避。 3. 添加耐力条 4. 添加更多属性 核心代码 玩家移动 def player_move(space_down, player):"""控制玩家移动处理:

java计算机毕设课设—企业电子投票系统(附源码、文章、相关截图、部署视频)

这是什么系统? java计算机毕设课设—企业电子投票系统(附源码、文章、相关截图、部署视频) 企业电子投票系统是一款高效便捷的在线投票平台包括前端普通用户和后端管理员两大模块,普通用户可登录投票、查看结果,管理员则负责后台管理,如撤销/恢复主题、删除主题、公布/隐藏投票结果等。通过该系统,企业能够轻松发起投票活动,收集员工意见,为决策提供有力支持。企业电子投票系统主要功能包括:投票、查看投票结