Python pyglet制作彩色圆圈“连连看”游戏

原文链接: 

Python 一步一步教你用pyglet制作“彩色方块连连看”游戏(续)-CSDN博客文章浏览阅读1.6k次,点赞75次,收藏55次。上期讲到相同的色块连接,链接见: Python 一步一步教你用pyglet制作“彩色方块连连看”游戏-CSDN博客续上期,接下来要实现相邻方块的连线:首先来进一步扩展 行列的类......https://blog.csdn.net/boysoft2002/article/details/137063657

彩色圆圈“连连看”

有个网友留言要把原文中的方块改成圆圈,再要加入消去的分数。大致效果如下: 

以下就把原文的代码作几步简单的修改:

Box类的修改

class Box:
    def __init__(self, x, y, w, h, color, batch=batch):
        self.x, self.y, self.w, self.h = x, y, w, h
        self.rect = shapes.Rectangle(x, y, w, h, color=color, batch=batch)
        self.box = shapes.Box(x, y, w, h, color=Color('WHITE').rgba, thickness=3, batch=batch)

    def hide(self):
        self.box.batch = self.rect.batch = None
    def show(self):
        self.box.batch = self.rect.batch = batch
    def on_mouse_over(self, x, y):
        return self.x<=x<=self.x+self.w and self.y<=y<=self.y+self.h

把矩形及方框用圆圈和圆弧来代替:

        self.rect = shapes.Circle(x+w//2, y+h//2, min(w,h)//2, color=color, batch=batch)
        self.box = shapes.Arc(x+w//2, y+h//2, min(w,h)//2, color=Color('WHITE').rgba, batch=batch)

Game类的修改 

Game类中增加分数属性:

class Game:
    def __init__(self):
        initMatrix(row, col)
        self.score = 0
        self.rc, self.rc2 = Point(), Point()
        self.array, self.arces = Array, Boxes

update方法中增加分数和显示

    def update(self, event):
        clock.unschedule(self.update)
        if self.last1.cir.color==self.last2.cir.color and matrix.connect(self.rc, self.rc2):
            self.hide()
            sound1.play()
            self.score += 10
            window.set_caption(window.caption.split('分数:')[0] + f'分数:{self.score}')

        ......

点击事件的修改

在on_mouse_press事件中增加分数的显示:

@window.event
def on_mouse_press(x, y, dx, dy):
    global score
    if (ret := game.on_mouse_click(x, y)):
        window.set_caption(f'彩色方块连连看——坐标:{ret[0]}  颜色:{ret[1]}  分数:{game.score}')

部分代码的替代

在源码全文中搜索并替代: .rect 替换为 .cir ; .box 替换为 .arc

class Box类名也可以修改一下,不作修改也不影响代码的运行。

大致就以上几步就完成了修改:

完整代码 

from pyglet import *
from colorlib import *
from pointlib import Point
from pyglet.window import keyW, H = 800, 600
window = window.Window(W, H)
gl.glClearColor(*Color('lightblue3').decimal)
batch, batch2, group = graphics.Batch(), graphics.Batch(), graphics.Group()row, col, space = 8, 10, 5
w, h = W//(col+2), H//(row+2)
x0, y0 = (W-(w+space)*col)//2, (H-(h+space)*row)//2sound1, sound2 = media.load('box.mp3'), media.load('box2.mp3')def randColor():COLOR = []while len(COLOR)<row*col//4:if not ((c:=randcolorTuple()) in COLOR or Color(c).name[-1] in '0123456789'):COLOR.append(c)return sample(COLOR*4, row*col)class Box:def __init__(self, x, y, w, h, color, batch=batch):self.x, self.y, self.w, self.h = x, y, w, hself.cir = shapes.Circle(x+w//2, y+h//2, min(w,h)//2, color=color, batch=batch)self.arc = shapes.Arc(x+w//2, y+h//2, min(w,h)//2, color=Color('WHITE').rgba, batch=batch)def hide(self):self.arc.batch = self.cir.batch = Nonedef show(self):self.arc.batch = self.cir.batch = batchdef on_mouse_over(self, x, y):return self.x<=x<=self.x+self.w and self.y<=y<=self.y+self.hclass Matrix:def __init__(self, r=row, c=col):self.array = [[1]*c for _ in range(r)]self.point = []self.lines = [shapes.Line(*[-3]*4, width=5, color=Color('light gold').rgba,batch=batch2, group=group) for _ in range(5)]for line in self.lines: line.visible = Falsedef __repr__(self):return '\n'.join(map(str,self.array))+'\n'def true(self, point):try: return self.array[point.x+1][point.y+1]except: return 0def alltrue(self, points):if isinstance(points,(tuple,list)) and all(isinstance(p, Point) for p in points):try: return all(self.array[p.x+1][p.y+1] for p in points)except: return 0def adjacent(self, point1, point2):return point1*point2def inline(self, point1, point2):return point1^point2 and self.alltrue(point1**point2)def diagonal(self, point1, point2):if point1&point2:for point in point1%point2:state1 = self.adjacent(point, point1) or self.inline(point, point1)state2 = self.adjacent(point, point2) or self.inline(point, point2)if self.true(point) and state1 and state2:self.point.append(point)return Truedef connect1(self, p1, p2):return self.adjacent(p1, p2) or self.inline(p1, p2) or self.diagonal(p1, p2)def connect2(self, p1, p2):for i in range(1, max(row, col)):for p in zip(i+p1, i+p2):for i in range(2):if self.true(p[i]) and (self.adjacent(p[i],(p1,p2)[i]) orself.inline(p[i],(p1,p2)[i]))and self.diagonal(p[i], (p2,p1)[i]):self.point.append(p[i])return Truedef connect(self, p1, p2):if (ret := self.connect1(p1, p2) or self.connect2(p1, p2)):self.showlines(p1, p2)return retdef getxy(self, row, col):return x0+col*(w+space)+w//2, y0+row*(h+space)+h//2def drawline(self, *args):for i,p in enumerate(args[:-1]):self.lines[i].x, self.lines[i].y = self.getxy(*p)self.lines[i].x2, self.lines[i].y2 = self.getxy(*args[i+1])self.lines[i].visible = Truedef showlines(self, point1, point2):if len(self.point)==3: self.point.pop(0)if len(self.point)==2 and not self.point[0]^point1: self.point.reverse()points = point1, *self.point, point2self.drawline(*points)self.point.clear()def hidelines(self):for line in self.lines: line.visible = Falsedef linevisible(self):return self.lines[0].visibledef initMatrix(row, col):global matrix, Array, Boxesmatrix = Matrix(row+2, col+2)Array, Boxes = matrix.array, Matrix().arrayfor i in range(row):for j in range(col):Array[i+1][j+1] = 0COLOR = randColor()for r,arr in enumerate(Boxes):for c,_ in enumerate(arr):Boxes[r][c] = Box(x0+c*(w+space), y0+r*(h+space), w, h, COLOR[c+r*len(arr)])class Game:def __init__(self):initMatrix(row, col)self.score = 0self.rc, self.rc2 = Point(), Point()self.array, self.arces = Array, Boxesself.last1, self.last2, self.lastz = None, None, Noneself.label1 = text.Label('Congratulations!', color=Color().randcolor().rgba, font_size=50,x=W//2, y=H//2+80, anchor_x='center', anchor_y='center', bold=True, batch=batch)self.label2 = text.Label('Any key to restart...', color=Color().randcolor().rgba, font_size=36,x=W//2, y=H//2-50, anchor_x='center', anchor_y='center', bold=True, batch=batch)def on_mouse_click(self, x, y):if matrix.linevisible(): returnif self.success(): main(event)r, c = (y-y0)//(h+space), (x-x0)//(w+space)if r in range(row) and c in range(col) and self.arces[r][c].on_mouse_over(x, y) and not self.array[r+1][c+1]:if self.last1 is None and self.last2 is None:self.rc, self.last1 = Point(r, c), self.arces[r][c]self.last1.arc.color = Color('RED').rgbaelif self.last1 is not None and self.last2 is None:self.rc2, self.last2 = Point(r, c), self.arces[r][c]self.last2.arc.color = Color('RED').rgbaif self.rc == self.rc2:self.last1.arc.color = Color('WHITE').rgbaself.last1, self.last2 = None, Noneelse:if self.last1.cir.color==self.last2.cir.color:matrix.connect(self.rc, self.rc2)clock.schedule_interval(self.update, 0.5)return (r, c), Color(self.arces[r][c].cir.color).namedef update(self, event):clock.unschedule(self.update)if self.last1.cir.color==self.last2.cir.color and matrix.connect(self.rc, self.rc2):self.hide()sound1.play()self.score += 10window.set_caption(window.caption.split('分数:')[0] + f'分数:{self.score}')else:sound2.play()self.last1.arc.color = self.last2.arc.color = Color('WHITE').rgbaself.lastz = self.last1, self.last2self.last1, self.last2 = None, Nonematrix.hidelines()if game.success():window.set_caption('彩色方块连连看——任务完成!')game.label1.batch = game.label2.batch = batch2clock.schedule_interval(main, 5) # 5秒后自动开始def hide(self):self.last1.hide(); self.last2.hide()self.array[self.rc.x+1][self.rc.y+1] = self.array[self.rc2.x+1][self.rc2.y+1] = 1def unhide(self):self.lastz[0].show(); self.lastz[1].show()self.array[self.rc.x+1][self.rc.y+1] = self.array[self.rc2.x+1][self.rc2.y+1] = 0def success(self):return sum(sum(self.array,[]))==(row+2)*(col+2) def main(event):global gamegame = Game()game.label1.batch = game.label2.batch = Nonewindow.set_caption('彩色方块连连看')clock.unschedule(main)@window.event
def on_draw():window.clear()batch.draw()batch2.draw()@window.event
def on_mouse_press(x, y, dx, dy):global scoreif (ret := game.on_mouse_click(x, y)):window.set_caption(f'彩色方块连连看——坐标:{ret[0]}  颜色:{ret[1]}  分数:{game.score}')@window.event
def on_key_press(symbol, modifiers):if game.success(): main(event)if symbol == key.S and modifiers & key.MOD_CTRL:main(event)elif symbol == key.Z and modifiers & key.MOD_CTRL:game.unhide()elif symbol == key.R and modifiers & key.MOD_CTRL:for i in range(row):for j in range(col):Array[i+1][j+1], Boxes[i][j].arc.batch, Boxes[i][j].cir.batch = 0, batch, batchelif symbol == key.F and modifiers & key.MOD_CTRL:if sum(sum(game.array,[]))%2: returnboxsample = []for i,arr in enumerate(Array[1:-1]):for j,n in enumerate(arr[1:-1]):if n==0: boxsample.append(Boxes[i][j].cir.color)boxsample = sample(boxsample,len(boxsample))for i,arr in enumerate(Array[1:-1]):for j,n in enumerate(arr[1:-1]):if n==0: Boxes[i][j].cir.color = boxsample.pop()main(event)
app.run()

目录

彩色圆圈“连连看”

Box类的修改

Game类的修改 

点击事件的修改

部分代码的替代

完整代码 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/823862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ai2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Adobe illustrator&#xff0c;常被称为“AI”&#xff0c;是一种应用于出版、多媒体和在线图像的工业标准矢量插画的软件。作为一款非常好的矢量图形处理工具&#xff0c;该软件主要应用于印刷出版、海报书籍排版、专业插画、多…

Fiddler抓包工具之高级工具栏中的Inspectors的使用

高级工具栏中的Inspectors的使用 Inspectors 页签允许你用多种不同格式查看每个请求和响应的内容。JPG 格式使用 ImageView 就可以看到图片&#xff0c;HTML/JS/CSS 使用 TextView 可以看到响应的内容。Raw标签可以查看原始的符合http标准的请求和响应头。Cookies标签可以看到…

手机拍照技术

拍照技巧 说明: 本文将主要介绍摄影和手机常见技巧&#xff1b; 1. 摄影的基本知识 **说明&#xff1a;**关于摄影&#xff0c;手机和相机的原理都是相同的&#xff0c;不同的是相机在很多方面优于手机&#xff0c;但是专业的设备对于我们这种的非专业的人来说&#xff0c;刚…

Linux时间同步练习

题目如下&#xff1a; 一.配置server主机要求如下&#xff1a; 1.server主机的主机名称为 ntp_server.example.com 2.server主机的IP为&#xff1a; 172.25.254.100 3.server主机的时间为1984-11-11 11&#xff1a;11&#xff1a;11 4.配置server主机的时间同步服务要求可以被所…

重磅,巫师3即将发布mod编辑器并开放创意工坊

热乎乎的消息&#xff01;巫师3即将推出mod编辑器和开放创意工坊&#xff01; 根据巫师3官方Steam消息&#xff0c;听说年底将推出mod编辑器&#xff0c;目前已经开始内测。想试用的玩家们&#xff0c;可以到redkit商店页面申请访问权限&#xff0c;体验最新的创意工具。 此外&…

存入Redis的值前面有很多空格

说明&#xff1a;记录一次使用Redis的错误&#xff1b; 场景 在将验证码存入Redis时&#xff0c;发现存入的值前面有很多空格&#xff0c;导致在与前端传入的值比较时&#xff0c;一直是false&#xff0c;验证不通过。如下&#xff1a; 上面这些“□”是占位符&#xff0c;复…

学习笔记(4月17日)vector底层原理

1.vector<vector>底层原理 vector是表示可变大小数组的序列容器&#xff0c;相当于一个动态的数组&#xff0c;比数组优越的在于它具有可动态改变的大小&#xff0c;同时&#xff0c;它写成了类模板&#xff0c;说明可以适用于其他类型&#xff0c;包括vector本身&#…

rust 学习笔记(13-19)

13 迭代器与闭包 Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是 函数式编程&#xff08;functional programming&#xff09;。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。 闭包&#xff08;Closu…

游戏、app抓包

文章目录 协议app抓包游戏抓包 协议 在抓包之前&#xff0c;首先我们要对每个程序使用什么协议有个大致的了解&#xff0c;比如网页这种就是走的http协议。 在一些app中我们通过发送一个请求&#xff0c;然后服务器接受&#xff0c;响应&#xff0c;返回一个数据包&#xff0c…

网站模板-慈善捐赠基金会网站模板 Bootstrap4 html

目录 一.前言 二.预览 三.下载链接 一.前言 这是一个慈善网站的页面。页面包含了导航栏、横幅部分、关于、使命、新闻、活动、捐赠和页脚等不同的部分。该网站还包含了一些CSS样式和JavaScript脚本来实现交互和样式效果。 这个网站的具体结构如下&#xff1a; 导航栏部分&a…

吐血整理102个Python项目,从基础到高级,练完你就牛了!

前言 Python 初学者在迈过安装编程环境和基本语法的门槛&#xff0c;准备大展身手的时候&#xff0c;可能突然就会进入迷茫期&#xff1a; 不知道做些什么、再学些什么。。。 然后对编程的兴趣就会慢慢消退&#xff0c;找不到坚持下去的理由&#xff0c;从而慢慢淡忘之前学会…

OpenCV基本图像处理操作(九)——特征匹配

Brute-Force蛮力匹配 Brute-Force蛮力匹配是一种简单直接的模式识别方法&#xff0c;经常用于计算机视觉和数字图像处理领域中的特征匹配。该方法通过逐一比较目标图像中的所有特征点与源图像中的特征点来寻找最佳匹配。这种方法的主要步骤包括&#xff1a; 特征提取&#xff…

热烈祝贺中国特医首次获得蒙特国际品质奖!中国特医健效达品质永攀世界高峰

近日&#xff0c;第63届Monde Selection品质评鉴活动圆满落幕&#xff0c;健效达旗下优康力和优益力产品凭借其卓越品质&#xff0c;成功摘得世界蒙特奖&#xff0c;这是中国特医食品首次获得蒙特奖国际品质奖。 健效达特医树立世界特医新标杆&#xff0c;永攀世界高峰&#xf…

Java定时任务

一、java.util.Timer java.util.Timer 类允许您在未来的某个时间执行一个任务&#xff0c;或者在一定的时间间隔执行任务。您可以创建一个 Timer 实例&#xff0c;并调用其 schedule() 方法来安排任务的执行。这种方式比较简单&#xff0c;但在高并发环境下可能不够灵活。 1.…

放大招,推广手机流量卡,佣金丰厚等你来拿

流量卡推广是一个非常冷门但又在身边非常常见的行业&#xff0c;知道的人目前靠着这个信息&#xff0c;发了很多小财&#xff0c;可以说早知道这一行的人会非常容易变成暴发户。 你可能也会好奇&#xff0c;为什么那么多广告都是在推流量卡&#xff0c;他们推卡到底有多高的利…

将gidp模块、ipam集成到ultralytics项目中实现gidp-yolov8、ipam-yolov8

gdip-yolo与ia-seg都是一种将图像自适应模块插入模型前面,从而提升模型在特定数据下检测能力的网络结构。gdip-yolo提出了gdip模块,可以应用到大雾数据与低亮度数据(夜晚环境),然后用于目标检测训练;ia-seg将ia-yolo中的代码修改了一下修车了ipam模块,应用到低亮度数据(…

数据库技术基础

根据希赛相关视频课程汇总整理而成&#xff0c;个人笔记&#xff0c;仅供参考。 基本概念 数据库通常是指有组织地、动态地存储在&#xff08;外存上的相互联系的数据的集合&#xff09;应用数据库主要目的是解决数据&#xff08;共享&#xff09;问题。 三级模式/两级映像&a…

【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题

文章目录 一、什么是时间复杂度和空间复杂度&#xff1f;1.1 算法效率1.2 时间复杂度的概念1.3 空间复杂度的概念1.4 复杂度计算在算法中的意义 二、时间复杂度的计算2.1 大O渐进表示法2.2 常见时间复杂度计算举例 三、空间复杂度的计算四、Leetcode刷题1. 消失的数2. 旋转数组…

代理服务器端口分配测试

上游服务器需要一个短暂或临时端口请求下游服务器&#xff0c;测试端口分配方式。 参考nginx 摘录-腾讯云开发者社区-腾讯云 框架为 <dependency><groupId>org.mitre.dsmiley.httpproxy</groupId> <artifactId>smiley-http-proxy-servlet</ar…

一些docker安装配置以及常见命令

​常用命令 docker 命令 //进去容器内部&#xff0c;找到需要拷贝的文件及目录 docker exec -it 2c2600fb60f8 /bin/bash ​ //将container id为4db8edd86202的容器内elasticsearch.yml文件拷贝到宿主机指定目录下&#xff1a; docker cp 4db8edd86202:/usr/share/elasticsea…