24点游戏

来源:互联网 发布:淘宝手机怎么五星好评 编辑:程序博客网 时间:2024/06/16 20:14

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 (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();}