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

相关文章
|
4月前
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
126 8
|
18天前
|
存储 人工智能 程序员
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
30 0
一文彻底搞明白C语言的数组
|
3月前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
250 6
|
4月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
345 13
|
4月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
111 5
|
4月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
4月前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
111 2
|
4月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
4月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
4月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
87 4