本帖最后由 贰逼 于 2015-1-11 10:04 编辑

这是一个利用计分板计算的分位系统,能将计分板数值各个位数数字隔离,并红石进行输出













下载地址:
http://pan.baidu.com/s/1pJmclmz使用时请使用↓改变分数(默认为0)
  1. /scoreboard players set Score score 分数
复制代码



原理:
首先,由于机械看似庞大,所以我们以数值的方式先来探讨。

下面是一个符合本机械原理的C语言程序
  1. #include<stdio.h>
  2. void main()
  3. {
  4.         int a = 1 , b = 0 ;
  5.         int c ;
  6.         int d[16] ;

  7.         printf ("请输入正整数。\n") ;
  8.         scanf ("%d", &c) ;

  9.         if (c<0)
  10.         {
  11.                 c = -c ;
  12.                 printf ("-") ;
  13.         }

  14.         while (c/a != 0)
  15.         {
  16.                 d[b] = (c/a)%10 ;
  17.                 b = b*10 ;
  18.                 b++ ;
  19.         }

  20.         b-- ;

  21.         for (; d >=0 ; b--)
  22.         {
  23.                 printf ("%d", d) ;
  24.                 printf ("\n") ;
  25.         }
  26. }
复制代码
关于创建变量、赋值、判断正负和先是顺序问题暂且不提,我们主要来看下面的主要部分:
  1. while (c/a != 0)
  2. {
  3. d[b] = (c/a)%10 ;
  4. b = b*10 ;
  5. b++ ;
  6. }
复制代码
while即对应一个循环脉冲,
而循环的内容就是以下数值处理,也就是主原理:
一个位的数值=(这个数/10^需要求的位数)%10




准备工作:

储存各个位数数字及假名:
变量d是一个含有假名的变量储存单位,也就是我们可以利用假名来储存各个数字。
b则是不断变化的假名,由于计分板无法控制加名,所以只能预先创建假名。
所以为迎合long的要求,我们创建了s1~s16这16个假名分别储存1-16位数字(事实上积分版只能精确到十位[long int])
并且给每个都设值,从s1-s16都设为0,方便清零

指令分别为:
  1. /scoreboard players set s1 n 0
复制代码
  1. /scoreboard players set s2 n 0
复制代码
:
:
  1. /scoreboard players set s16 n 0
复制代码
  1. /scoreboard players set sn n 0
复制代码

将储存量(假名)全部清零。

设置除数:
为了方便计算,我们仍然采用假名参与计算。
10^1~10^16的值就分别为10^1~10^16

指令为:
  1. /scoreboard players set 10 n 10
复制代码
  1. /scoreboard players set 100 n 100
复制代码


  1. /scoreboard players set 1000000000000000 n 1000000000000000
复制代码
  1. /scoreboard players set 10^n n 10^n
复制代码

将除数设为相应值。



准备工作做完了,我们接下来进行主部分和测试


测试:

清零

个位


个位2


双位数








全值123456789
全部能实现

主要部分:
接下来,我们就要实现公式:
一个位的数值=(这个数/10^需要求的位数)%10

于是我们将一个公式程序分成了三个/四个部分


对于个位为三个(直接求余),对于其他位为四个(除以相应除数并求余)

黄色部分:
  1. /scoreboard players operation sn num = Score score
复制代码
让sn的值==分数

一刻延迟连接:
红色部分:
  1. /scoreboard players operation sn num %= 10 num
复制代码
除以十求余
但如果不是分离出个位,

绿色在上,红色在下,
绿色:
  1. /scoreboard players operation sn num %= 10^n num
复制代码
首先要除以相应除数,而个位可以直接省略
接下来一刻延迟连接蓝色:

蓝色分别为:

  1. /scoreboard players test sn num 0 0
复制代码
  1. /scoreboard players test sn num 1 1
复制代码
:
:
  1. /scoreboard players test sn num 9 9
复制代码
也就是分别探测数值0-9进行比较器输出





将这n个(本作为16个)部分全部连接,在起始端:

设置一个单刻脉冲进行输出。脉冲持续时间越短,关于比较起的探测就会越精确。


关注贰逼,关注指令方块!
我的索引贴


@songfeitong @tyson @我的世界sun123 @PotatoMaster101 @ghyzhi10086 @审奥不解释 @67880371@kongbaiyo@zhjjhz


[groupid=546]Command Block Logic[/groupid]