24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表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; }