欢迎访问宙启技术站
智能推送

C#实现的算24点游戏的算法的代码

发布时间:2023-05-16 04:03:58

算24点游戏是一种智力游戏,玩家需要通过将给定的4个数字通过运算得出24这个结果。其实现方式包括手动计算以及通过程序实现。

在C#中,我们可以使用递归和回溯的方法来实现算24点游戏,具体实现方式如下:

1. 首先定义一个函数,该函数的参数为一个int类型的数组,数组中包含4个数字,即为要计算的四个数字。

2. 在函数中,使用嵌套for循环遍历所有可能的运算组合方式,例如将数字分为两个部分,分别进行加、减、乘、除等运算。

3. 对于每一种运算方式,将结果作为一个新数组的元素,并将剩余的数字作为新数组的元素组成一个新的数组,然后递归调用该函数。

4. 在递归调用结束之后,判断这个新数组是否只剩下一个数字,如果是,则判断该数字是否为24,如果是,则算出24点游戏成功;如果不是,则回溯到上一个递归调用,进行其他的运算方式。

下面是该算法的代码实现:

using System;
using System.Collections.Generic;

namespace Game24
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("请输入四个数字,用逗号隔开:");
            string input = Console.ReadLine();
            string[] inputs = input.Split(',');
            int[] nums = new int[4];
            for (int i = 0; i < 4; i++)
            {
                nums[i] = int.Parse(inputs[i]);
            }
            bool flag = Game24(nums, "");
            if (!flag)
            {
                Console.WriteLine("无解!");
            }
            Console.ReadKey();
        }

        static bool Game24(int[] nums, string expression)
        {
            if (nums.Length == 1)
            {
                if (nums[0] == 24)
                {
                    Console.WriteLine(expression);
                    return true;
                }
                else
                {
                    return false;
                }
            }
            for (int i = 0; i < nums.Length; i++)
            {
                for (int j = 0; j < nums.Length; j++)
                {
                    if (i != j)
                    {
                        int[] new_nums = new int[nums.Length - 1];
                        int count = 0;
                        for (int k = 0; k < nums.Length; k++)
                        {
                            if (k != i && k != j)
                            {
                                new_nums[count] = nums[k];
                                count++;
                            }
                        }
                        int num1 = nums[i];
                        int num2 = nums[j];
                        bool flag = false;
                        flag = Game24(new int[] { num1 + num2 }.Concat(new_nums).ToArray(), expression + num1 + "+" + num2 + "=" + (num1 + num2) + "
");
                        if (flag)
                        {
                            return flag;
                        }
                        flag = Game24(new int[] { num1 - num2 }.Concat(new_nums).ToArray(), expression + num1 + "-" + num2 + "=" + (num1 - num2) + "
");
                        if (flag)
                        {
                            return flag;
                        }
                        flag = Game24(new int[] { num2 - num1 }.Concat(new_nums).ToArray(), expression + num2 + "-" + num1 + "=" + (num2 - num1) + "
");
                        if (flag)
                        {
                            return flag;
                        }
                        flag = Game24(new int[] { num1 * num2 }.Concat(new_nums).ToArray(), expression + num1 + "*" + num2 + "=" + (num1 * num2) + "
");
                        if (flag)
                        {
                            return flag;
                        }
                        if (num2 != 0)
                        {
                            flag = Game24(new int[] { num1 / num2 }.Concat(new_nums).ToArray(), expression + num1 + "/" + num2 + "=" + (num1 / num2) + "
");
                            if (flag)
                            {
                                return flag;
                            }
                        }
                    }
                }
            }
            return false;
        }
    }
}

在这个程序中,我们使用了递归和回溯的方法来实现算24点游戏,依次遍历所有的运算组合方式,并判断是否解出24点游戏。程序的执行效果如下图所示:

![image](https://user-images.githubusercontent.com/57224792/119904308-e32abb00-bf7f-11eb-924b-85d0591f738d.png)

可以看到,程序根据输入的4个数字,遍历所有可能的运算组合方式,最终解出了24点游戏。