您现在所在的位置:首页 >关于奇酷 > 媒体报道 > Python版羊了个羊,代码不到100行

Python版羊了个羊,代码不到100行

来源:奇酷教育 发表于:

Python版羊了个羊,代码不到100行

  Python版羊了个羊,代码也很简单,一共不到100行。代码已开源:
 
  python666.cn/c/8
 
 
  1.
 
  游戏用了 pygame-zero 这个库(所以才能这么少的代码实现),运行前需要安装 pgzero 库:
 
  pip install pgzero
  (或者通过 IDE 安装)
 
 
  2.
 
  运行时需要带上项目里的 images 和 music 文件夹(你可以替换里面的图片和音乐)
 
 
  3.
 
  每一张牌是一个 Actor 对象(相当于一般游戏开发中的精灵类),具有种类(12种各12张)、层级、状态(不可点/可点/已收集)等属性。
 
  开局时随机打乱后摆放,根据种类显示不同图片。
 
  除了最上层的牌可点,其余均不可点。
 
  # 初始化牌组,12*12张牌随机打乱
  ts = list(range(1, 13))*12
  random.shuffle(ts)
  n = 0
  for k in range(7):    # 7层
      for i in range(7-k):    #每层减1行
          for j in range(7-k):
              t = ts[n]        #获取排种类
              n += 1
              tile = Actor(f'tile{t}')       #使用tileX图片创建Actor对象
              tile.pos = 120 + (k * 0.5 + j) * tile.width, 100 + (k * 0.5 + i) * tile.height * 0.9    #设定位置
              tile.tag = t            #记录种类
              tile.layer = k          #记录层级
              tile.status = 1 if k == 6 else 0        #除了最顶层,状态都设置为0(不可点)这里是个简化实现
              tiles.append(tile)
 
  4.
 
  判断鼠标点击的位置是否处于某张可点的牌内,是的话就从所有牌列表中移除,加到下方牌堆列表里。
 
  然后遍历与这张牌有重叠的下一层牌,对于每张下层牌,反过来检查是否有其他上层牌覆盖它,如果没有,就把它变成可点。
 
  for tile in reversed(tiles):    #逆序循环是为了先判断上方的牌,如果点击了就直接跳出,避免重复判定
      if tile.status == 1 and tile.collidepoint(pos):
          # 状态1可点,并且鼠标在范围内
          tile.status = 2
          tiles.remove(tile)
          diff = [t for t in docks if t.tag != tile.tag]    #获取牌堆内不相同的牌
          if len(docks) - len(diff) < 2:    #如果相同的牌数量<2,就加进牌堆
              docks.append(tile)
          else:             #否则用不相同的牌替换牌堆(即消除相同的牌)
              docks = diff
          for down in tiles:      #遍历所有的牌
              if down.layer == tile.layer - 1 and down.colliderect(tile):   #如果在此牌的下一层,并且有重叠
                  for up in tiles:      #那就再反过来判断这种被覆盖的牌,是否还有其他牌覆盖它
                      if up.layer == down.layer + 1 and up.colliderect(down):     #如果有就跳出
                          break
                  else:      #如果全都没有,说明它变成了可点状态
                      down.status = 1
          return
 
  5.
 
  下方牌堆达到7张为失败,上方没有剩牌则为胜利
 
  # 达到7张,失败
  if len(docks) >= 7:
      screen.blit('end', (0, 0))
  # 没有剩牌,胜利
  if len(tiles) == 0:
      screen.blit('win', (0, 0))
 
  6.
 
  本demo距离《羊了个羊》尚有改进空间,有兴趣的小伙伴可自行尝试扩展,包括但不限于:
 
  道具功能
 
  增加收牌的动画效果(可以用 pgzero 提供的 animate 方法)
 
  更多的关卡布局
 
  打包成exe
 
  游戏排行榜
 
  当然还有游戏最最核心的部分:观看广告
 
  代码已开源:
  python666.cn/c/8