2163浏览
查看: 2163|回复: 4

[项目] 志童道合 | 行空憋死牛

[复制链接]
本帖最后由 云天 于 2022-12-2 13:45 编辑

【项目背景】
志童道合 | 行空憋死牛图1


我的老家在东北,出生在80年代,小时候闲暇之余也没有现代生活中这样丰富多彩的娱乐活动,娱乐方式的缺乏导致了“憋死牛”、“五子棋”、“玻璃弹珠”等一批对物质条件要求很低,而又随时随地可以进行的简易游戏。然而,随着社会生产力的不断进步、人们生活节奏的不断加快,“憋死牛”等“古老”的游戏逐渐开始不能满足人们对娱乐活动的感官要求,随着时间的推移,这些产生于过去的游戏将会慢慢淡出历史舞台。
今天我将用行空板将“憋死牛”游戏复活,并实现人与机器对战。
【憋死牛】
憋死牛又名“老虎吃食”,是中国民间棋类游戏,流行于东北、华北等地。憋死牛”的别称极多,诸如“憋死猫”“裤档棋”“剪子棋”“区字棋”“冈字棋”“堵茅坑”“茅坑棋”“走井”“跳枯井棋”“老虎吃食”“瞎子跳井”“蛤蟆跳井”“走牛脚塞”等。
志童道合 | 行空憋死牛图3



民间棋类游戏是游戏的一大分支,既有趣又能锻炼孩子的思维能力。它在给幼儿带来快乐、丰富幼儿游戏生活的同时能促进幼儿身体、认知、社会性、良好个性及意志品质等的发展。
志童道合 | 行空憋死牛图2

先在地上画一个大大的“区”字作为棋盘,再在“区”字右侧的两个角之间画一个圆圈作为“井”,这眼“井”在后面的走棋过程中是不可以逾越的。对弈双方各执两枚棋子,棋子一般都是就地取材。你用两片贝壳,我就用两块瓦片;你用两片树叶,我就用两粒石子,总之是有所区别就行了。每人所执的那两枚棋子就是所谓的“牛”。
【游戏规则】
1.剪刀石头布规定谁赢了谁先走;
2.每次每人只走一步,轮流走棋;
3.每次只可移动自己的其中一个棋子;
4.每个点位只允许存在一个棋子;
5.有“井”的那条路不能走;
5.一方把另一方的两头牛都“憋”死不能移动,就赢了;
6.开局第一步,不能将对方“憋死”。
棋规儿歌:棋盘两座山,红蓝上下站。沿线一步空位走,憋住对方是好汉。
【制作按钮】
受“带LED灯的数字按钮”的启发,制作一个LED灯加按钮,实现按下按钮灯亮灯熄,且可独立用程序控制灯的颜色及亮灭。

1、灯与按钮位置关系

灯在上,按钮在下,用热熔胶粘在一起。

志童道合 | 行空憋死牛图4

2、制作半透明罩,方便按压。

志童道合 | 行空憋死牛图5
3、使用micro:bit主板测试按钮

【硬件连接】

LED灯串接在一起形成灯带,接扩展板引脚P0,5个按钮分别接引脚P12,P13,P14,P15,P16。

志童道合 | 行空憋死牛图6

【制作外壳】

志童道合 | 行空憋死牛图8


志童道合 | 行空憋死牛图9


志童道合 | 行空憋死牛图7

【美化棋盘】

标识棋子位置、“井”及棋路。

志童道合 | 行空憋死牛图10


【安装摄像头】
摄像头用于游戏开始第一步,“剪刀石头布”定谁赢了谁先走。
志童道合 | 行空憋死牛图29

【程序编写】
1、棋盘初始化



志童道合 | 行空憋死牛图11
列表“位置状态”,用于标记棋盘相应棋子位置现在是“红棋子”还是“蓝棋子”。
2、落红棋子
志童道合 | 行空憋死牛图12
如果相应按钮被按下,通过以下程序“状态判断”,决定“红棋子”落下状态。
3、红棋子“状态判断”
志童道合 | 行空憋死牛图13
先熄灭一个红棋子,才能走”空位“,让空位处亮灯(红棋子)。第一步不能将对方”憋死“。
4、落蓝棋子
志童道合 | 行空憋死牛图14
如第一步蓝棋先手,不能将红棋一步”憋死“,棋路固定。之后等红棋子落下后,开始自动落蓝棋子,其中一个重要规则是:不能将自己的两个棋子横向摆放!所以机器方(蓝棋)从来不会输。
5、判胜负
志童道合 | 行空憋死牛图15
志童道合 | 行空憋死牛图16
因机器方(蓝棋)从来不会输,所以只需判定红方的”输状态“即可。蓝方胜,闪烁。
志童道合 | 行空憋死牛图30
蓝棋“憋死”红棋
志童道合 | 行空憋死牛图31
屏幕显示“蓝方胜”,棋盘灯闪烁。
6、演示视频
手动设置红方先手

7、识别“剪刀石头布”
开局,玩家(红棋)与机器方(蓝棋)通过”剪刀石头布”,决定谁先走第一步。
识别“剪刀石头布”是通过Google Teachable Machine,Google Teachable Machine是Google免费的无代码深度学习模型创建网络平台。使用该平台你可以构建模型来对图像,音频甚至姿势进行分类。完成上述操作后,你可以下载经过训练的模型并将其用于你的应用程序。你可以使用Tensorflow或PyTorch之类的框架来构建自定义的卷积神经网络,或者如果你想要一种简单的无代码方式进行此操作,则可以使用 Google Teachable Machine(https://teachablemachine.withgoogle.com/)平台为你完成相同的操作。
8、国内可通过英荔 AI 训练平台:
https://train.aimaker.space/train/image
训练过程比较简单,不再过多介绍。
志童道合 | 行空憋死牛图19志童道合 | 行空憋死牛图17志童道合 | 行空憋死牛图18
采集“剪刀石头布”图像。
志童道合 | 行空憋死牛图20
训练模型
志童道合 | 行空憋死牛图21
下载模型,并将模型文件“keras_model.h5”,放到行空板程序所在目录下。
志童道合 | 行空憋死牛图22
利用棋盘上的灯,显示机器的“剪刀石头布”。
志童道合 | 行空憋死牛图23
初始化
志童道合 | 行空憋死牛图24
导入相应库,驱动摄像头,加载模型。
9、主程序
志童道合 | 行空憋死牛图25
10、测试
志童道合 | 行空憋死牛图26
机器胜
志童道合 | 行空憋死牛图27

志童道合 | 行空憋死牛图28
机器方(蓝棋)先手。
【演示视频】
“剪刀石头布”开局演示
【制作反思】
1、程序采用图形化,不够简洁
2、内部逻辑有待完善,如禁止红方困住的棋子跳出。
【游戏目的】
1、“憋死牛”游戏规则简单,集合了知识性、趣味性、竞技性的特点,在游戏中可以培养幼儿独立思考的能力,锻炼思维,启迪智慧,能让小朋友们乐在“棋”中,感受到“棋”乐无穷的游戏乐趣!
2、通过憋死牛游戏发展幼儿做事情的耐性,让孩子从小养成细心的习惯,逐步培养孩子找规律和推理的意识。
【游戏规律】
只要你不让自己的两头“牛”同时走到“区”字上下两条横线的两个端点上,那对方就永远拿你没办法。明白了这个诀窍之后,我的“牛”便再也没有被“憋死”过。

【Python源代码】
  1. #  -*- coding: UTF-8 -*-
  2. # MindPlus
  3. # Python
  4. from pinpong.extension.unihiker import *
  5. from keras.preprocessing import image
  6. from pinpong.board import Board,Pin
  7. from pinpong.board import NeoPixel
  8. import tensorflow.keras
  9. import tensorflow as tf
  10. from unihiker import GUI
  11. from time import sleep
  12. import numpy as np
  13. import random
  14. import time
  15. # 自定义函数
  16. def QiPanChuShiHua():
  17.     global  WeiZhiZhuangTai,ZhuangTaiBiaoShi,np1,XuHao
  18.     global p_p12_in,p_p13_in,p_p14_in,p_p15_in,p_p16_in
  19.     global HongZi,LuoHongZiWanCheng,DiYiBu
  20.     global ShangGeHongZiWeiZhi,KongZiWeiZhi, QianLiLuoZiWeiZhi
  21.     WeiZhiZhuangTai = [2, 2, 1,1,0]
  22.     ZhuangTaiBiaoShi = [0, 0,0,0,0]
  23.     global 显示
  24.     np1[0] = (255,0,0)
  25.     np1[1] = (255,0,0)
  26.     np1[2] = (0,0,255)
  27.     np1[3] = (0,0,255)
  28.     np1[4] = (0,0,0)
  29.     XuHao = 0
  30.     HongZi = 2
  31.     LuoHongZiWanCheng = 0
  32.     QianLiLuoZiWeiZhi = -1
  33.     KongZiWeiZhi = 4
  34.     显示.config(text="憋死牛")
  35.     time.sleep(5)
  36. def LuoLanZi():
  37.     global QianLiLuoZiWeiZhi,LuoHongZiWanCheng,KongZiWeiZhi
  38.     global DiYiBu
  39.     if (DiYiBu == 2):
  40.         DiYiBu = 0
  41.         np1[2] = (0,0,0)
  42.         np1[4] = (0,0,255)
  43.         WeiZhiZhuangTai[2]=0
  44.         WeiZhiZhuangTai[4]=1
  45.     else:
  46.         if (LuoHongZiWanCheng == 1):
  47.             QianLiLuoZiWeiZhi = -1
  48.             LuoHongZiWanCheng = 0
  49.             if (KongZiWeiZhi == 4):
  50.                 if ((WeiZhiZhuangTai[3]) == 1):
  51.                     np1[3] = (0,0,0)
  52.                     np1[4] = (0,0,255)
  53.                     WeiZhiZhuangTai[3]=0
  54.                     WeiZhiZhuangTai[4]=1
  55.                 elif ((WeiZhiZhuangTai[0]) == 1):
  56.                     np1[0] = (0,0,0)
  57.                     np1[4] = (0,0,255)
  58.                     WeiZhiZhuangTai[0]=0
  59.                     WeiZhiZhuangTai[4]=1
  60.                 elif ((WeiZhiZhuangTai[2]) == 1):
  61.                     np1[2] = (0,0,0)
  62.                     np1[4] = (0,0,255)
  63.                     WeiZhiZhuangTai[2]=0
  64.                     WeiZhiZhuangTai[4]=1
  65.                 elif ((WeiZhiZhuangTai[1]) == 1):
  66.                     np1[1] = (0,0,0)
  67.                     np1[4] = (0,0,255)
  68.                     WeiZhiZhuangTai[1]=0
  69.                     WeiZhiZhuangTai[4]=1
  70.             elif (KongZiWeiZhi == 3):
  71.                 if ((WeiZhiZhuangTai[2]) == 1):
  72.                     np1[2] = (0,0,0)
  73.                     np1[3] = (0,0,255)
  74.                     WeiZhiZhuangTai[2]=0
  75.                     WeiZhiZhuangTai[3]=1
  76.                 elif ((WeiZhiZhuangTai[4]) == 1):
  77.                     np1[4] = (0,0,0)
  78.                     np1[3] = (0,0,255)
  79.                     WeiZhiZhuangTai[4]=0
  80.                     WeiZhiZhuangTai[3]=1
  81.             elif (KongZiWeiZhi == 2):
  82.                 if ((WeiZhiZhuangTai[3]) == 1):
  83.                     np1[3] = (0,0,0)
  84.                     np1[2] = (0,0,255)
  85.                     WeiZhiZhuangTai[3]=0
  86.                     WeiZhiZhuangTai[2]=1
  87.                 elif ((WeiZhiZhuangTai[1]) == 1):
  88.                     np1[1] = (0,0,0)
  89.                     np1[2] = (0,0,255)
  90.                     WeiZhiZhuangTai[1]=0
  91.                     WeiZhiZhuangTai[2]=1
  92.                 elif ((WeiZhiZhuangTai[4]) == 1):
  93.                     np1[4] = (0,0,0)
  94.                     np1[2] = (0,0,255)
  95.                     WeiZhiZhuangTai[4]=0
  96.                     WeiZhiZhuangTai[2]=1
  97.             elif (KongZiWeiZhi == 1):
  98.                 if ((WeiZhiZhuangTai[0]) == 1):
  99.                     np1[0] = (0,0,0)
  100.                     np1[1] = (0,0,255)
  101.                     WeiZhiZhuangTai[0]=0
  102.                     WeiZhiZhuangTai[1]=1
  103.                 elif ((WeiZhiZhuangTai[2]) == 1):
  104.                     np1[2] = (0,0,0)
  105.                     np1[1] = (0,0,255)
  106.                     WeiZhiZhuangTai[2]=0
  107.                     WeiZhiZhuangTai[1]=1
  108.                 elif ((WeiZhiZhuangTai[4]) == 1):
  109.                     np1[4] = (0,0,0)
  110.                     np1[1] = (0,0,255)
  111.                     WeiZhiZhuangTai[4]=0
  112.                     WeiZhiZhuangTai[1]=1
  113.             elif (KongZiWeiZhi == 0):
  114.                 if ((WeiZhiZhuangTai[1]) == 1):
  115.                     np1[1] = (0,0,0)
  116.                     np1[0] = (0,0,255)
  117.                     WeiZhiZhuangTai[1]=0
  118.                     WeiZhiZhuangTai[0]=1
  119.                 elif ((WeiZhiZhuangTai[4]) == 1):
  120.                     np1[4] = (0,0,0)
  121.                     np1[0] = (0,0,255)
  122.                     WeiZhiZhuangTai[4]=0
  123.                     WeiZhiZhuangTai[0]=1
  124. def ZhuangTaiPanDuan():
  125.     global  XuHao,HongZi,LuoHongZiWanCheng,DiYiBu
  126.     global QianLiLuoZiWeiZhi,KongZiWeiZhi
  127.     if ((ZhuangTaiBiaoShi[XuHao]) == 0):
  128.         ZhuangTaiBiaoShi[XuHao]=1
  129.         if ((WeiZhiZhuangTai[XuHao]) == 0):
  130.             if (HongZi == 1):
  131.                 if (not (QianLiLuoZiWeiZhi == XuHao)):
  132.                     QianLiLuoZiWeiZhi = XuHao
  133.                     np1[XuHao] = (255,0,0)
  134.                     WeiZhiZhuangTai[XuHao]=2
  135.                     HongZi = 2
  136.                     LuoHongZiWanCheng = 1
  137.         elif ((WeiZhiZhuangTai[XuHao]) == 2):
  138.             if (HongZi == 2):
  139.                 if (DiYiBu == 1):
  140.                     if (XuHao == 1):
  141.                         DiYiBu = 0
  142.                         np1[XuHao] = (0,0,0)
  143.                         WeiZhiZhuangTai[XuHao]=0
  144.                         HongZi = 1
  145.                         QianLiLuoZiWeiZhi = XuHao
  146.                         KongZiWeiZhi = XuHao
  147.                 else:
  148.                     if (not (QianLiLuoZiWeiZhi == XuHao)):
  149.                         QianLiLuoZiWeiZhi = XuHao
  150.                         np1[XuHao] = (0,0,0)
  151.                         WeiZhiZhuangTai[XuHao]=0
  152.                         HongZi = 1
  153.                         KongZiWeiZhi = XuHao
  154. def HuiFuDeng():
  155.     np1[0] = (0,0,0)
  156.     np1[1] = (0,0,0)
  157.     np1[2] = (0,0,0)
  158.     np1[3] = (0,0,0)
  159.     np1[4] = (0,0,0)
  160. def ShanShuo():
  161.     time.sleep(3)
  162.     while not ((button_a.is_pressed()==True)):
  163.         np1[0] = (0,0,255)
  164.         np1[1] = (0,0,255)
  165.         np1[2] = (0,0,255)
  166.         np1[3] = (0,0,255)
  167.         np1[4] = (0,0,255)
  168.         time.sleep(0.1)
  169.         np1[0] = (0,0,0)
  170.         np1[1] = (0,0,0)
  171.         np1[2] = (0,0,0)
  172.         np1[3] = (0,0,0)
  173.         np1[4] = (0,0,0)
  174.         time.sleep(0.1)
  175.     QiPanChuShiHua()
  176. def PanShengFu():
  177.     global 显示
  178.     global KongZiWeiZhi
  179.     WeiZhi0ZhuangTai = ((WeiZhiZhuangTai[0]) == 2)
  180.     WeiZhi1ZhuangTai = ((WeiZhiZhuangTai[1]) == 2)
  181.     WeiZhi2ZhuangTai = ((WeiZhiZhuangTai[2]) == 2)
  182.     WeiZhi3ZhuangTai = ((WeiZhiZhuangTai[3]) == 2)
  183.     WeiZhi4ZhuangTai = ((WeiZhiZhuangTai[4]) == 1)
  184.     if ((WeiZhi0ZhuangTai == 1) and ((WeiZhi1ZhuangTai == 1) and (WeiZhi4ZhuangTai == 1))):
  185.         if (KongZiWeiZhi == 3):
  186.             显示.config(text="蓝方胜")
  187.             ShanShuo()
  188.     elif ((WeiZhi2ZhuangTai == 1) and ((WeiZhi3ZhuangTai == 1) and (WeiZhi4ZhuangTai == 1))):
  189.         if (KongZiWeiZhi == 0):
  190.             显示.config(text="蓝方胜")
  191.             ShanShuo()
  192. def ShiTou():
  193.     np1[0] = (0,0,0)
  194.     np1[1] = (0,0,0)
  195.     np1[2] = (0,0,0)
  196.     np1[3] = (0,0,0)
  197.     np1[4] = (255,255,0)
  198. def JianDao():
  199.     np1[0] = (255,255,0)
  200.     np1[1] = (255,255,0)
  201.     np1[2] = (0,0,0)
  202.     np1[3] = (0,0,0)
  203.     np1[4] = (255,255,0)
  204. def Bu():
  205.     np1[0] = (255,255,0)
  206.     np1[1] = (255,255,0)
  207.     np1[2] = (255,255,0)
  208.     np1[3] = (255,255,0)
  209.     np1[4] = (255,255,0)
  210. def LuoHongZi():
  211.     global XuHao
  212.     XuHao = 0
  213.     if (p_p12_in.read_digital()==True):
  214.         ZhuangTaiPanDuan()
  215.     else:
  216.         ZhuangTaiBiaoShi[XuHao]=0
  217.     XuHao = 1
  218.     if (p_p13_in.read_digital()==True):
  219.         ZhuangTaiPanDuan()
  220.     else:
  221.         ZhuangTaiBiaoShi[XuHao]=0
  222.     XuHao = 2
  223.     if (p_p14_in.read_digital()==True):
  224.         ZhuangTaiPanDuan()
  225.     else:
  226.         ZhuangTaiBiaoShi[XuHao]=0
  227.     XuHao = 3
  228.     if (p_p15_in.read_digital()==True):
  229.         ZhuangTaiPanDuan()
  230.     else:
  231.         ZhuangTaiBiaoShi[XuHao]=0
  232.     XuHao = 4
  233.     if (p_p16_in.read_digital()==True):
  234.         ZhuangTaiPanDuan()
  235.     else:
  236.         ZhuangTaiBiaoShi[XuHao]=0
  237. Board().begin()
  238. u_gui=GUI()
  239. import cv2
  240. p_p12_in=Pin(Pin.P12, Pin.IN)
  241. p_p13_in=Pin(Pin.P13, Pin.IN)
  242. p_p14_in=Pin(Pin.P14, Pin.IN)
  243. p_p15_in=Pin(Pin.P15, Pin.IN)
  244. p_p16_in=Pin(Pin.P16, Pin.IN)
  245. cap = cv2.VideoCapture()
  246. cap.open(0)
  247. cap.set(cv2.CAP_PROP_FPS, 1)#帧数
  248. cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)  #设置摄像头图像宽度
  249. cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) #设置摄像头图像高度
  250. cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)     #设置OpenCV内部的图像缓存,可以极大提高图像的实时性。
  251. cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
  252. model = tensorflow.keras.models.load_model('keras_model.h5')
  253. labels = ['Rock','scissors','paper','background']
  254. font = cv2.FONT_HERSHEY_SIMPLEX
  255. success = True
  256. image = 0
  257. cv2.namedWindow('Frame',cv2.WND_PROP_FULLSCREEN)    #窗口全屏
  258. cv2.setWindowProperty('Frame', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)   #窗口全屏
  259. pin1=Pin(Pin.P0, Pin.OUT)
  260. np1 = NeoPixel(pin1,5)
  261. Bu()
  262. time.sleep(3)
  263. HuiFuDeng()
  264. while not (False):
  265.     success, image = cap.read()
  266.     if (success == False):
  267.         break
  268.     image = cv2.flip(image,1)
  269.     img = cv2.resize(image,(224,224))
  270.     image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE) #旋转屏幕
  271.     img = np.array(img,dtype=np.float32)
  272.     img = np.expand_dims(img,axis=0)
  273.     img = (img / 255)
  274.     prediction = model.predict(img)
  275.     predicted_class = labels[np.argmax(prediction)]
  276.     SuiJiShu = (random.randint(1, 3))
  277.     print(predicted_class)
  278.     if (predicted_class == "Rock"):
  279.         if (SuiJiShu == 1):
  280.             ShiTou()
  281.             win = "Draw"
  282.             cv2.putText(image, win, (20,130), font, 2, (0,255,0), 3)
  283.             cv2.imshow("Frame", image)
  284.             for index in range(5):
  285.                 buzzer.pitch(131,4)
  286.         elif (SuiJiShu == 2):
  287.             JianDao()
  288.             win = "Red Win"
  289.             cv2.putText(image, win, (20,130), font, 2, (0,255,0), 3)
  290.             cv2.imshow("Frame", image)
  291.             DiYiBu = 1
  292.             time.sleep(5)
  293.             break
  294.         else:
  295.             Bu()
  296.             win = "Blue Win"
  297.             cv2.putText(image, win, (20,130), font, 2, (0,255,0), 3)
  298.             cv2.imshow("Frame", image)
  299.             DiYiBu = 2
  300.             time.sleep(5)
  301.             break
  302.     if (predicted_class == "paper"):
  303.         if (SuiJiShu == 1):
  304.             ShiTou()
  305.             win = "Blue Win"
  306.             cv2.putText(image, win, (20,130), font, 2, (0,255,0), 3)
  307.             cv2.imshow("Frame", image)
  308.             DiYiBu = 2
  309.             time.sleep(5)
  310.             break
  311.         elif (SuiJiShu == 2):
  312.             JianDao()
  313.             win = "Draw"
  314.             cv2.putText(image, win, (20,130), font, 2, (0,255,0), 3)
  315.             cv2.imshow("Frame", image)
  316.             for index in range(5):
  317.                 buzzer.pitch(131,4)
  318.         else:
  319.             Bu()
  320.             win = "Red Win"
  321.             cv2.putText(image, win, (20,130), font, 2, (0,255,0), 3)
  322.             cv2.imshow("Frame", image)
  323.             DiYiBu = 1
  324.             time.sleep(5)
  325.             break
  326.     if (predicted_class == "scissors"):
  327.         if (SuiJiShu == 1):
  328.             ShiTou()
  329.             win = "Red Win"
  330.             cv2.putText(image, win, (20,130), font, 2, (0,255,0), 3)
  331.             cv2.imshow("Frame", image)
  332.             DiYiBu = 1
  333.             time.sleep(5)
  334.             break
  335.         elif (SuiJiShu == 2):
  336.             JianDao()
  337.             win = "Blue Win"
  338.             cv2.putText(image, win, (20,130), font, 2, (0,255,0), 3)
  339.             cv2.imshow("Frame", image)
  340.             DiYiBu = 2
  341.             time.sleep(5)
  342.             break
  343.         else:
  344.             Bu()
  345.             win = "Draw"
  346.             cv2.putText(image, win, (20,130), font, 2, (0,255,0), 3)
  347.             cv2.imshow("Frame", image)
  348.             for index in range(5):
  349.                 buzzer.pitch(131,4)
  350.     cv2.imshow("Frame", image)
  351.     if cv2.waitKey(1) & 0xff== 113:
  352.         break
  353. cap.release()
  354. cv2.destroyAllWindows()
  355. 显示=u_gui.draw_text(text="憋死牛",x=10,y=130,font_size=50, color="#0000FF")
  356. QiPanChuShiHua()
  357. while True:
  358.     LuoHongZi()
  359.     PanShengFu()
  360.     LuoLanZi()
复制代码






木子呢  管理员

发表于 2022-12-2 14:12:14

不错不错
回复

使用道具 举报

Doughnut  高级技师

发表于 2022-12-2 14:20:37

益智小游戏也那么有意思
回复

使用道具 举报

rzyzzxw  版主

发表于 2022-12-2 18:44:08

厉害厉害
回复

使用道具 举报

rzegkly  版主

发表于 2022-12-5 09:40:49

学习
MonDecember-202212053774..png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail