C語言實(shí)現(xiàn)24點(diǎn)游戲計(jì)算器的示例代碼
前言
24點(diǎn)游戲計(jì)算器的規(guī)則如下
24點(diǎn)是一種益智游戲,24點(diǎn)是把4個(gè)整數(shù)(一般是正整數(shù))通過加減乘除以及括號運(yùn)算,使最后的計(jì)算結(jié)果是24的一個(gè)數(shù)學(xué)游戲,24點(diǎn)可以考驗(yàn)人的智力和數(shù)學(xué)敏感性,它能在游戲中提高人們的心算能力。
24點(diǎn)通常是使用撲克牌來進(jìn)行游戲的,一副牌中抽去大小王后還剩下52張(如果初練也可只用1~10這40張牌),任意抽取4張牌(稱為牌組),用加、減、乘、除(可加括號)把牌面上的數(shù)算成24。每張牌必須只能用一次,如抽出的牌是3、8、8、9,那么算式為(9-8)×8×3或3×8÷(9-8)或(9-8÷8)×3等。
一、項(xiàng)目的創(chuàng)建標(biāo)
1、選擇項(xiàng)目
打開VS2019,點(diǎn)擊創(chuàng)建新項(xiàng)目-》然后選擇如下如圖所示的選項(xiàng)創(chuàng)建C語言項(xiàng)目

2、輸入項(xiàng)目名稱和路徑

3、創(chuàng)建頭文件Main.h、PointGame.h和源文件Main.c、PointGame.c如下所示

二、項(xiàng)目的編寫
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
/*
* 最終表達(dá)式由四個(gè)數(shù)、括號、運(yùn)算符組成,其大小不會(huì)超過
* 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"
/*
* 牌堆中計(jì)算24點(diǎn)
* card 牌堆
* size 個(gè)數(shù)
*/
bool game24(pCard card, int size)
{
Card stack[3];
/*
* 如果牌堆里只有一張牌,判斷是否就是需要的目標(biāo)
*/
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源文件的編寫
#define _CRT_SECURE_NO_WARNINGS
#include "Main.h"
#include "PointGame.h"
int main()
{
system("color 3E");
int i, poke;
Card card[SIZE];
printf("請輸入4個(gè)數(shù)字 以判斷解法:");
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;
}
三、項(xiàng)目的調(diào)試結(jié)果
選擇生成----》生成解決方案。
結(jié)果如下

按F5調(diào)試結(jié)果如下所示

到此這篇關(guān)于C語言實(shí)現(xiàn)24點(diǎn)游戲計(jì)算器的示例代碼的文章就介紹到這了,更多相關(guān)C語言24點(diǎn)游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
opencv3機(jī)器學(xué)習(xí)之EM算法示例詳解
這篇文章主要介紹了opencv3機(jī)器學(xué)習(xí)之EM算法的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
C語言構(gòu)建動(dòng)態(tài)數(shù)組完整實(shí)例
這篇文章主要介紹了C語言構(gòu)建動(dòng)態(tài)數(shù)組完整實(shí)例,幫助讀者加深對C語言數(shù)組及指針的理解,需要的朋友可以參考下2014-07-07
VC實(shí)現(xiàn)Windows多顯示器編程的方法
這篇文章主要介紹了VC實(shí)現(xiàn)Windows多顯示器編程的方法,涉及VC獲取屏幕分辨率及顯示參數(shù)等技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10

