24点游戏C++

24点游戏是经典的纸牌益智游戏。

常见游戏规则:

   从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11Q代表12K代表13A代表1),按照要求编程解决24点游戏。

基本要求: 随机生成4个代表扑克牌牌面的数字字母程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。


源代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
 
float CalculateTry(float x, float y,int n)  //将两个数进行加减乘除运算;
{
switch (n)
{
case 0:return x + y;
case 1:return x - y;
case 2:return x * y;
case 3:return x / y;
default:
break;
}
}
char symbol(int n)                        //根据n判断当前使用的运算符;
{
switch (n)
{
case 0:return '+';
case 1:return '-';
case 2:return '*';
case 3:return '/';
default:
break;
}
}
float Calculate(char *& ch)                  //用来计算用户的表达式,每计算一次则将指针前移一个字符;
{
float num = 1, sum = 0; int $_$ = 1;     // $_$用于表示数字前的符号是正还是负;
do                                       //碰到*或/,计算机会再向前取一个数字,并在开始新一次循环是结束乘除运算;
{                                        //碰到左括号,运用递归运算;碰到右括号,结束递归运算;
 
switch (*(ch))
{
case '0':return 0;                                       
case '1':num = 1; break;
case '2':num = 2; break;
case '3':num = 3; break;
case '4':num = 4; break;
case '5':num = 5; break;
case '6':num = 6; break;
case '7':num = 7; break;
case '8':num = 8; break;
case '9':num = 9; break;
case '+':sum = sum + num*$_$; $_$ =  1; break;
case '-':sum = sum + num*$_$; $_$ = -1; break;
case '*':
ch++;
if (*ch>'0'&&*ch<='9') num = num * (*ch - '0');
else
{
num = num*Calculate(++ch);
}
break;
case '/':
ch++;
if (*ch>'0'&&*ch <= '9') num = num * (*ch - '0');
else
{
num = num/Calculate(++ch);
}
break;
case '(':num=num*Calculate(++ch); break;
case ')':sum = sum + num*$_$; $_$ = -1; return sum; break;
case ' ':break;
default :
sum = sum + num*$_$; $_$ = -1; 
return sum;
break;
}
ch++;
} while (true);
 
}
 
bool pcCalculate24(float*a)
{
float b[3]; float c[2]; float d;
int bx = 0; int cx = 0; int dx = 0;
 
 
for (int i1 = 0; i1 < 4; i1++)
{
for (int i2 = 0; i2 < 4; i2++)
{
if (i1 == i2) continue;
for (int i3 = 0; i3 < 4; i3++)
{
if (i3 != i1&&i3 != i2)
{
b[bx] = a[i3];
bx++;
}
}
for (int n1 = 0; n1 < 4; n1++)
{
b[2] = CalculateTry(a[i1], a[i2], n1);
 
for (int ii1 = 0; ii1 < 3; ii1++)
{
for (int ii2 = 0; ii2 < 3; ii2++)
{
if (ii1 == ii2) continue;
for (int ii3 = 0; ii3 < 3; ii3++)
{
if (ii3 != ii1&&ii3 != ii2)
{
c[cx] = b[ii3];
cx++;
}
}
for (int n2 = 0; n2 < 4; n2++)
{
c[1] = CalculateTry(b[ii1], b[ii2], n2);
 
for (int n3 = 0; n3 < 4; n3++)
{
d = CalculateTry(c[0], c[1], n3);
if (d == 24.0)
{
printf("%g %c %g = %g\n", a[i1], symbol(n1), a[i2], b[2]);
printf("%g %c %g = %g\n", b[ii1], symbol(n2), b[ii2], c[1]);
printf("%g %c %g = %g\n", c[0], symbol(n3), c[1], d);
return 1;
}
d = CalculateTry(c[1], c[0], n3);
if (d == 24.0)
{
printf("%g %c %g = %g\n", a[i1], symbol(n1), a[i2], b[2]);
printf("%g %c %g = %g\n", b[ii1], symbol(n2), b[ii2], c[1]);
printf("%g %c %g = %g\n", c[1], symbol(n3), c[0], d);
return 1;
}
}
cx = 0;
}
}
}
bx = 0;
}
}
return 0;
 
}
}
int main()
{
float a[4]; char yorn; int ForT = 0; char isContinue = 'N'; float result;
char  ch[20] ; char *p = &ch[0];
do
{
for (int i = 0; i < 4; i++)            //首先产生四个随机数
{
srand((unsigned int)(time(0)));
Sleep(1000);
a[i] = rand() % 9 + 1;
printf("%g ", a[i]);
}
printf("\n");
 
do
{
printf("偷看答案。。? ‘Y’or‘N’:");  //提示是否给出答案,建立无止尽的循环,让用户无数次输入;
scanf("%c", &yorn); getchar();
 
if (yorn == 'Y' || yorn == 'y')          //如果用户输入Y或y,则计算机用穷尽的方法来计算24,并输出一种方法。
{
pcCalculate24(a) ;                    //该函数为自定义函数,用于计算机算24,参数为数组a,也就是随机产生的4个数。
printf("是否继续??\n");            
scanf("%c", &isContinue); getchar();
break;                                //计算机给出方法后退出当前循环,开始新的算24
}
printf("请输入您的计算式:");             //如果用户输入的字符不是Y或y,则让用户列计算式(单行计算式)。
scanf("%s", ch); getchar();
p = &ch[0];                               //在下面的自定义函数Cauculate中改变了指针P,将指针P重新指向a[0]。
if ((result=Calculate(p)) == 24)          //自定义函数Cauculate用来计算输入的算式;将结果返回并存在result中,检查结果是否为24;
{
printf("计算正确!Q\n");         //是24则判定正确;在用户输入Y后开始新的24,或输入N结束程序;
printf("是否继续??\n");         
scanf("%c", &isContinue); getchar();
break;
}
 
else if (result == 0)                       //如果用户输入的结果不是24,而是0;就让计算机穷解;
{
if (pcCalculate24(a))                    //穷解后若有解则给出答案,并提示用户判断错误;退出循环;开始新24或结束程序;
{
printf("有解,判断错误\n");
printf("是否继续??'Y'or'N'\n");
scanf("%c", &isContinue);
getchar();
break;
}
 
else                                     //穷解后若无解,提示用户判断正确;退出循环;开始新24或结束程序;
{
printf("无解,判断正确\n");
printf("是否继续??'Y'or'N'\n");
scanf("%c", &isContinue);
getchar();
break;
}
}
 
else printf("很抱歉,计算式不正确");        //用户输入的表达式即不等于24,也不等于0;则提示用户输入错误,重新输入;
} while (1);
 
 
} while (isContinue=='Y'||isContinue=='y');         //根据用户输入的Y或N来开始新的24或结束程序;
return 0;
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值