C语言实现24点游戏计算器的示例代码

 更新时间:2022年08月22日 11:51:03   作者:编程爱好者-阿新  
24点是一种益智游戏,24点是把4个整数(一般是正整数)通过加减乘除以及括号运算,使最后的计算结果是24的一个数学游戏,24点可以考验人的智力和数学敏感性,它能在游戏中提高人们的心算能力。本文将用C语言实现这一游戏,感兴趣的可以了解一下

脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用

前言

24点游戏计算器的规则如下

24点是一种益智游戏,24点是把4个整数(一般是正整数)通过加减乘除以及括号运算,使最后的计算结果是24的一个数学游戏,24点可以考验人的智力和数学敏感性,它能在游戏中提高人们的心算能力。

24点通常是使用扑克牌来进行游戏的,一副牌中抽去大小王后还剩下52张(如果初练也可只用1~10这40张牌),任意抽取4张牌(称为牌组),用加、减、乘、除(可加括号)把牌面上的数算成24。每张牌必须只能用一次,如抽出的牌是3、8、8、9,那么算式为(9-8)×8×3或3×8÷(9-8)或(9-8÷8)×3等。

一、项目的创建标

1、选择项目

打开VS2019,点击创建新项目-》然后选择如下如图所示的选项创建C语言项目

2、输入项目名称和路径

3、创建头文件Main.h、PointGame.h和源文件Main.c、PointGame.c如下所示

二、项目的编写

1、Main.h头文件的编写

1
2
3
4
#pragma once
 
#include <stdio.h>
#include <stdlib.h>

2、PointGame.h头文件的编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#pragma once
 
#include <stdbool.h>
#include <math.h>
 
#define PRECISION 1E-6
#define TARGET 24
#define SIZE 4
 
/*
* 最终表达式由四个数、括号、运算符组成,其大小不会超过
* 5 * (SIZE - 1) + SIZE * 2 + 1
*/
 
 
typedef struct card
{
    double value;
    char expression[5 * (SIZE - 1) + SIZE * 2 + 1];
} Card, *pCard;
 
bool game24(pCard card, int size);

3、PointGame.c源文件的编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#define _CRT_SECURE_NO_WARNINGS
 
#include "Main.h"
#include "PointGame.h"
 
/*
* 牌堆中计算24点
*   card  牌堆
*   size  个数
*/
bool game24(pCard card, int size)
{
    Card stack[3];
    /*
    * 如果牌堆里只有一张牌,判断是否就是需要的目标
    */
    if (size == 1)
    {
        if (fabs(card[0].value - TARGET) < PRECISION)
        {
            printf("%d = %s\n", TARGET, card[0].expression);
            return true;
        }
        else
        {
            return false;
        }
    }
    /*
    *从牌堆中任选两张牌
    */
    int m, n, i, t;
    for (m = 0; m < size - 1; m++)
    {
        for (n = m + 1; n < size; n++)
        {
            /*
            * 剩余的牌放入新牌堆
            */
            t = 0;
            for (i = 0; i < size; i++)
            {
                if (i != m && i != n)
                {
                    stack[t].value = card[i].value;
                    sprintf(stack[t].expression, "%s", card[i].expression);
                    t++;
                }
            }
            /*
            * 选中两张牌的和放入新牌堆
            */
            stack[size - 2].value = card[m].value + card[n].value;
            sprintf(stack[size - 2].expression, "(%s + %s)", card[m].expression, card[n].expression);
 
            if (game24(stack, size - 1))
            {
                return true;
            }
            /*
            * 选中两张牌的差放入新牌堆
            */
            if (card[m].value > card[n].value)
            {
                stack[size - 2].value = card[m].value - card[n].value;
                sprintf(stack[size - 2].expression, "(%s - %s)", card[m].expression, card[n].expression);
            }
            else
            {
                stack[size - 2].value = card[n].value - card[m].value;
                sprintf(stack[size - 2].expression, "(%s - %s)", card[n].expression, card[m].expression);
            }
 
            if (game24(stack, size - 1))
            {
                return true;
            }
 
            /*
            * 选中两张牌的积放入新牌堆
            */
            stack[size - 2].value = card[m].value * card[n].value;
            sprintf(stack[size - 2].expression, "%s * %s", card[m].expression, card[n].expression);
 
            if (game24(stack, size - 1))
            {
                return true;
            }
 
            /*
            * 选中两张牌的商放入新牌堆
            */
            if (card[m].value != 0)
            {
                stack[size - 2].value = card[n].value / card[m].value;
                sprintf(stack[size - 2].expression, "%s / %s", card[n].expression, card[m].expression);
 
                if (game24(stack, size - 1))
                {
                    return true;
                }
            }
 
            if (card[n].value != 0)
            {
                stack[size - 2].value = card[m].value / card[n].value;
                sprintf(stack[size - 2].expression, "%s / %s", card[m].expression, card[n].expression);
 
                if (game24(stack, size - 1))
                {
                    return true;
                }
            }
        }
    }
    return false;
}

4、Main.c源文件的编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#define _CRT_SECURE_NO_WARNINGS
 
#include "Main.h"
#include "PointGame.h"
 
 
 
int main()
{
    system("color 3E");
 
    int i, poke;
    Card card[SIZE];
 
    printf("请输入4个数字 以判断解法:");
    for (i = 0; i < SIZE; i++)
    {
        scanf("%d", &poke);
        card[i].value = (double)poke;
        sprintf(card[i].expression, "%d", poke);
    }
 
    if (game24(card, SIZE))
    {
        printf("Done\n");
    }
    else
    {
        printf("No Answer\n");
    }
 
    system("pause");
    return 0;
}

三、项目的调试结果

选择生成----》生成解决方案。

结果如下

按F5调试结果如下所示

到此这篇关于C语言实现24点游戏计算器的示例代码的文章就介绍到这了,更多相关C语言24点游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/m0_47419053/article/details/125936011

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • C++遍历磁盘驱动器的示例代码

    C++遍历磁盘驱动器的示例代码

    这篇文章主要介绍了C++遍历磁盘驱动器的示例代码,帮助大家更好的理解和使用c++,感兴趣的朋友可以了解下
    2021-01-01
  • 详解CLion配置openMP的方法

    详解CLion配置openMP的方法

    这篇文章主要介绍了CLion配置openMP的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • C++对cin输入字符的判断及分段函数处理方法示例

    C++对cin输入字符的判断及分段函数处理方法示例

    这篇文章主要介绍了C++对cin输入字符的判断及分段函数处理方法,结合实例形式分析了C++输入判断及处理相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • c++primer:变量和基本类型详解

    c++primer:变量和基本类型详解

    今天小编就为大家分享一篇关于C++Primer中变量和基本类型的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-08-08
  • C语言数据输入与输出实例详解

    C语言数据输入与输出实例详解

    这篇文章主要介绍了C语言数据输入与输出实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++之Qt5双缓冲机制案例教程

    C++之Qt5双缓冲机制案例教程

    这篇文章主要介绍了C++之Qt5双缓冲机制案例教程,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++深浅拷贝和写时拷贝图文详解

    C++深浅拷贝和写时拷贝图文详解

    这篇文章主要给大家介绍了关于C++深浅拷贝和写时拷贝的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • C++中纯虚函数的实例详解

    C++中纯虚函数的实例详解

    纯虚函数就是一个在基类中的虚函数,差别只是在一般的虚函数声明的后面加了“=0”,下面这篇文章主要给大家介绍了关于C++中纯虚函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Qt使用QJson模块实现解析Json文件

    Qt使用QJson模块实现解析Json文件

    在项目开发过程中,经常会遇到读写Json文件的需求,掌握Json文件的操作是基础中的基础,下面我们就来看看如何使用QT内置的QJson模块解析Json文件吧
    2023-10-10
  • C语言实现一个闪烁的圣诞树

    C语言实现一个闪烁的圣诞树

    本文详细讲解了C语言实现一个闪烁的圣诞树,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12

最新评论