软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(代码实现)
软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(代码实现)
- 类变量的定义以及类的初始化__init__
- 一、游戏的逻辑
- 1、猫头的生成
- 2、鱼的生成
- 3、猫头和鱼骨的移动
- 4、按下键盘,改变方向
- 二、主窗口的绘制
- 三、游戏开始与结束界面,以及主窗口的按钮
- 1、开始游戏
- 2、游戏速度设置
- 3、猫咪选项设置
- 4、结束游戏
- 5、窗口中的按钮:暂停/开始、重来/退出
- 四、游戏背景音乐
类变量的定义以及类的初始化__init__
class CatWindow(QWidget):row = 0 # 行数column = 0 # 列数direction = 0 # 猫头方向head_row = 0 # 猫头的行head_column = 0 # 猫头的列head_position = '' # 猫头位置coordinate = [] # 猫头和鱼骨的位置列表fish_row = 0 # 鱼的行fish_column = 0 # 鱼的列fish_position = '' # 鱼的位置score = 0 # 计分# 速度默认值为500speed = 500# 猫咪类型默认值是英短蓝白head_pic = 'head.png'dead_pic = 'dead.png'# 设置几个字体font1 = QtGui.QFont("Calibri", 20)font2 = QtGui.QFont("Calibri", 15)font3 = QtGui.QFont("Calibri", 13)font4 = QtGui.QFont("幼圆", 20)font5 = QtGui.QFont("幼圆", 13)# 所有按钮都按照这个样式buttons_style = "QPushButton{background-color: rgb(255, 255, 255); border-radius:10px}" \"QPushButton:hover{Background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 #cdced1, stop:1 #f6f7fa);}" \"QPushButton:pressed{Background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 #f6f7fa, stop:1 #cdced1);}"# 初始化def __init__(self):QWidget.__init__(self)self.setWindowTitle('贪吃喵') # 窗口标题self.setStyleSheet('background-color:#deebf7') # 游戏背景颜色self.setWindowIcon(QIcon('head.png')) # 设置窗口图标ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("myappid") # 任务栏图标self.resize(850, 850) # 游戏窗口大小self.row = 12 # 行数self.column = 12 # 列数pygame.mixer.init() # 初始化背景音乐self.GameStart()self.windowButton()self.timer = QTimer() # 计时器self.timer.start(self.speed) # 开始计时self.timer.timeout.connect(self.moveCat) # 超时即调用moveCat方法
一、游戏的逻辑
1、猫头的生成
# 随机生成猫头位置def head(self):self.backgroundMuisc()self.score = 0 # 分数清零self.coordinate.clear() # 坐标清空self.head_row = random.randint(2, self.row - 2) # 随机选取猫头的行self.head_column = random.randint(1, self.column - 2) # 随机选取猫头的列self.coordinate = [str(self.head_row) + "," + str(self.head_column)] # 把猫头位置写入坐标列表中self.fish() # 调用生成鱼的函数self.direction = random.randrange(0, 4) # 随机选择方向self.update()
2、鱼的生成
# 生成鱼的位置def fish(self):while True:self.fish_row = random.randint(1, self.row - 1) # 随机选取鱼的行self.fish_column = random.randint(0, self.column - 1) # 随机选取鱼的列self.fish_position = str(self.fish_row) + "," + str(self.fish_column)# 若随机生成的鱼的位置不在猫头和鱼骨的坐标列表中,则返回鱼的位置,否则重新生成if self.fish_position not in self.coordinate:return self.fish_position # 返回鱼的位置
3、猫头和鱼骨的移动
# QTimer的timeout触发的方法def moveCat(self):if self.direction == 0:self.head_row -= 1 # 猫头的行数-1elif self.direction == 1:self.head_row += 1 # 猫头的行数+1elif self.direction == 2:self.head_column -= 1 # 猫头的列数-1elif self.direction == 3:self.head_column += 1 # 猫头的列数+1# 猫头位置self.head_position = str(self.head_row) + "," + str(self.head_column)# 1、若吃到鱼了if self.head_position == self.fish_position:self.coordinate.insert(0, self.head_position) # 鱼骨位置不变,在列表最前面插入猫头位置self.score += 10 # 每吃到一条鱼就加10分self.fish() # 生成鱼# 2、若没吃到鱼else:# 若猫头和鱼骨没有相撞且猫头没有出界if 1 <= self.head_row < self.row and 0 <= self.head_column < self.column and self.head_position not in self.coordinate[1:]:# 1)移动所有鱼骨for i in range(len(self.coordinate) - 1, 0, -1): # range函数的参数(start, stop, step)self.coordinate[i] = self.coordinate[i - 1] # 所有坐标等于它的前一个坐标(往前一个移动)# 2)更新猫头位置self.coordinate[0] = self.head_position# 若猫头和鱼骨相撞或猫头出界,则游戏结束else:self.GameOver(True)returnself.update()
4、按下键盘,改变方向
# 按下键盘,改变方向def keyPressEvent(self, event):QWidget.keyPressEvent(self, event)key = event.key()# 1、按了↑if key == Qt.Key_W:self.direction = 0# 2、按了↓elif key == Qt.Key_S:self.direction = 1# 3、按了←elif key == Qt.Key_A:self.direction = 2# 4、按了→elif key == Qt.Key_D:self.direction = 3
二、主窗口的绘制
# 绘制主窗口中的所有物体def paintEvent(self, event):QWidget.paintEvent(self, event)painter = QPainter(self)row_space = self.height() / self.row # 行间距column_space = self.width() / self.column # 列间距# 显示背景图片painter.drawImage(QRectF(0, 0, self.width(), self.height()), QImage('bg.jpg'))# 绘制行线和列线pen = QPen(QColor(255, 255, 255), 1, Qt.DotLine) # 画笔颜色、粗细、线型painter.setPen(pen)for n in range(self.row + 1):painter.drawLine(QPointF(0, row_space * n), QPointF(self.width(), row_space * n))for n in range(self.column + 1):painter.drawLine(QPointF(column_space * n, column_space), QPointF(column_space * n, self.height()))# 显示分数text_painter = QPainter(self)text_pen = QPen(QColor(0, 0, 0)) # 画笔颜色、粗细、线型text_painter.setPen(text_pen)text_painter.setFont(self.font1)text_painter.drawText(350, 50, 'Score: ' + str(self.score))# 画猫头、鱼骨、鱼index = 0 # 记录coordinate的索引,为0时画猫头,大于0时画鱼骨for n in self.coordinate:row = int(n[:n.find(',')])column = int(n[n.find(',') + 1:])# 若猫头没出界且没有与鱼骨相撞,画猫头和鱼骨if 1 <= self.head_row < self.row and 0 <= self.head_column < self.column and self.head_position not in self.coordinate[1:]:# 猫头if index == 0:painter.drawImage(QRectF(column * column_space, row * row_space, column_space, row_space),QImage(self.head_pic))# 画鱼骨else:painter.drawImage(QRectF(column * column_space, row * row_space, column_space, row_space),QImage('bone.png'))index += 1# 若猫头出界了或与鱼骨相撞,画死亡猫头和鱼骨else:# 猫头if index == 0:painter.drawImage(QRectF(column * column_space, row * row_space, column_space, row_space),QImage(self.dead_pic))# 画鱼骨else:painter.drawImage(QRectF(column * column_space, row * row_space, column_space, row_space),QImage('bone.png'))index += 1# 画鱼painter.drawImage(QRectF(self.fish_column * column_space, self.fish_row * row_space, column_space, row_space),QImage('fish.png'))
三、游戏开始与结束界面,以及主窗口的按钮
1、开始游戏
# 开始游戏def GameStart(self):# 消息框的大小和样式message_box = QMessageBox()message_box.setStyleSheet('width: 500; height: 70')message_box.setWindowTitle('WELCOME')message_box.setFont(self.font4)message_box.setText("欢迎来到贪吃喵
软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(代码实现)相关推荐
- 软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(实验准备与设计)
软件实习项目2--贪吃喵(猫吃鱼版贪吃蛇)(实验准备与设计) 实验内容 编程语言以及开发环境的选择 实验思路(游戏设计) 一.游戏的逻辑设计 1.猫头的生成 2.鱼的生成 3.猫头和鱼骨的移动 4.按 ...
- 软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(成品展示)
软件实习项目2--贪吃喵(猫吃鱼版贪吃蛇)(成品展示) 成品展示 1.开始游戏界面 2.游戏主界面 3.结束游戏界面 视频演示 成品展示 1.开始游戏界面 速度选择: 猫咪类型选择: 2.游戏主界面 ...
- 软件实习项目4——校园一卡通管理系统(成品展示)
软件实习项目4--校园一卡通管理系统(成品展示) 成品展示 1.登录界面 2.密保验证 3.重置密码 4.主界面 视频演示 成品展示 1.登录界面 2.密保验证 3.重置密码 4.主界面 1)学生基本 ...
- 【训练4】猫吃鱼,狗吃肉(匿名内部类)
[训练4]猫吃鱼,狗吃肉 参照下面的代码,创建Animal类的匿名子类对象,重写eat()方法,执行该方法后会在控制台打印"猫吃鱼,狗吃肉"字样. /*[训练4]猫吃鱼,狗吃肉* ...
- 【使用java swing制作简易贪吃蛇游戏】软件实习项目二
一.项目准备 需求分析: 实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子,上下左右控制"蛇"的移动,吃到"豆子"以后" ...
- 软件实习项目二:贪吃蛇的游戏开发
目录 一.实验内容: 二.实验准备 三.程序代码 四.成果展示 一.实验内容: 1)实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子.玩家能利用上下左右键控制" ...
- Java主人喂猫吃鱼的实验总结,小猫吃鱼的作文4篇
小猫吃鱼的作文4篇 小猫吃鱼的作文1 夏天的一个星期天的早晨,万里晴空,骄阳似火.一只好看的小花猫肚子饿了,到野外找食吃.它来到小河边,看到河边的老槐树下拴着一条狗,黑黑的绒毛,四肢雪白,长长的尾巴往 ...
- JavaScript实现猫吃鱼小游戏
贪吃猫小游戏 作为一名前端人员,撸猫我决定使用面向对象的方式书写贪吃猫小游戏,灵感来自有贪食蛇小游戏. 我们可以把整个游戏看成是一个游戏类,游戏类可以有各种各样的属性. 我们可以把贪吃猫中的猫作为一个 ...
- python入门小项目 | 开发一个《小猫抓鱼》小游戏
小猫抓鱼 开发工具 讲解部分 一.游戏原理 二.游戏逻辑 三.重点代码实现 开发工具 python3.6.4 第三方库: pygame,random 讲解部分 一.游戏原理 游戏原理很简单,和接水果的 ...
最新文章
- mybatis自动生成代码工具
- 李开复给中国学生的第七封信:21世纪最需要的7种人才
- C++学习手记五:C++流操作
- 【每周NLP论文推荐】 对话管理中的标志性论文介绍
- mysql的jdbc版本_【jdbc】Mysql 8版本jdbc设置
- 前端开发 margin外边距 0229
- leetcode 只出现一次的数字
- 【EMC】电压暂降、短时中断和电压变化
- java 注解校验_Java开发编写自定义校验注解和校验器
- net core mysql 组件记录
- Spring整合log4j日志组件(转)
- OpenCV 单目摄像头(python版)
- 迅捷校园网自动登录脚本(网页端)
- 安徽大学本科毕业论文答辩和论文选题PPT模板
- 机器学习(十一) 迁移学习
- 汉化MapGuide
- BeautifulSoup用法详解
- 无线充电怎么测试软件,无线充电测试难点及解决方案
- stm8s103k3 周期 捕获_STM8S做输入捕获
- 汽车网络安全渗透测试
热门文章