您的位置:首页 > 编程语言 > C语言/C++

24点游戏

2017-08-08 21:26 197 查看
Think:

部分 卡牌 会出错, 近期会进行改正修改。

C语言实现纸牌计算24点小游戏

 利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的。程序主要功能已完成,目前还有部分细节未处理,待完成ing…对于代码中的错误,恳请批评指正。

游戏描述:

  A-10:分别代表数字 1-10。

  J,Q,K:均代表数字1。

  考虑到部分地方的规则,J,Q,K 也可以当成10 ,或者直接代表本身所代表的数字,即11、12、13来运算。

  使用加减乘除,能得出24者为赢,存在无解情况。

  游戏开始得分为1000分,每一秒钟减少1分,当答对一次时,分数增加100分。(暂未实现)

代码展示:

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<math.h>
#include<iostream>
using namespace std;

char GetCard(int key) //转换卡牌
{
if (key == 1)
return 'A';
if (key < 10)
return key + '0';
if(key == 10)
return '0';
if(key == 11)
return 'J';
if(key == 12)
return 'Q';
if(key == 13)
return 'K';
return 0;
}

void PrintfAnswer(int flag, int *pocket, char *oper, char *answer)
{
char a = GetCard(pocket[0]); //赋予输出
char b = GetCard(pocket[1]);
char c = GetCard(pocket[2]);
char d = GetCard(pocket[3]);

switch(flag) //列举输出情况 ———— 共5种
{
//((A B) C) D
case 1:
printf("((%c%c%c)%c%c)%c%c\n", a, oper[0], b, oper[1], c, oper[2], d);
break;

//(A (B C)) D
case 2:
printf("(%c%c(%c%c%c))%c%c\n", a, oper[0], b, oper[1], c, oper[2], d);
break;

//(A B) (A B)
case 3:
printf("(%c%c%c)%c(%c%c%c)\n", a, oper[0], b, oper[1], c, oper[2], d);
break;

//A (B (C D))

case 4:
printf("%c%c(%c%c(%c%c%c))\n", a, oper[0], b, oper[1], c, oper[2], d);
break;

//A ((B C) D)
case 5:
printf("%c%c((%c%c%c)%c%c)\n", a, oper[0], b, oper[1], c, oper[2], d);
break;

default :
break;
}
return ;
}

double Sum(double num1, double num2, char oper) //计算函数
{
double ans;

switch(oper)
{
case '+':
ans = num1 + num2;
break;

case '-':
ans = fabs(num1 - num2);
break;

case '*':
ans = num1 * num2;
break;

case '/':
ans = num1 / num2;
break;

default :
break;
}
return ans;
}

int GetResult(int *pocket, char *oper, char *answer) //利用fabs减小误差
{
double temp;

int a, b, c, d; //储存 计算结果

if (pocket[0] > 10)
a = 1;
else
a = pocket[0];

if (pocket[1] > 10)
b = 1;
else
b = pocket[1];

if
4000
(pocket[2] > 10)
c = 1;
else
c = pocket[2];

if (pocket[3] > 10)
d = 1;
else
d = pocket[3];

//((A B) C) D  开始穷举计算
temp = 0;
temp = Sum(a, b, oper[0]);
temp = Sum(temp, c, oper[1]);
temp = Sum(temp, d, oper[2]);
if(fabs(temp - 24) <= 1e-6)
{
PrintfAnswer(1, pocket, oper, answer);
return 1;
}

//(A (B C)) D
temp = 0;
temp = Sum(b, c, oper[1]);
temp = Sum(a, temp, oper[0]);
temp = Sum(temp, d, oper[2]);
if(fabs(temp - 24) <= 1e-6)
{
PrintfAnswer(2, pocket, oper, answer);
return 1;
}

//(A B) (C D)
double t = Sum(a, b, oper[0]);
temp = Sum(c, d, oper[2]);
temp = Sum(t, temp, oper[1]);
if(fabs(temp - 24) <= 1e-6)
{
PrintfAnswer(3, pocket, oper, answer);
return 1;
}

//A (B (C D))
temp = 0;
temp = Sum(c, d, oper[2]);
temp = Sum(b, temp, oper[1]);
temp = Sum(a, temp, oper[0]);
if(fabs(temp - 24) <= 1e-6)
{
PrintfAnswer(4, pocket, oper, answer);
return 1;
}

//A ((B C) D)
temp = 0;
temp = Sum(b, c, oper[1]);
temp = Sum(temp, d, oper[2]);
temp = Sum(a, temp, oper[0]);
if(fabs(temp - 24) <= 1e-6)
{
PrintfAnswer(5, pocket, oper, answer);
return 1;
}
return 0;
}

void Total(int *pocket, char *answer)
{
char Operator[] = {'+', '-', '*', '/'};
char oper[4];
int i, j, k;
int cnt = 0;// 记录解题方案个数
for (i = 0; i <= 3; i ++)
for (j = 0; j <= 3; j ++)
for (k = 0; k <= 3; k ++)
{
oper[0] = Operator[i];
oper[1] = Operator[j];
oper[2] = Operator[k];

if (GetResult(pocket, oper, answer))
cnt ++;
}
if (cnt != 0)
printf("共有%d种解法\n", cnt);
else
printf("此题无解\n");
}

void PrintfPocketCard(int *pocket)
{
int i;
for (i = 0; i < 4; i ++)
{
printf("%c ", GetCard(pocket[i]));
}
printf("\n");
}

void GetRandomCard(int *pocket) //得到随机的 4张卡牌
{
int i;
srand((unsigned)time(NULL));
for (i = 0; i < 4; i ++)
{
pocket[i] = rand()%12 + 1;
}
}

void Display()
{
printf("*********************************************\n");
Sleep(500);
printf("***            计算24点                   ***\n");
Sleep(500);
printf("***                                       ***\n");
Sleep(500);
printf("***                        ___by 棺木酥   ***\n");
Sleep(500);
printf("*********************************************\n");
}

void QuitSystem()
{
printf("*********************************************\n");
Sleep(500);
printf("***            欢迎再次使用               ***\n");
Sleep(500);
printf("***                                       ***\n");
Sleep(500);
printf("***                        ___by 棺木酥   ***\n");
Sleep(500);
printf("*********************************************\n");
}

int main()
{
system("color 9E");
Display();
int pocket[10];
char answer[30];
char ch;
while(1)
{
GetRandomCard(pocket);  //获得卡牌
printf("随机卡牌为:\n");
PrintfPocketCard(pocket); //输出卡牌

printf("任意键查看结果\n"); //计算输出结果
system("pause");

Total(pocket, answer);

printf("任意键继续, ESC键退出\n");
ch = getchar();
if (ch == 27)
break;
}
QuitSystem();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 游戏