哈喽~大家好,我是恰恰,好久不见,我是一个不太喜欢玩游戏的人,但是小时候特别喜欢玩连连看,很消磨时间,所以我找来了连连看游戏的源代码,毕竟热爱才能学习的更久,兴趣是最好的老师对吧!

另外还给同学们准备了其他学习资料,需要更多学习资料、软件安装包的同学可以点击链接免费领取 :

https://docs.qq.com/doc/DZmpWZHpqZFFFZGhh?pub=1&dver=2.1.27114328

Python连连看小游戏源代码,经典小游戏连连看Python源程序,连连看游戏资源包请前往:https://pan.baidu.com/s/1a5cmM8noQbGmH_WG49-maA下载,提取码请回复:连连看提取码。程序运行截图:

main.py

''''''import os, randomimport tkinter as tkimport tkinter.messageboxfrom PIL import Image, ImageTk
root = tk.Tk()
class MainWindow():  __gameTitle = "连连看游戏"  __windowWidth = 700  __windowHeigth = 500  __icons = []  __gameSize = 10 # 游戏尺寸  __iconKind = __gameSize * __gameSize / 4 # 小图片种类数量  __iconWidth = 40  __iconHeight = 40  __map = [] # 游戏地图  __delta = 25  __isFirst = True  __isGameStart = False  __formerPoint = None  EMPTY = -1  NONE_LINK = 0  STRAIGHT_LINK = 1  ONE_CORNER_LINK = 2  TWO_CORNER_LINK = 3
  def __init__(self):    root.title(self.__gameTitle)    self.centerWindow(self.__windowWidth, self.__windowHeigth)    root.minsize(460, 460)
    self.__addComponets()    self.extractSmallIconList()  def __addComponets(self):    self.menubar = tk.Menu(root, bg="lightgrey", fg="black")
    self.file_menu = tk.Menu(self.menubar, tearoff=0, bg="lightgrey", fg="black")    self.file_menu.add_command(label="新游戏", command=self.file_new, accelerator="Ctrl+N")
    self.menubar.add_cascade(label="游戏", menu=self.file_menu)    root.configure(menu=self.menubar)
    self.canvas = tk.Canvas(root, bg = 'white', width = 450, height = 450)    self.canvas.pack(side=tk.TOP, pady = 5)    self.canvas.bind('<Button-1>', self.clickCanvas)        
  def centerWindow(self, width, height):    screenwidth = root.winfo_screenwidth()    screenheight = root.winfo_screenheight()    size = '%dx%d+%d+%d' % (width, height, (screenwidth - width)/2, (screenheight - height)/2)    root.geometry(size)  def file_new(self, event=None):    self.iniMap()    self.drawMap()    self.__isGameStart = True
  def clickCanvas(self, event):    if self.__isGameStart:      point = self.getInnerPoint(Point(event.x, event.y))      # 有效点击坐标      if point.isUserful() and not self.isEmptyInMap(point):        if self.__isFirst:          self.drawSelectedArea(point)          self.__isFirst= False          self.__formerPoint = point        else:          if self.__formerPoint.isEqual(point):            self.__isFirst = True            self.canvas.delete("rectRedOne")          else:            linkType = self.getLinkType(self.__formerPoint, point)            if linkType['type'] != self.NONE_LINK:              # TODO Animation              self.ClearLinkedBlocks(self.__formerPoint, point)              self.canvas.delete("rectRedOne")              self.__isFirst = True              if self.isGameEnd():                tk.messagebox.showinfo("You Win!", "Tip")                self.__isGameStart = False            else:              self.__formerPoint = point              self.canvas.delete("rectRedOne")              self.drawSelectedArea(point)  # 判断游戏是否结束  def isGameEnd(self):    for y in range(0, self.__gameSize):      for x in range(0, self.__gameSize):        if self.__map[y][x] != self.EMPTY:          return False    return True
              
  '''  提取小头像数组  '''  def extractSmallIconList(self):    imageSouce = Image.open('图片/NARUTO.png')    for index in range(0, int(self.__iconKind)):      region = imageSouce.crop((self.__iconWidth * index, 0,           self.__iconWidth * index + self.__iconWidth - 1, self.__iconHeight - 1))      self.__icons.append(ImageTk.PhotoImage(region))
  '''  初始化地图 存值为0-24  '''  def iniMap(self):    self.__map = [] # 重置地图    tmpRecords = []    records = []    for i in range(0, int(self.__iconKind)):      for j in range(0, 4):        tmpRecords.append(i)
    total = self.__gameSize * self.__gameSize    for x in range(0, total):      index = random.randint(0, total - x - 1)      records.append(tmpRecords[index])      del tmpRecords[index]
    # 一维数组转为二维,y为高维度    for y in range(0, self.__gameSize):      for x in range(0, self.__gameSize):        if x == 0:          self.__map.append([])        self.__map[y].append(records[x + y * self.__gameSize])
  '''  根据地图绘制图像  '''  def drawMap(self):    self.canvas.delete("all")    for y in range(0, self.__gameSize):      for x in range(0, self.__gameSize):        point = self.getOuterLeftTopPoint(Point(x, y))        im = self.canvas.create_image((point.x, point.y),           image=self.__icons[self.__map[y][x]], anchor='nw', tags = 'im%d%d' % (x, y))
  '''  获取内部坐标对应矩形左上角顶点坐标  '''  def getOuterLeftTopPoint(self, point):    return Point(self.getX(point.x), self.getY(point.y))
  '''  获取内部坐标对应矩形中心坐标  '''  def getOuterCenterPoint(self, point):    return Point(self.getX(point.x) + int(self.__iconWidth / 2),         self.getY(point.y) + int(self.__iconHeight / 2))      def getX(self, x):    return x * self.__iconWidth + self.__delta
  def getY(self, y):    return y * self.__iconHeight + self.__delta
  '''  获取内部坐标  '''  def getInnerPoint(self, point):    x = -1    y = -1
    for i in range(0, self.__gameSize):      x1 = self.getX(i)      x2 = self.getX(i + 1)      if point.x >= x1 and point.x < x2:        x = i
    for j in range(0, self.__gameSize):      j1 = self.getY(j)      j2 = self.getY(j + 1)      if point.y >= j1 and point.y < j2:        y = j
    return Point(x, y)
  '''  选择的区域变红,point为内部坐标  '''  def drawSelectedArea(self, point):    pointLT = self.getOuterLeftTopPoint(point)    pointRB = self.getOuterLeftTopPoint(Point(point.x + 1, point.y + 1))    self.canvas.create_rectangle(pointLT.x, pointLT.y,         pointRB.x - 1, pointRB.y - 1, outline = 'red', tags = "rectRedOne")  '''  消除连通的两个块  '''  def ClearLinkedBlocks(self, p1, p2):    self.__map[p1.y][p1.x] = self.EMPTY    self.__map[p2.y][p2.x] = self.EMPTY    self.canvas.delete('im%d%d' % (p1.x, p1.y))    self.canvas.delete('im%d%d' % (p2.x, p2.y))
  '''  地图上该点是否为空  '''  def isEmptyInMap(self, point):    if self.__map[point.y][point.x] == self.EMPTY:      return True    else:      return False
  '''  获取两个点连通类型  '''  def getLinkType(self, p1, p2):    # 首先判断两个方块中图片是否相同    if self.__map[p1.y][p1.x] != self.__map[p2.y][p2.x]:      return { 'type': self.NONE_LINK }
    if self.isStraightLink(p1, p2):      return {        'type': self.STRAIGHT_LINK      }    res = self.isOneCornerLink(p1, p2)    if res:      return {        'type': self.ONE_CORNER_LINK,        'p1': res      }    res = self.isTwoCornerLink(p1, p2)    if res:      return {        'type': self.TWO_CORNER_LINK,        'p1': res['p1'],        'p2': res['p2']      }    return {      'type': self.NONE_LINK    }  '''  直连  '''  def isStraightLink(self, p1, p2):    start = -1    end = -1    # 水平    if p1.y == p2.y:      # 大小判断      if p2.x < p1.x:        start = p2.x        end = p1.x      else:        start = p1.x        end = p2.x      for x in range(start + 1, end):        if self.__map[p1.y][x] != self.EMPTY:          return False      return True    elif p1.x == p2.x:      if p1.y > p2.y:        start = p2.y        end = p1.y      else:        start = p1.y        end = p2.y      for y in range(start + 1, end):        if self.__map[y][p1.x] != self.EMPTY:          return False      return True    return False
  def isOneCornerLink(self, p1, p2):    pointCorner = Point(p1.x, p2.y)    if self.isStraightLink(p1, pointCorner) and self.isStraightLink(pointCorner, p2) and self.isEmptyInMap(pointCorner):      return pointCorner
    pointCorner = Point(p2.x, p1.y)    if self.isStraightLink(p1, pointCorner) and self.isStraightLink(pointCorner, p2) and self.isEmptyInMap(pointCorner):      return pointCorner
  def isTwoCornerLink(self, p1, p2):    for y in range(-1, self.__gameSize + 1):      pointCorner1 = Point(p1.x, y)      pointCorner2 = Point(p2.x, y)      if y == p1.y or y == p2.y:        continue      if y == -1 or y == self.__gameSize:        if self.isStraightLink(p1, pointCorner1) and self.isStraightLink(pointCorner2, p2):          return {'p1': pointCorner1, 'p2': pointCorner2}      else:        if self.isStraightLink(p1, pointCorner1) and self.isStraightLink(pointCorner1, pointCorner2) and self.isStraightLink(pointCorner2, p2) and self.isEmptyInMap(pointCorner1) and self.isEmptyInMap(pointCorner2):          return {'p1': pointCorner1, 'p2': pointCorner2}
    # 横向判断    for x in range(-1, self.__gameSize + 1):      pointCorner1 = Point(x, p1.y)      pointCorner2 = Point(x, p2.y)      if x == p1.x or x == p2.x:        continue      if x == -1 or x == self.__gameSize:        if self.isStraightLink(p1, pointCorner1) and self.isStraightLink(pointCorner2, p2):          return {'p1': pointCorner1, 'p2': pointCorner2}      else:        if self.isStraightLink(p1, pointCorner1) and self.isStraightLink(pointCorner1, pointCorner2) and self.isStraightLink(pointCorner2, p2) and self.isEmptyInMap(pointCorner1) and self.isEmptyInMap(pointCorner2):          return {'p1': pointCorner1, 'p2': pointCorner2}class Point():  def __init__(self, x, y):    self.x = x    self.y = y
  def isUserful(self):    if self.x >= 0 and self.y >= 0:      return True    else:      return False            '''  判断两个点是否相同  '''  def isEqual(self, point):    if self.x == point.x and self.y == point.y:      return True    else:      return False
  '''  克隆一份对象  '''  def clone(self):    return Point(self.x, self.y)  '''  改为另一个对象  '''  def changeTo(self, point):    self.x = point.x    self.y = point.y
m = MainWindow()root.mainloop()

可能大多数的同学想学习Python都是想赚钱,说着听人说学了有用,也有人是因为行业内卷,但是我还是觉得学习任何东西热爱是最好的老师,Python可以实现很多事情,都是很有趣的,让人很有成就感的,所以同学们要跟我一起探索Python的乐趣,热爱它并且学会它哦~

给同学们准备了其他学习资料,需要更多学习资料、软件安装包的同学可以点击链接免费领取 :

https://docs.qq.com/doc/DZmpWZHpqZFFFZGhh?pub=1&dver=2.1.27114328

快来看!我把小时候最喜欢的连连看游戏源代码拿来了~相关推荐

  1. matlab做胶州湾地图,惊了,青岛也有了五环地图,快来看你家在几环?

    原标题:惊了,青岛也有了五环地图,快来看你家在几环? 昨天在网上看到了一个挺好玩又挺有道理的图,这张图把青岛分成了五环.我对这张图进行了调整,画出了下图: 除了青岛这样的海滨城市之外,大部分的城市都有 ...

  2. 葫芦岛市一高中2021年高考成绩查询表,【百姓生活】快来看你所在高中的2019高考排名!葫芦岛文、理科前十名单及成绩出炉!...

    原标题:[百姓生活]快来看你所在高中的2019高考排名!葫芦岛文.理科前十名单及成绩出炉! 2019年高考成绩已公布 几家欢喜几家愁 不止是考生. 葫芦岛理科前十名 第一名687分,来自葫芦岛一高中, ...

  3. 串管理——鸟友们快来看啊——看清楚点

    串管理--鸟友们快来看啊--看清楚点 在内存有限的情况下,应当特别注意串的"繁殖".一种常见的做法是使用+操作符,而这往往会带来问题,如果把多个串通过+操作符连接在一起构成一个串, ...

  4. 串管理——鸟友们快来看啊——看清楚点_悟sphenic_新浪博客

    串管理--鸟友们快来看啊--看清楚点 在内存有限的情况下,应当特别注意串的"繁殖".一种常见的做法是使用+操作符,而这往往会带来问题,如果把多个串通过+操作符连接在一起构成一个串, ...

  5. 几年经验才能算java高级,快来看鸭~

    JAVA教程:高级Java开发人员是什么样的?很多人会用工作年限来衡量软件开发人员是否达到高级的水平,很多人认为是5年以上才能达到高级;也有人认为多年的经验只是一个数字,真正重要的是知识.技能和应用经 ...

  6. 统计扣分加分java_再也不怕违章扣分了,驾照也能够加分,最高+21分!快来看怎么加...

    想必大家知道交通违章行为会被扣分的,而且扣满了12分还要重新去学科一,更严重的还会吊销驾照,而我们知道开车上路难免会被扣分,一扣再一扣12分就没有了,很多车主都担心自己的分扣着扣着就扣完了.有驾照的朋 ...

  7. EA出品的java射击类游戏,盘点五款射击类RPG游戏:你喜欢这类型游戏吗?

    盘点五款射击类RPG游戏:你喜欢这类型游戏吗? 2020-06-04 18:04:06 3点赞 10收藏 3评论 RPG这种类型的游戏有很多,也是有许多玩家的喜欢.说到射击类型与RPG相结合的游戏,不 ...

  8. 如何使用Unity制作一款自己喜欢玩的游戏demo(Unity萌新的进阶技巧)

    相信每个Unity萌新手机上都有一款自己喜欢玩的游戏. 本文将描述自己做的一款模拟[崩坏3]手游demo的一点经验.(安卓端) 首先需要熟练组件的应用,说白了就是跟据你游戏的类型,需要使用哪些API. ...

  9. xp好还是vista好_在XP,Vista和Windows 7中播放您喜欢的DOS游戏

    xp好还是vista好 Want to take a trip down memory lane with old school DOS games?  D-Fend Reloaded makes i ...

  10. Python版基于pygame的玛丽快跑小游戏源代码,玛丽冒险小游戏代码,支持双人模式

    基于pygame的玛丽快跑小游戏源代码,玛丽冒险小游戏代码,支持双人模式 按空格进入单人模式,按't'进入双人模式,双人模式下玛丽1采用空格键上跳,玛丽2采用方向上键上跳. 完整代码下载地址:Pyth ...

最新文章

  1. 2011年软考网络工程师全面复习资料汇总
  2. SAP批次级别的意义及启用操作
  3. Python:赋值语句和布尔值
  4. 安规电容能用什么代替_电容系列之安规电容
  5. c++中,可以用类名直接访问非静态成员函数?
  6. 小狼毫(Rime)输入法设置Shift直接上屏英文字符并切换为英文状态方法
  7. Amplify Shader Editor手册
  8. Doris ODBC外表使用
  9. 苹果电脑安装计算机一级,偷天换日!让普通笔记本安装苹果系统
  10. python爬虫之爬取招聘岗位信息
  11. 排序算法的稳定性和在位性
  12. 电脑登录qq了为什么找不到服务器,为什么电脑可以登QQ却上不了网? 了解电脑问题所在...
  13. 用最生动的语言重现经典!听我细细道来冯·诺依曼体系结构
  14. 人生有时需要“跳一跳”
  15. Excel设置背景页码
  16. Java生成条形码PDF文件【可批量】
  17. 五月的仓颉大神写的 三年java程序员面试感悟 分享给大家
  18. C语言字符串指针(指向字符串的指针)详解
  19. AE已支持M1芯片mac安装(After Effects 20直装版M1安装方法)M1芯片处理器安装AE问题教程
  20. VSCode快捷键的使用

热门文章

  1. 多元统计分析基于r课后答案_(完整版)多元统计分析课后练习答案
  2. 宿舍管理系统(简单版)
  3. 【前端】倒计时、秒杀、定时器
  4. (php毕业设计)基于php旅游信息网站管理系统源码
  5. (10)Zoomit完整快捷键总结:PC端PPT演示辅助工具
  6. 双击运行 jar 文件
  7. Mac 终端运行jar文件
  8. 浪潮服务器安装ESXI6.7 无raid驱动解决方案
  9. 计算机图形学——大作业
  10. Android源码下载编译(高通)