C语言项目实战:24点游戏计算器(基于结构体、指针、函数、数组、循环等知识点)

简介: C语言项目实战:24点游戏计算器(基于结构体、指针、函数、数组、循环等知识点)

C语言项目实战:24点游戏计算器(基于结构体、指针、函数、数组、循环等知识点)


前言: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语言项目


4c3e42fdd1084a4ab450db42ea00944f.png


2、输入项目名称和路径


5bf540f1b6f149c2978c67be42122b6d.png

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



b8abb8ca2956472cb6a2961d8035000b.png


二、项目的编写


1、Main.h头文件的编写


#pragma once
#include <stdio.h>
#include <stdlib.h>


2、PointGame.h头文件的编写

#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源文件的编写


#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;
}


3、Main.c源文件的编写

#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;
}

三、项目的调试结果


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

结果如下


6ef1cec51b964de6b340347f35c13273.png

按F5调试结果如下所示

4b299f06aebb40428488ea923722a9dd.png

相关文章
|
9天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
18 0
|
9天前
|
C语言
C语言结构体内存对齐
C语言结构体内存对齐
|
12天前
|
存储 编译器 Linux
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
|
9天前
|
程序员 C语言 开发者
C语言库函数 — 字符串函数(含模拟实现字符串函数)
C语言库函数 — 字符串函数(含模拟实现字符串函数)
35 0
|
9天前
|
存储 C语言
C语言自定义类型结构体详解
在C语言中,结构体是复合数据类型,能组合不同类型的数据显示。定义结构体用`struct`关键字,如`struct Student {char name[20]; int age; float score;};`。声明结构体变量如`struct Student stu1;`,访问成员用`.`操作符,如`stu1.age = 20;`。初始化可直接赋值`struct Student stu1 = {&quot;李四&quot;, 22, 85.5};`。结构体数组如`struct Student stuArray[3]`,结构体指针如`struct Student *pStu = &stu1;`。
5 0
|
12天前
|
存储 搜索推荐 编译器
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别
|
12天前
|
存储 网络协议 编译器
【C语言】自定义类型:结构体深入解析(三)结构体实现位段最终篇
【C语言】自定义类型:结构体深入解析(三)结构体实现位段最终篇
|
16天前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
9天前
|
存储 C语言
C语言 — 指针进阶篇(下)
C语言 — 指针进阶篇(下)
18 0
|
9天前
|
存储 C语言 C++
C语言 — 指针进阶篇(上)
C语言 — 指针进阶篇(上)
9 0