123456789=15另一种

该程序通过随机生成不重复的1-9数字并排列成满足每行、每列及两条对角线之和均为15的九宫格,实现了数学计算题的自动生成。代码中使用了循环和条件判断来确保生成的数字符合九宫格的要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Collections.Generic;
using System.Text;

namespace 计算题
{
    class Program
    {
        static int[] num ={0,0,0,0,0,0,0,0,0};
        static int tab=0;
      
        static void Main(string[] args)
        {
            ///隨機生成不重複1-9的九個數字
            Random rd=new Random();
            int n=0;
            while (n < 9)
            {
                tab=rd.Next(0, 10);
                bool y = true;
                for (int i = 0; i < num.Length; i++)
                {
                    if (tab == num[i])
                    {
                        i=num.Length;
                        n--;
                        y = false;
                    }
                }
                if (y)
                    num[n] =tab;
                n++;               
            }
            ///每行相加等15
            tabR(0);
            if (!tabR(1))
            {
                for (int i = 0; i < 8; i++)
                {
                    for (int j = i + 1; j < 8; j++)
                        if (15 == (num[0] + num[i + 1] + num[j + 1]))
                        {
                            tab = num[1];
                            num[1] = num[i + 1];
                            num[i + 1] = tab;

                            tab = num[2];
                            num[2] = num[j + 1];
                            num[j + 1] = tab;
                        }

                }
                tabR(1);
            }
            ///每列相加等15
            tabC(0);
            if (!tabC(1))
            {
                for (int i = 3; i < 6; i++)
                {
                    for (int j = 7; j < 9; j++)
                    {
                        if (15 == (num[0] + num[i] + num[j]))
                        {
                            tab = num[3];
                            num[3] = num[i];
                            num[i] = tab;

                            tab = num[6];
                            num[6] = num[j];
                            num[j] = tab;
                        }
                    }
                }

                tabC(1);
            }
            ///有一交叉等15
            do
            {
                for (int i = 0; i < 8; i += 3)
                {
                    tab = num[i];
                    num[i] = num[i + 2];
                    num[i + 2] = num[i + 1];
                    num[i + 1] = tab;
                }
            } while (15 != num[0] + num[4] + num[8]);
            ///如果一捺不等于15
            if (15 != num[2] + num[4] + num[6])
            {
                Xa(0);
            }
            ///如果一捺还不等于15
            if (15 != num[2] + num[4] + num[6])
            {
                Xa(1);
            }
            ///输出排好的数
            for (int i = 0; i < 9; i++)
            {
                Console.Write(num[i]+" ");
                if ((i + 1) % 3 == 0)
                    Console.Write("/n");
            }
        }
        /// <summary>
        /// 行排序
        /// </summary>
        /// <param name="o">第几行</param>
        /// <returns>如果没有排就要从新排</returns>
        public static bool tabR(int No)
        {
            int[] y ={ 0, 3 };
            for (int i = y[No]; i < 8; i++)
            {
                for (int j = i + 1; j < 8; j++)
                {
                    if (15 == (num[y[No]] + num[i + 1] + num[j + 1]))
                    {
                        tab = num[y[No] + 1];
                        num[1+y[No]] = num[i + 1];
                        num[i + 1] = tab;

                        tab = num[y[No]+2];
                        num[y[No]+2] = num[j + 1];
                        num[j + 1] = tab;
                        j = 7;
                        i = 8;
                        return true;
                    }
                }
            }
            return false;
        }
        /// <summary>
        /// 列排序
        /// </summary>
        /// <param name="o">第几列</param>
        /// <returns>如果没有排就要从新排</returns>
        public static bool tabC(int No)
        {
            int[] y ={ 3, 4 };
            for (int i = y[No]; i < 6; i++)
            {
                for (int j = y[No] + 3; j < 9; j++)
                {
                    if (15 == (num[No] + num[i] + num[j]))
                    {
                        tab = num[y[No]];
                        num[y[No]] = num[i];
                        num[i] = tab;

                        tab = num[y[No] + 3];
                        num[y[No] + 3] = num[j];
                        num[j] = tab;
                        i = 6;
                        j = 9;
                        return true;
                    }
                }
            }
            return false;
        }
        /// <summary>
        /// 撇上的两组数交换
        /// </summary>
        /// <param name="No">第一组还是第二组</param>
        public static void Xa(int No)
        {
            int[,] ybk ={{0,0},{1,3}};
            for (int i = 0; i < 8; i += 3)
            {
                tab = num[i+ybk[No,0]];
                num[i+ybk[No,0]] = num[i+ybk[No,0] + 1];
                num[i+ ybk[No,0] + 1] = tab;
            }
            for (int i = 0; i < 3; i++)
            {
                tab = num[i + ybk[No,1]];
                num[i + ybk[No,1]] = num[i + ybk[No,1] + 3];
                num[i + ybk[No,1] + 3] = tab;
            }
        }
    }
}
 

内置脚本语言 本节内容 本节将介绍海豹内置的脚本语言,请善用侧边栏和搜索,按需阅读文档。 为了在很多地方支持实现一些逻辑,但又不至于直接使用学习门槛较高的正式编程语言,海豹提供了一种简单易学的脚本语言,可以称为「海豹语」「豹语」等。 变量 你可能注意到,在自定义文案等地方,出现了一些以 $t 开头的东西,这些是海豹中的变量。 变量的名称可以是汉字、字母和数字,$t 是一个特殊的变量前缀,还有其它的前缀。不同前缀代表不同的作用域: 变量名字用途举例普通名字玩家的角色属性理智、力量、智力$t开头个人临时变量,不存数据库$t随机点数$m开头个人变量,跨群存在$m今日人品$g开头群变量,群内所有人共享$g群主体重 所有变量均可以在 .rx / .rxh / .ra/ .text 等指令以及「自定义文案」中使用。 注意:$t 是临时变量 $t 开头的临时变量的存活周期仅为单次指令执行,执行完毕后不应当认为该变量值还保留。 在下一次指令中使用上一次指令设置的 $t 变量属于未定义行为,可能会出现包括但不限于变量值不变,变量值丢失,变量值被覆盖,变量值变为随机数,变量值变成 114514 等任何情况。如果你需要这样的持久变量,请使用 $m 或 $g 代替。 内置的 $t 变量的值固定并不代表它们是持久变量,其值是在每次指令执行的初始阶段设置的。 提示:变量不生效? 如果一部分变量无效,请检查海豹是否为最新版本。 一些内置变量 变量名内容示例结果$t玩家当前人物卡的名字,如果不存在则为群昵称或 QQ 昵称。<木落>$t玩家_RAW同上,但没有<>木落$tQQ昵称QQ 昵称<木落>$t账号ID海豹格式的 IDQQ:123456789$t账号ID_RAW原始格式的 ID123456789$tQQ海豹格式的 IDQQ:123456789$t群名群名海豹核心·SealDice 用户群$t群号海豹格式的 IDQQ-Group:987654321$t群号_RAW原始格式的 ID987654321$t个人骰子面数个人骰子面数100$tDate数字格式的现日期20230109$tYear数字格式的年份2023$tMonth数字格式的现月份1$tDay数字格式的现日期9$tWeekday数字格式的星期(1-7)1$tHour数字格式的现时间(小时)15$tMinute数字格式的现时间(分钟)41$tSecond数字格式的现时间(秒)55$tTimestamp数字格式的 10 位时间戳1673250115$t文本长度触发消息的文本,汉字长度为 3,英文字母和数字长度为 1。6$t平台触发的平台QQ$t游戏模式随 .set coc/dnd 改变coc7$t消息类型触发位置为群还是私聊(group/private)group娱乐:今日人品自定义文案<木落> 的今日人品为 0常量:APPNAME软件名SealDice常量:VERSION版本号1.4.0$tMsgID消息 ID,仅自定义回复中可用。-123 所有自定义文案也均为可用变量。 数据类型和赋值 // 注意,目前并不支持写注释,此为教程中便于展示 // 文本类型 $t0 = '文本' $t0 = "也是文本" $t0 = `特殊文本类型,可以插入表达式,例如,玩家的力量数值: {力量}` $t0 = `一种插入表达式的写法 {% 力量 %} ` // 数字类型 $t0 = 1 // 布尔类型:没有专门的布尔类型,0 或空字符串被视为 False,非零和非空字符串为 True $t0 > 1 $t0 >= 1 $t0 == 1 $t0 != 1 $t0 < 1 $t0 <= 1 注意:务必区分 === 混淆 === 是小白常犯的错误之一。前者用于赋值而后者用于比较。当你试图在下文所述的条件算符或条件语句中,比较两个值时,需要使用 ==。 语句 多个语句可以用 ; 分隔,取分隔后的最后一项的值,为整个表达式的值,例如: $t0 = 1;2;3 此时 $t0 的值为 3。 注意:分号的使用 不要在最后一条语句的后面再使用分号,会变得不幸。 // 正确写法 if 1 { $t0 = 1; $t1 = 2 // [!code highlight] } // 错误写法 if 1 { $t0 = 1; $t1 = 2; // [!code error] } 运算符 数学运算 加减乘除余 + - * / % 乘方 ^ ** // 2 ** 3 或 2 ^ 3,即 2 的 3 次方 逻辑运算 && 逻辑与 || 逻辑或 ! 逻辑非 骰子算符 d 常规骰子算符,用法举例 d20 2d20k1 d20 优势。 f 命运骰,随机骰 4 次,每骰结果可能是 -1 0 1,记为 - 0 +。 b 奖励骰 (CoC)。 p 惩罚骰 (CoC)。 c 双十字。 条件算符 条件算符 ? 灵视 >= 40 ? '如果灵视达到40以上,你就能看到这句话' 可以用这个指令测试,下同: .st 灵视 41 .text {灵视 >= 40 ? '如果灵视达到 40 以上,你就能看到这句话'} 多重条件算符 ? , 灵视 >= 80 ? '看得很清楚吗?', 灵视 >= 50 ? '不错,再靠近一点……', 灵视 >= 30 ? '仔细听……', 灵视 >= 0 ? '呵,无知之人。' 应用举例,默认的 jrrp {$t玩家} 今日人品为{$t人品},{% $t人品 > 95 ? '人品爆表!', $t人品 > 80 ? '运气还不错!', $t人品 > 50 ? '人品还行吧', $t人品 > 10 ? '今天不太行', 1 ? '流年不利啊!' %} 三目运算符 ? : 灵视 >= 40 ? '如果灵视达到 40 以上,你就能看到这句话' : '无知亦是幸运' 条件语句 if $t0 > 10 { $t1 = "aaa" } else { $t1 = 'bbb' } 提示:出现格式化错误 如果上面的代码输出「格式化错误」,那是因为你的 $t0 不是数值。字符串当然不能和数值比较大小,所以会报错。 解决方法:.text {$t0=0} 实际测试: .text {% if $t0 > 10 { $t1="aaa"} else { $t1 = 'bbb' }; $t1 %} 这个是网页复制全文,方便参考
最新发布
07-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值