如何用C语言编写一个24点的游戏?

作者&投稿:旁希 (若有异议请与网页底部的电邮联系)
如何用C语言做一个24点游戏的程序?~

/*6.3.4 源程序*/
#define N 20
#define COL 100
#define ROW 40
#include "stdio.h"
#include "time.h" /*系统时间函数*/
#include "graphics.h" /*图形函数*/
#include "alloc.h"/*动态地址分配函数*/
#include "stdlib.h" /*库函数*/
#include "string.h" /*字符串函数*/
#include "ctype.h" /*字符操作函数*/
char p[4][13]={
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'},/*扑克牌,10用0来表示*/
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'},
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'},
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'}};
typedef struct node
{
int data;
struct node *link;
}STACK1; /*栈1*/
typedef struct node2
{
char data;
struct node2 *link;
}STACK2; /*栈2*/
void init(void);/*图形驱动*/
void close(void);/*图形关闭*/
void play(void);/*发牌的具体过程*/
void rand1(int j);/*随机发牌函数*/
void change(char *e,char *a); /*中缀变后缀函数*/
int computer(char *s); /*后缀表达式计算函数*/
STACK1 *initstack1(STACK1 *top); /*栈1初始化*/
STACK1 *push(STACK1 *top,int x); /*栈1入栈运算*/
STACK1 *pop(STACK1 *top); /*栈1删除栈顶元素*/
int topx(STACK1 *top); /*栈1读栈顶元素*/
STACK1 *ptop(STACK1 *top,int *x); /*栈1读出栈顶元素值并删除栈顶元素*/
int empty(STACK1 *top); /*判栈1是否为空函数*/
STACK2 *initstack2(STACK2 *top); /*栈2初始化*/
STACK2 *push2(STACK2 *top,char x); /*栈2入栈运算*/
STACK2 *pop2(STACK2 *top); /*栈2删除栈顶元素*/
char topx2(STACK2 *top); /*栈2读栈顶元素*/
STACK2 *ptop2(STACK2 *top,char *x); /*栈2读出栈顶元素值并删除栈顶元素*/
int empty2(STACK2 *top); /*判栈2是否为空函数*
int text1(char *s) ; /*显示文本*/
main()
{
char s[N],s1[N],ch;
int i,result;
int gdriver, gmode;
clrscr(); /*清屏*/
init(); /*初始化函数*/
while(1)
{
setbkcolor(BLACK); /*设置背景颜色*/
cleardevice();/*清屏*/
play(); /*发牌*/
gotoxy(1,15); /*移动光标*/
printf("--------------------Note-------------------
");
printf(" Please enter express accroding to above four number
"); /*提示信息*/
printf(" Format as follows:2.*(5.+7.)
");/*提示输入字符串格式*/
printf(" ----------------------------------------------
");
scanf("%s%c",s1,&ch); /*输入字符串压回车键*/
change(s1,s); /*调用change函数将中缀表达式s1转换为后缀表达式s*/
result=computer(s); /*计算后缀表达式的值,返回结果result */
if(result==24) /*如果结果等于24*/
text1("very good"); /*调用函数text1显示字符串"very good"*/
else
text1("wrong!!!");/*否则函数text1显示字符串"wrong!!!"*/
printf("Continue (y/n)?
"); /*提示信息,是否继续*/
scanf("%c",&ch); /*输入一字符*/
if(ch=='n'||ch=='N') /*如果该字符等于n或N*/
break; /*跳出循环,程序结束*/
} /*否则,开始下一轮循环*/
close();
return; /*返回*/
}
void rand1(int j)/*随机发牌函数*/
{
int kind,num;
char str[3],n;
randomize();
while(1)/*循环直到有牌发*/
{
kind=random(4); /*花色随机数*/
num=random(13); /*大小随机数*/
if(p[kind][num]!=-1) /*该数未取过*/
{
n=p[kind][num]; /*取相应位置的扑克牌数*/
p[kind][num]=-1; /*牌发好以后相应位置的元素置-1*/
break;
}
}
switch(kind)/*花式的判断*/
{
case 0:setcolor(RED);sprintf(str,"%c",3);break; /*红桃*/
case 1:setcolor(BLACK);sprintf(str,"%c",3);break; /*黑桃*/
case 2:setcolor(RED);sprintf(str,"%c",4);break; /*方片*/
case 3:setcolor(BLACK);sprintf(str,"%c",5);break; /*草花*/
}
settextstyle(0,0,2);
outtextxy(COL+j*100-30,ROW+100-46,str);/*显示左上角花色*/
outtextxy(COL+j*100+16,ROW+100+32,str); /*显示右下角花色*/
if(n!='0')/*输出其他牌*/
{
settextstyle(0,0,3);
sprintf(str,"%c",n);
outtextxy(COL+j*100-5,ROW+100-5,str);/*显示牌的大小*/
}
else/*输出10的时候*/
{
sprintf(str,"%d",10);
outtextxy(COL+j*100-6,ROW+100-5,str);
}
}
void play(void)/*发牌的具体过程*/
{
int j;
for(j=0;j<4;j++)
{
bar(COL+j*100-35,ROW+100-50,COL+j*100+35,ROW+1*100+50);/*画空牌*/
setcolor(BLUE);
rectangle(COL+j*100-32,ROW+100-48,COL+j*100+32,ROW+100+48); /*画矩形框*/
rand1(j); /*随机取牌*/
delay(10000); /*延时显示*/
}
}
void init(void)/*图形驱动*/
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\c");
cleardevice();
}
void close(void)/*图形关闭*/
{
closegraph();
}
void change(char *e,char *a) /*中缀字符串e转后缀字符串a函数*/
{
STACK2 *top=NULL; /* 定义栈顶指针*/
int i,j;char w;
i=0;
j=0;
while(e[i]!='\0') /*当字符串没有结束时*/
{
if(isdigit(e[i])) /*如果字符是数字*/
{
do{
a[j]=e[i]; /*将数字原样拷贝到数组a中*/
i++; /*e数组的下标加1*/
j++; /*a数组的下标加1*/
}while(e[i]!='.'); /*直到字符为数字结束符“.”为止*/
a[j]='.';j++; /*将数字结束符“.”拷贝到a数组依然保持结束标记*/
}
if(e[i]=='(') /*如果字符是“(”时*/
top=push2(top,e[i]); /*将其压入堆栈*/
if(e[i]==')') /*如果字符是“)”时*/
{
top=ptop2(top,&w); /*取出栈顶元素,并从栈顶删除该元素*/
while(w!='(') /*如果字符不是“(”时反复循环*/
{
a[j]=w; /*将栈顶元素存入a数组*/
j++; /*下标加1*/
top=ptop2(top,&w) ; /*取出栈顶元素,并从栈顶删除该元素*/
}
}
if(e[i]=='+'||e[i]=='-') /*如果字符是加或减号时*/
{
if(!empty2(top)) /*如栈不为空*/
{
w=topx2(top);
while(w!='(') /*当栈顶元素不是“(”时反复循环*/
{
a[j]=w;
j++; /*将栈顶元素存入表达式a中,a的下标加1*/
top=pop2(top); /*删除栈顶元素*/
if(empty2(top)) /*如果栈为空*/
break; /*跳出循环*/
else
w=topx2(top); /*否则读栈顶元素*/
}
}
top=push2(top,e[i]); /*将当前e的字符元素压入堆栈*/
}
if(e[i]=='*'||e[i]=='/') /*如果字符是乘或除号时*/
{
if(!empty2(top)) /*如栈不为空*/
{
w=topx2(top); /*读栈顶元素存入w*/
while(w=='*'||w=='/')/*当栈顶元素是乘或除时反复循环*/
{
a[j]=w;
j++; /*将栈顶元素存入字符串a中,a的下标加1*/
top=pop2(top); /*删除栈顶元素*/
if(empty2(top)) /*如果栈为空*/
break; /*跳出循环*/
else
w=topx2(top); /*否则读栈顶元素*/
}
}
top=push2(top,e[i]); /*将当前e字符元素压入堆栈*/
}
i++; /*e的下标加1*/
}
while(!empty2(top)) /*当不为空时反复循环*/
top=ptop2(top,&a[j++]); /*将栈顶元素存入数组a中*/
a[j]='\0'; /*将字符串结束标记写入最后一个数组元素中构成字符串*/
}
int computer(char *s) /* 计算函数*/
{
STACK1 *top=NULL;
int i,k,num1,num2,result;
i=0;
while(s[i]!='\0') /*当字符串没有结束时作以下处理*/
{
if(isdigit(s[i])) /*判字符是否为数字*/
{
k=0; /*k初值为0*/
do{
k=10*k+s[i]-'0'; /*将字符连接为十进制数字*/
i++; /*i加1*/
}while(s[i]!='.'); /*当字符不为‘.’时重复循环*/
top=push(top,k); /*将生成的数字压入堆栈*/
}
if(s[i]=='+') /*如果为'+'号*/
{
top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/
top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/
result=num2+num1; /*将num1和num2相加存入result中*/
top=push(top,result); /*将result压入堆栈*/
}
if(s[i]=='-') /*如果为'-'号*/
{
top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/
top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/
result=num1-num2; /*将num1减去num2结果存入result中*/
top=push(top,result); /*将result压入堆栈*/
}
if(s[i]=='*') /*如果为'*'号*/
{
top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/
top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/
result=num1*num2; /*将num1与num2相乘结果存入result中*/
top=push(top,result); /*将result压入堆栈*/
}
if(s[i]=='/') /*如果为'/'号*/
{
top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/
top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/
result=num1/num2; /*将num1除num2结果存入result中*
top=push(top,result); /*将result压入堆栈*/
}
i++; /*i加1*/
}
top=ptop(top,&result); /*最后栈顶元素的值为计算的结果*/
return result; /*返回结果*/
}
STACK1 *initstack1(STACK1 *top) /*初始化*/
{
top=NULL; /*栈顶指针置为空*/
return top; /*返回栈顶指针*/
}
STACK1 *push(STACK1 *top,int x) /*入栈函数*/
{
STACK1 *p; /*临时指针类型为STACK1*/
p=(STACK1 *)malloc(sizeof(STACK1)); /*申请STACK1大小的空间*/
if(p==NULL) /*如果p为空*/
{
printf("memory is overflow
!!"); /*显示内存溢出*/
exit(0); /*退出*/
}
p->data=x; /*保存值x到新空间*/
p->link=top; /*新结点的后继为当前栈顶指针*/
top=p; /*新的栈顶指针为新插入的结点*/
return top; /*返回栈顶指针*/
}
STACK1 *pop(STACK1 *top) /*出栈*/
{
STACK1 *q; /*定义临时变量*/
q=top; /*保存当前栈顶指针*/
top=top->link; /*栈顶指针后移*/
free(q); /*释放q*/
return top; /*返回栈顶指针*/
}
int topx(STACK1 *top) /*读栈顶元素*/
{
if(top==NULL) /*栈是否为空*/
{
printf("Stack is null
"); /*显示栈为空信息*/
return 0; /*返回整数0*/
}
return top->data; /*返回栈顶元素*/
}
STACK1 *ptop(STACK1 *top,int *x) /*取栈顶元素,并删除栈顶元素*/
{
*x=topx(top); /*读栈顶元素*/
top=pop(top); /*删除栈顶元素*/
return top; /*返回栈顶指针*/
}
int empty(STACK1 *top) /*判栈是否为空*/
{
if(top==NULL) /*如果为空*/
return 1; /*返回1*/
else
return 0; /*否则返回0*/
}
STACK2 *initstack2(STACK2 *top) /*初始化*/
{
top=NULL; /*栈顶指针置为空*/
return top; /*返回栈顶指针*/
}
STACK2 *push2(STACK2 *top,char x) /*入栈函数*/
{
STACK2 *p; /*临时指针类型为STACK2*/
p=(STACK2 *)malloc(sizeof(STACK2)); /*申请STACK2大小的空间*/
if(p==NULL) /*如果p为空*/
{
printf("memory is overflow
!!"); /*显示内存溢出*/
exit(0); /*退出*/
}
p->data=x; /*保存值x到新空间*/
p->link=top; /*新结点的后继为当前栈顶指针*/
top=p; /*新的栈顶指针为新插入的结点*/
return top; /*返回栈顶指针*/
}
STACK2 *pop2(STACK2 *top) /*出栈*/
{
STACK2 *q; /*定义临时变量*/
q=top; /*保存当前栈顶指针*/
top=top->link; /*栈顶指针后移*/
free(q); /*释放q*/
return top; /*返回栈顶指针*/
}
char topx2(STACK2 *top) /*读栈顶元素*/
{
if(top==NULL) /*栈是否为空*/
{
printf("Stack is null
"); /*显示栈为空信息*/
return ''; /*返回空字符*/
}
return top->data; /*返回栈顶元素*/
}
STACK2 *ptop2(STACK2 *top,char *x) /*取栈顶元素,并删除栈顶元素*/
{
*x=topx2(top); /*读栈顶元素*/
top=pop2(top); /*删除栈顶元素*/
return top; /*返回栈顶指针*/
}
int empty2(STACK2 *top) /*判栈是否为空*/
{
if(top==NULL) /*如果为空*/
return 1; /*返回1*/
else
return 0; /*否则返回0*/
}

int text1(char *s)
{
setbkcolor(BLUE); /*设置背景颜色为蓝色*/
cleardevice(); /*清除屏幕*/
setcolor(12); /*设置文本颜色为淡红色*/
settextstyle(1, 0, 8);/*三重笔划字体, 放大8倍*/
outtextxy(120, 120, s); /*输出字符串s*/
setusercharsize(2, 1, 4, 1);/*水平放大2倍, 垂直放大4倍*/
setcolor(15); /*设置文本颜色为*白色/
settextstyle(3, 0, 5); /*无衬字笔划, 放大5倍*/
outtextxy(220, 220, s); /*输出字符串s*/
getch(); /*键盘输入任一字符*/
return ; /*返回*/
}

#include "stdio.h"
#include "math.h"
#include "time.h"

void main()
{
void first();
void second();
int third();
time_t t;
int close=0;
char get;
clrscr();
srand((unsigned) time(&t));
for(;;)
{
clrscr();
printf("24 POINTS SYSTEM v2.2
");
printf("MADE BY DANTE WANG
");
printf("Jul.28th 2006

");
printf("Please choose mode!

");
printf("1. Game Mode
");
printf("2. Count Mode
");
printf("3. Quit

");
get=getch();
switch(get)
{
case '1': first(); break;
case '2': second();break;
case '3': close=third(); break;
default: printf("Please input 1, 2 or 3!
"); getch();
}
if(close)
break;
}
}

void first()
{
int jdgsgn(int a,int b,int c,int d);
int n[4],i;
char ch[100],ch1[100];
int check(char *p);
int exam2(char *p,int a,int b,int c,int d);
void sign(int a,int b,int c,int d);
double figure(char *p);
void draw(int *p);
for(;;)
{
for(i=0;i<4;i++)
{
n[i]=rand()%13+1;
}
draw(n);
if(!jdgsgn(n[0],n[1],n[2],n[3]))
{
printf("No answer!");
getch();
continue;
}
gets(ch);
if(!strcmp(strlwr(ch),"quit"))
break;
else
{
strcpy(ch1,ch);
if(!check(ch)&&!exam2(ch,n[0],n[1],n[2],n[3])&&fabs(figure(ch1)-24)<=0.000001)
{
printf("
Good job!
");
getch();
}
else
{
printf("
Wrong!

Answer: ");
sign(n[0],n[1],n[2],n[3]);
getch();
}
}
}
}

void second()
{
int n[4],i;
char c[4][10];
int exam(char *p);
void sign(int a,int b,int c,int d);
double recog(char *p);
clrscr();
printf("Input 0 to leave.

");
for(;;)
{
for(i=0;i<4;i++)
{
scanf("%s",&c[i]);
if(exam(c[i]))
{
printf("GRAMMER ERROR!
");
i--;
continue;
}
n[i]=(int)recog(c[i]);
if(n[i]==0)
break;
}
if(n[0]&&n[1]&&n[2]&&n[3])
sign(n[0],n[1],n[2],n[3]);
else
break;
}
}

int third()
{
printf("Thanks for using this software!

");
printf("If you have any advices or suggestions,

");
printf("welcome to send email to wyc890618@163.com.

");
getch();
return(1);
}

void sign(int a,int b,int c,int d)
{
char *change(int x);
double figure(char *p);
int i[4],n,n1,n2,n3,n4,s1,s2,s3,t,flag=0;
char s[4][2]={"+","-","*","/"},p[64]={0},p1[64]={0};
i[0]=a;
i[1]=b;
i[2]=c;
i[3]=d;
for(n1=0;n1<4;n1++)
{
for(n2=0;n2<4;n2++)
{
if(n2==n1)
continue;
for(n3=0;n3<4;n3++)
{
if(n3==n2||n3==n1)
continue;
for(n4=0;n4<4;n4++)
{
if(n4==n3||n4==n2||n4==n1)
continue;
for(s1=0;s1<4;s1++)
{
for(s2=0;s2<4;s2++)
{
for(s3=0;s3<4;s3++)
{
strcat(p,change(i[n1]));
strcat(p,s[s1]);
strcat(p,change(i[n2]));
strcat(p,s[s2]);
strcat(p,change(i[n3]));
strcat(p,s[s3]);
strcat(p,change(i[n4]));



作者: wyc890618 2006-8-7 15:46 回复此发言

--------------------------------------------------------------------------------

2 完美的24点运算与游戏程序
strcpy(p1,p);
if(fabs(figure(p1)-24)<=0.000001)
{
printf("%s
",p);
flag++;
break;
}
*p='\0';
if(s1/2==1&&(s2/2==0||s3/2==0))
{
strcat(p,change(i[n1]));
strcat(p,s[s1]);
strcat(p,"(");
strcat(p,change(i[n2]));
strcat(p,s[s2]);
strcat(p,change(i[n3]));
strcat(p,s[s3]);
strcat(p,change(i[n4]));
strcat(p,")");
strcpy(p1,p);
if(fabs(figure(p1)-24)<=0.000001)
{
printf("%s
",p);
flag++;
break;
}
*p='\0';
}
if(s1/2==0&&s2/2==1)
{
strcat(p,"(");
strcat(p,change(i[n1]));
strcat(p,s[s1]);
strcat(p,change(i[n2]));
strcat(p,")");
strcat(p,s[s2]);
strcat(p,change(i[n3]));
strcat(p,s[s3]);
strcat(p,change(i[n4]));
strcpy(p1,p);
if(fabs(figure(p1)-24)<=0.000001)
{
printf("%s
",p);
flag++;
break;
}
*p='\0';
}
if(s2/2==0&&s1/2==1)
{
strcat(p,change(i[n1]));
strcat(p,s[s1]);
strcat(p,"(");
strcat(p,change(i[n2]));
strcat(p,s[s2]);
strcat(p,change(i[n3]));
strcat(p,")");
strcat(p,s[s3]);
strcat(p,change(i[n4]));
strcpy(p1,p);
if(fabs(figure(p1)-24)<=0.000001)
{
printf("%s
",p);
flag++;
break;
}
*p='\0';
}
if((s1/2==0||s2/2==0)&&s3/2==1)
{
strcat(p,"(");
strcat(p,change(i[n1]));
strcat(p,s[s1]);
strcat(p,change(i[n2]));
strcat(p,s[s2]);
strcat(p,change(i[n3]));
strcat(p,")");
strcat(p,s[s3]);
strcat(p,change(i[n4]));
strcpy(p1,p);
if(fabs(figure(p1)-24)<=0.000001)
{
printf("%s
",p);
flag++;
break;
}
*p='\0';
}
if(s1/2==0&&s2/2==1&&s3/2==0)
{
strcat(p,"(");
strcat(p,change(i[n1]));
strcat(p,s[s1]);
strcat(p,change(i[n2]));
strcat(p,")");
strcat(p,s[s2]);
strcat(p,"(");
strcat(p,change(i[n3]));
strcat(p,s[s3]);
strcat(p,change(i[n4]));
strcat(p,")");
strcpy(p1,p);
if(fabs(figure(p1)-24)<=0.000001)
{
printf("%s
",p);
flag++;
break;
}
*p='\0';
}
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
break;
}
if(flag==0)
printf("No answer!
");
}

char *change(int x)
{
static char a[64];
char *c;
c=a+63;
*c='\0';
c--;
for(;;c--)
{
if(x>=10)
{
*c=x%10+'1'-1;
x=x/10;
}
else
{
*c=x+'1'-1;
break;
}
}
return©;
}

double figure(char *p)
{
int judge(char *p);
int judge2(char *p);
void add(char *p);
void pick(char *p);
double recog(char *p);
char *c=p,*c1,c2[64];
int sign,kuoh=0,flag2=0;
double result,chu;
add(p);
for(sign=0;*c!='\0';c++)
{
if(*c=='+'||*c=='-'||*c=='*'||*c=='/'||*c=='('||*c==')')
{
sign++;
break;
}



作者: wyc890618 2006-8-7 15:46 回复此发言

--------------------------------------------------------------------------------

3 完美的24点运算与游戏程序
}
if(sign==0)
return(recog(p));
else
{
c=p;
for(;*c!='\0';c++)
{
if(*c=='(')
kuoh++;
if(*c==')')
kuoh--;
if(!judge2©)
{
if(*c=='+'&&kuoh==0)
{
*c='\0';
result=figure(p)+figure(c+1);
flag2++;
break;
}
if(*c=='-'&&kuoh==0)
{
*c='\0';
result=figure(p)-figure(c+1);
flag2++;
break;
}
}
if(!judge©)
{
if(*c=='*'&&kuoh==0)
{
*c='\0';
result=figure(p)*figure(c+1);
flag2++;
break;
}
if(*c=='/'&&kuoh==0)
{
*c='\0';
chu=figure(c+1);
if(chu==0)
{
result=99999;
}
else
{
result=figure(p)/chu;
}
flag2++;
break;
}
}
}
if(flag2)
return(result+0);
else
{
pick(p);
result=figure(p);
return(result+0);
}
}
}

int judge(char *p)
{
char *c=p;
int kuoh=0,flag=0;
for(c++;*c!='\0';c++)
{
if(*c=='(')
kuoh++;
if(*c==')')
kuoh--;
if(kuoh==0&&(*c=='+'||*c=='-'||*c=='*'||*c=='/'))
{
flag++;
break;
}
}
return(flag);
}

int judge2(char *p)
{
char *c=p;
int kuoh=0,flag=0;
for(c++;*c!='\0';c++)
{
if(*c=='(')
kuoh++;
if(*c==')')
kuoh--;
if(kuoh==0&&(*c=='+'||*c=='-'))
{
flag++;
break;
}
}
return(flag);
}

void add(char *p)
{
char *c=p,b[64];
int flag=0;
for(;*c!='\0';c++)
{
if((*c=='-'||*c=='+')&&(*(c+1)>='0'&&*(c+1)<='9'))
flag++;
if((*c>='0'&&*c<='9'||*c=='.')&&(*(c+1)=='*'||*(c+1)=='/'||*(c+1)=='+'||*(c+1)=='-'))
{
flag++;
break;
}
if((*c>='0'&&*c<='9'||*c=='.')&&*(c+1)==')')
{
break;
}
}
if(flag==2)
flag=1;
else
flag=0;
if(flag)
{
c=p;
for(;*c!='\0';c++)
{
if(*(c+1)>='0'&&*(c+1)<='9')
{
if(*c=='+'||*c=='-')
{
strcpy(b,c);
*c='(';
strcpy(c+1,b);
}
break;
}
}
c+=2;
for(;*c!='\0';c++)
{
if((*c'9')&&*c!='.')
{
strcpy(b,c);
*c=')';
strcpy(c+1,b);
break;
}
}
}
}

void pick(char *p)
{
char *c=p;
if(*c=='('&&*(c+strlen©-1)==')')
{
strcpy(c,c+1);
*(c+strlen©-1)='\0';
}
}


double recog(char *p)
{
char *c=p;
int flag=0,number;
double quan,ans=0;
for(;;c++)
{
if(*c=='.')
{
flag++;
number=c-p;
}
if(*c!='.'&&(*c'9'))
break;
}
if(flag==0)
{
for(quan=1,c--;c>=p;c--,quan*=10)
ans+=(*c-'1'+1)*quan;
}
else
{
for(c--,quan=pow(10,number-(c-p));c>=p;c--)
{
if(*c=='.')
continue;
else
{
ans+=(*c-'1'+1)*quan;
quan*=10;
}
}
}
return(ans);
}

int exam(char *p)
{
double recog(char *p);
char *c=p;
int number=0;
for(;*c!='\0';c++)
{
if(*c>'9'||*c<'0')
number++;
if(number)
break;
}
if(!number)
{
if(recog(p)>13||recog(p)<0)



作者: wyc890618 2006-8-7 15:46 回复此发言

--------------------------------------------------------------------------------

4 完美的24点运算与游戏程序
number++;
}
return(number);
}

void draw(int *p)
{
time_t t;
int n;
clrscr();
printf("Press \"quit\" to leave.");
srand((unsigned) time(&t));
for(n=0;n<4;n++)
{
gotoxy(1+7*n,3);
printf("\xda\xc4\xc4\xc4\xc4\xbf");
gotoxy(1+7*n,4);
printf("\xb3%c \xb3",rand()%4+3);
gotoxy(1+7*n,5);
printf("\xb3 \xb3");
gotoxy(1+7*n,6);
switch(*(p+n))
{
case 1:
printf("\xb3 A\xb3");
break;
case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:
printf("\xb3%4d\xb3",*(p+n));
break;
case 11:
printf("\xb3 J\xb3");
break;
case 12:
printf("\xb3 Q\xb3");
break;
case 13:
printf("\xb3 K\xb3");
}
gotoxy(1+7*n,7);
printf("\xc0\xc4\xc4\xc4\xc4\xd9");
gotoxy(1,9);
}
}

int jdgsgn(int a,int b,int c,int d)
{
char *change(int x);
double figure(char *p);
int i[4],n,n1,n2,n3,n4,s1,s2,s3,t,flag=0;
char s[4][2]={"+","-","*","/"},p[64]={0},p1[64]={0};
i[0]=a;
i[1]=b;
i[2]=c;
i[3]=d;
for(n1=0;n1<4;n1++)
{
for(n2=0;n2<4;n2++)
{
if(n2==n1)
continue;
for(n3=0;n3<4;n3++)
{
if(n3==n2||n3==n1)
continue;
for(n4=0;n4<4;n4++)
{
if(n4==n3||n4==n2||n4==n1)
continue;
for(s1=0;s1<4;s1++)
{
for(s2=0;s2<4;s2++)
{
for(s3=0;s3<4;s3++)
{
strcat(p,change(i[n1]));
strcat(p,s[s1]);
strcat(p,change(i[n2]));
strcat(p,s[s2]);
strcat(p,change(i[n3]));
strcat(p,s[s3]);
strcat(p,change(i[n4]));
strcpy(p1,p);
if(fabs(figure(p1)-24)<=0.000001)
{
flag++;
break;
}
*p='\0';
if(s1/2==1&&(s2/2==0||s3/2==0))
{
strcat(p,change(i[n1]));
strcat(p,s[s1]);
strcat(p,"(");
strcat(p,change(i[n2]));
strcat(p,s[s2]);
strcat(p,change(i[n3]));
strcat(p,s[s3]);
strcat(p,change(i[n4]));
strcat(p,")");
strcpy(p1,p);
if(fabs(figure(p1)-24)<=0.000001)
{
flag++;
break;
}
*p='\0';
}
if(s1/2==0&&s2/2==1)
{
strcat(p,"(");
strcat(p,change(i[n1]));
strcat(p,s[s1]);
strcat(p,change(i[n2]));
strcat(p,")");
strcat(p,s[s2]);
strcat(p,change(i[n3]));
strcat(p,s[s3]);
strcat(p,change(i[n4]));
strcpy(p1,p);
if(fabs(figure(p1)-24)<=0.000001)
{
flag++;
break;
}
*p='\0';
}
if(s2/2==0&&s1/2==1)
{
strcat(p,change(i[n1]));
strcat(p,s[s1]);
strcat(p,"(");
strcat(p,change(i[n2]));
strcat(p,s[s2]);
strcat(p,change(i[n3]));
strcat(p,")");
strcat(p,s[s3]);
strcat(p,change(i[n4]));
strcpy(p1,p);
if(fabs(figure(p1)-24)<=0.000001)
{
flag++;
break;
}
*p='\0';
}
if((s1/2==0||s2/2==0)&&s3/2==1)
{
strcat(p,"(");
strcat(p,change(i[n1]));
strcat(p,s[s1]);
strcat(p,change(i[n2]));
strcat(p,s[s2]);
strcat(p,change(i[n3]));
strcat(p,")");
strcat(p,s[s3]);
strcat(p,change(i[n4]));

strcpy(p1,p);
if(fabs(figure(p1)-24)<=0.000001)
{
flag++;
break;
}
*p='\0';
}
if(s1/2==0&&s2/2==1&&s3/2==0)
{
strcat(p,"(");
strcat(p,change(i[n1]));
strcat(p,s[s1]);
strcat(p,change(i[n2]));
strcat(p,")");
strcat(p,s[s2]);
strcat(p,"(");
strcat(p,change(i[n3]));
strcat(p,s[s3]);
strcat(p,change(i[n4]));
strcat(p,")");
strcpy(p1,p);
if(fabs(figure(p1)-24)<=0.000001)
{
flag++;
break;
}
*p='\0';
}
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
break;
}
return(flag);
}

int exam2(char *p,int a,int b,int c,int d)
{
double recog(char *p);
int number=0,num[4],flag=0,n,m;
num[0]=a;
num[1]=b;
num[2]=c;
num[3]=d;
for(m=0;*p!='\0';p++,m++)
{
if(*p>='0'&&*p'9'||*(p+1)<'0'))
number++;
if(m>0&&*p>='0'&&*p='0'&&*(p-1)<='9')
continue;
if(*p='0')
{
if(recog(p)>13||recog(p)<1)
{
flag++;
break;
}
else
{
for(n=0;n<4;n++)
{
if(recog(p)==num[n])
{
num[n]=0;
break;
}
}
}
}
}
if(!flag)
{
if(number!=4)
flag++;
else
if(num[1]||num[2]||num[3]||num[0])
flag++;
}
return(flag);
}

int check(char *p)
{
int kuoh=0,flag=0;
for(;*p!='\0';p++)
{
if(*p==' ')
{
flag++;
break;
}
if(kuoh<0)
{
flag++;
break;
}
if(*p=='(')
kuoh++;
if(*p==')')
kuoh--;
if((*p=='+'||*p=='-'||*p=='*'||*p=='/')&&(*(p+1)=='*'||*(p+1)=='/'||*(p+1)=='+'||*(p+1)=='-'))
{
flag++;
break;
}
if(*p=='('&&(*(p+1)>'9'||*(p+1)<'0'&&*(p+1)!='-'))
{
flag++;
break;
}
if(*p==')'&&*(p+1)!='+'&&*(p+1)!='-'&&*(p+1)!='*'&&*(p+1)!='/'&&*(p+1)!='\0')
{
flag++;
break;
}
}
if(!flag)
{
if(kuoh!=0)
flag++;
}
return(flag);
}

(已经调试)
#define N 20
#define COL 100
#define ROW 40
#include "stdio.h"
#include "time.h" /*系统时间函数*/
#include "graphics.h" /*图形函数*/
#include "alloc.h"/*动态地址分配函数*/
#include "stdlib.h" /*库函数*/
#include "string.h" /*字符串函数*/
#include "ctype.h" /*字符操作函数*/
char p[4][13]={
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'},/*扑克牌,10用0来表示*/
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'},
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'},
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'}};
typedef struct node
{
int data;
struct node *link;
}STACK1; /*栈1*/
typedef struct node2
{
char data;
struct node2 *link;
}STACK2; /*栈2*/
void init(void);/*图形驱动*/
void close(void);/*图形关闭*/
void play(void);/*发牌的具体过程*/
void rand1(int j);/*随机发牌函数*/
void change(char *e,char *a); /*中缀变后缀函数*/
int computer(char *s); /*后缀表达式计算函数*/
STACK1 *initstack1(STACK1 *top); /*栈1初始化*/
STACK1 *push(STACK1 *top,int x); /*栈1入栈运算*/
STACK1 *pop(STACK1 *top); /*栈1删除栈顶元素*/
int topx(STACK1 *top); /*栈1读栈顶元素*/
STACK1 *ptop(STACK1 *top,int *x); /*栈1读出栈顶元素值并删除栈顶元素*/
int empty(STACK1 *top); /*判栈1是否为空函数*/
STACK2 *initstack2(STACK2 *top); /*栈2初始化*/
STACK2 *push2(STACK2 *top,char x); /*栈2入栈运算*/
STACK2 *pop2(STACK2 *top); /*栈2删除栈顶元素*/
char topx2(STACK2 *top); /*栈2读栈顶元素*/
STACK2 *ptop2(STACK2 *top,char *x); /*栈2读出栈顶元素值并删除栈顶元素*/
int empty2(STACK2 *top); /*判栈2是否为空函数*/
int text1(char *s) ; /*显示文本*/
main()
{
char s[N],s1[N],ch;
int i,result;
int gdriver, gmode;
clrscr(); /*清屏*/
init(); /*初始化函数*/
while(1)
{
setbkcolor(BLACK); /*设置背景颜色*/
cleardevice();/*清屏*/
play(); /*发牌*/
gotoxy(1,15); /*移动光标*/
printf("--------------------Note-------------------\n");
printf(" Please enter express accroding to above four number\n"); /*提示信息*/
printf(" Format as follows:2.*(5.+7.)\n");/*提示输入字符串格式*/
printf(" ----------------------------------------------\n");
scanf("%s%c",s1,&ch); /*输入字符串压回车键*/
change(s1,s); /*调用change函数将中缀表达式s1转换为后缀表达式s*/
result=computer(s); /*计算后缀表达式的值,返回结果result */
if(result==24) /*如果结果等于24*/
text1("very good"); /*调用函数text1显示字符串"very good"*/
else
text1("wrong!!!");/*否则函数text1显示字符串"wrong!!!"*/
printf("Continue (y/n)?\n"); /*提示信息,是否继续*/
scanf("%c",&ch); /*输入一字符*/
if(ch=='n'||ch=='N') /*如果该字符等于n或N*/
break; /*跳出循环,程序结束*/
} /*否则,开始下一轮循环*/
close();
return; /*返回*/
}
void rand1(int j)/*随机发牌函数*/
{
int kind,num;
char str[3],n;
randomize();
while(1)/*循环直到有牌发*/
{
kind=random(4); /*花色随机数*/
num=random(13); /*大小随机数*/
if(p[kind][num]!=-1) /*该数未取过*/
{
n=p[kind][num]; /*取相应位置的扑克牌数*/
p[kind][num]=-1; /*牌发好以后相应位置的元素置-1*/
break;
}
}
switch(kind)/*花式的判断*/
{
case 0:setcolor(RED);sprintf(str,"%c",3);break; /*红桃*/
case 1:setcolor(BLACK);sprintf(str,"%c",3);break; /*黑桃*/
case 2:setcolor(RED);sprintf(str,"%c",4);break; /*方片*/
case 3:setcolor(BLACK);sprintf(str,"%c",5);break; /*草花*/
}
settextstyle(0,0,2);
outtextxy(COL+j*100-30,ROW+100-46,str);/*显示左上角花色*/
outtextxy(COL+j*100+16,ROW+100+32,str); /*显示右下角花色*/
if(n!='0')/*输出其他牌*/
{
settextstyle(0,0,3);
sprintf(str,"%c",n);
outtextxy(COL+j*100-5,ROW+100-5,str);/*显示牌的大小*/
}
else/*输出10的时候*/
{
sprintf(str,"%d",10);
outtextxy(COL+j*100-6,ROW+100-5,str);
}
}
void play(void)/*发牌的具体过程*/
{
int j;
for(j=0;j<4;j++)
{
bar(COL+j*100-35,ROW+100-50,COL+j*100+35,ROW+1*100+50);/*画空牌*/
setcolor(BLUE);
rectangle(COL+j*100-32,ROW+100-48,COL+j*100+32,ROW+100+48); /*画矩形框*/
rand1(j); /*随机取牌*/
delay(10000); /*延时显示*/
}
}
void init(void)/*图形驱动*/
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
void close(void)/*图形关闭*/
{
closegraph();
}
void change(char *e,char *a) /*中缀字符串e转后缀字符串a函数*/
{
STACK2 *top=NULL; /* 定义栈顶指针*/
int i,j;char w;
i=0;
j=0;
while(e[i]!='\0') /*当字符串没有结束时*/
{
if(isdigit(e[i])) /*如果字符是数字*/
{
do{
a[j]=e[i]; /*将数字原样拷贝到数组a中*/
i++; /*e数组的下标加1*/
j++; /*a数组的下标加1*/
}while(e[i]!='.'); /*直到字符为数字结束符“.”为止*/
a[j]='.';j++; /*将数字结束符“.”拷贝到a数组依然保持结束标记*/
}
if(e[i]=='(') /*如果字符是“(”时*/
top=push2(top,e[i]); /*将其压入堆栈*/
if(e[i]==')') /*如果字符是“)”时*/
{
top=ptop2(top,&w); /*取出栈顶元素,并从栈顶删除该元素*/
while(w!='(') /*如果字符不是“(”时反复循环*/
{
a[j]=w; /*将栈顶元素存入a数组*/
j++; /*下标加1*/
top=ptop2(top,&w) ; /*取出栈顶元素,并从栈顶删除该元素*/
}
}
if(e[i]=='+'||e[i]=='-') /*如果字符是加或减号时*/
{
if(!empty2(top)) /*如栈不为空*/
{
w=topx2(top);
while(w!='(') /*当栈顶元素不是“(”时反复循环*/
{
a[j]=w;
j++; /*将栈顶元素存入表达式a中,a的下标加1*/
top=pop2(top); /*删除栈顶元素*/
if(empty2(top)) /*如果栈为空*/
break; /*跳出循环*/
else
w=topx2(top); /*否则读栈顶元素*/
}
}
top=push2(top,e[i]); /*将当前e的字符元素压入堆栈*/
}
if(e[i]=='*'||e[i]=='/') /*如果字符是乘或除号时*/
{
if(!empty2(top)) /*如栈不为空*/
{
w=topx2(top); /*读栈顶元素存入w*/
while(w=='*'||w=='/')/*当栈顶元素是乘或除时反复循环*/
{
a[j]=w;
j++; /*将栈顶元素存入字符串a中,a的下标加1*/
top=pop2(top); /*删除栈顶元素*/
if(empty2(top)) /*如果栈为空*/
break; /*跳出循环*/
else
w=topx2(top); /*否则读栈顶元素*/
}
}
top=push2(top,e[i]); /*将当前e字符元素压入堆栈*/
}
i++; /*e的下标加1*/
}
while(!empty2(top)) /*当不为空时反复循环*/
top=ptop2(top,&a[j++]); /*将栈顶元素存入数组a中*/
a[j]='\0'; /*将字符串结束标记写入最后一个数组元素中构成字符串*/
}
int computer(char *s) /* 计算函数*/
{
STACK1 *top=NULL;
int i,k,num1,num2,result;
i=0;
while(s[i]!='\0') /*当字符串没有结束时作以下处理*/
{
if(isdigit(s[i])) /*判字符是否为数字*/
{
k=0; /*k初值为0*/
do{
k=10*k+s[i]-'0'; /*将字符连接为十进制数字*/
i++; /*i加1*/
}while(s[i]!='.'); /*当字符不为‘.’时重复循环*/
top=push(top,k); /*将生成的数字压入堆栈*/
}
if(s[i]=='+') /*如果为'+'号*/
{
top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/
top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/
result=num2+num1; /*将num1和num2相加存入result中*/
top=push(top,result); /*将result压入堆栈*/
}
if(s[i]=='-') /*如果为'-'号*/
{
top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/
top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/
result=num1-num2; /*将num1减去num2结果存入result中*/
top=push(top,result); /*将result压入堆栈*/
}
if(s[i]=='*') /*如果为'*'号*/
{
top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/
top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/
result=num1*num2; /*将num1与num2相乘结果存入result中*/
top=push(top,result); /*将result压入堆栈*/
}
if(s[i]=='/') /*如果为'/'号*/
{
top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/
top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/
result=num1/num2; /*将num1除num2结果存入result中*/
top=push(top,result); /*将result压入堆栈*/
}
i++; /*i加1*/
}
top=ptop(top,&result); /*最后栈顶元素的值为计算的结果*/
return result; /*返回结果*/
}
STACK1 *initstack1(STACK1 *top) /*初始化*/
{
top=NULL; /*栈顶指针置为空*/
return top; /*返回栈顶指针*/
}
STACK1 *push(STACK1 *top,int x) /*入栈函数*/
{
STACK1 *p; /*临时指针类型为STACK1*/
p=(STACK1 *)malloc(sizeof(STACK1)); /*申请STACK1大小的空间*/
if(p==NULL) /*如果p为空*/
{
printf("memory is overflow\n!!"); /*显示内存溢出*/
exit(0); /*退出*/
}
p->data=x; /*保存值x到新空间*/
p->link=top; /*新结点的后继为当前栈顶指针*/
top=p; /*新的栈顶指针为新插入的结点*/
return top; /*返回栈顶指针*/
}
STACK1 *pop(STACK1 *top) /*出栈*/
{
STACK1 *q; /*定义临时变量*/
q=top; /*保存当前栈顶指针*/
top=top->link; /*栈顶指针后移*/
free(q); /*释放q*/
return top; /*返回栈顶指针*/
}
int topx(STACK1 *top) /*读栈顶元素*/
{
if(top==NULL) /*栈是否为空*/
{
printf("Stack is null\n"); /*显示栈为空信息*/
return 0; /*返回整数0*/
}
return top->data; /*返回栈顶元素*/
}
STACK1 *ptop(STACK1 *top,int *x) /*取栈顶元素,并删除栈顶元素*/
{
*x=topx(top); /*读栈顶元素*/
top=pop(top); /*删除栈顶元素*/
return top; /*返回栈顶指针*/
}
int empty(STACK1 *top) /*判栈是否为空*/
{
if(top==NULL) /*如果为空*/
return 1; /*返回1*/
else
return 0; /*否则返回0*/
}
STACK2 *initstack2(STACK2 *top) /*初始化*/
{
top=NULL; /*栈顶指针置为空*/
return top; /*返回栈顶指针*/
}
STACK2 *push2(STACK2 *top,char x) /*入栈函数*/
{
STACK2 *p; /*临时指针类型为STACK2*/
p=(STACK2 *)malloc(sizeof(STACK2)); /*申请STACK2大小的空间*/
if(p==NULL) /*如果p为空*/
{
printf("memory is overflow\n!!"); /*显示内存溢出*/
exit(0); /*退出*/
}
p->data=x; /*保存值x到新空间*/
p->link=top; /*新结点的后继为当前栈顶指针*/
top=p; /*新的栈顶指针为新插入的结点*/
return top; /*返回栈顶指针*/
}
STACK2 *pop2(STACK2 *top) /*出栈*/
{
STACK2 *q; /*定义临时变量*/
q=top; /*保存当前栈顶指针*/
top=top->link; /*栈顶指针后移*/
free(q); /*释放q*/
return top; /*返回栈顶指针*/
}
char topx2(STACK2 *top) /*读栈顶元素*/
{
if(top==NULL) /*栈是否为空*/
{
printf("Stack is null\n"); /*显示栈为空信息*/
return ''; /*返回空字符*/
}
return top->data; /*返回栈顶元素*/
}
STACK2 *ptop2(STACK2 *top,char *x) /*取栈顶元素,并删除栈顶元素*/
{
*x=topx2(top); /*读栈顶元素*/
top=pop2(top); /*删除栈顶元素*/
return top; /*返回栈顶指针*/
}
int empty2(STACK2 *top) /*判栈是否为空*/
{
if(top==NULL) /*如果为空*/
return 1; /*返回1*/
else
return 0; /*否则返回0*/
}

int text1(char *s)
{
setbkcolor(BLUE); /*设置背景颜色为蓝色*/
cleardevice(); /*清除屏幕*/
setcolor(12); /*设置文本颜色为淡红色*/
settextstyle(1, 0, 8);/*三重笔划字体, 放大8倍*/
outtextxy(120, 120, s); /*输出字符串s*/
setusercharsize(2, 1, 4, 1);/*水平放大2倍, 垂直放大4倍*/
setcolor(15); /*设置文本颜色为白色*/
settextstyle(3, 0, 5); /*无衬字笔划, 放大5倍*/
outtextxy(220, 220, s); /*输出字符串s*/
getch(); /*键盘输入任一字符*/
return ; /*返回*/
}

我可以用C++帮你编一个这样的小程序
但不知道C++算不算得上是C语言?
这个程序有些笨,它无法分辨重复的牌,
只能简单进行计算。但结果是没问题的
虽然和你需要的有点出入,但是下面的小程序也算是提供一种思路吧

#include<iostream>
using namespace std;

int main(){
int i1,i2,i3,i4,v,n1,n2;
double t1,t2,t3,t4,choice[4],s1[4],s2[4][4];

cout<<"##########################二十四点全解###################################\n友情提示:A=1,J=11,Q=12,K=13\n";
cout<<"请说出你抽到的第一牌:";
cin>>choice[0];
cout<<"请说出你抽到的第二牌:";
cin>>choice[1];
cout<<"请说出你抽到的第三牌:";
cin>>choice[2];
cout<<"请说出你抽到的第四牌:";
cin>>choice[3];
cout<<"########################## THINKING ###################################\n";
for(i1=0;i1<4;i1++){
t1=choice[i1];
for(i2=0;i2<4;i2++){
if(i2!=i1){
t2=choice[i2];
s1[0]=t1+t2;
s1[1]=t1-t2;
s1[2]=t1*t2;
s1[3]=t1/t2;
for(i3=0;i3<4;i3++){
if(i3!=i1&&i3!=i2){
t3=choice[i3];
for(v=0;v<4;v++)
{s2[v][0]=s1[v]+t3;
s2[v][1]=s1[v]-t3;
s2[v][2]=s1[v]*t3;
s2[v][3]=s1[v]/t3;}
for(i4=0;i4<4;i4++){
if(i4!=i1&&i4!=i2&&i4!=i1){
t4=choice[i4];
for(n1=0;n1<4;n1++)for(n2=0;n2<4;n2++)
if(s2[n1][n2]+t4==24||s2[n1][n2]-t4==24||s2[n1][n2]*t4==24||s2[n1][n2]/t4==24){
cout<<"找到一种组合方案:\n(("<<t1;

if(s1[n1]==t1+t2)cout<<" + ";
if(s1[n1]==t1-t2)cout<<" - ";
if(s1[n1]==t1*t2)cout<<" * ";
if(s1[n1]==t1/t2)cout<<" / ";

if(n2==0)cout<<t2<<") + "<<t3;
if(n2==1)cout<<t2<<") - "<<t3;
if(n2==2)cout<<t2<<") * "<<t3;
if(n2==3)cout<<t2<<") / "<<t3;

if(s2[n1][n2]+t4==24)cout<<") + "<<t4<<" = 24 \n";
if(s2[n1][n2]-t4==24)cout<<") - "<<t4<<" = 24 \n";
if(s2[n1][n2]*t4==24)cout<<") * "<<t4<<" = 24 \n";
if(s2[n1][n2]/t4==24)cout<<") / "<<t4<<" = 24 \n";

}

}}}
}}}}

return 0;
}

不会C 只会C++。。。。
有个前两天写的 检验4张牌的计算24点的有效性(即4张牌的点数能不能算出来)

//输入 A 2 3 ... 8 9 10 J Q K 输出 yes or no
//ex
// 3 5 6 2
// YES

#include<iostream>
#include<vector>
#include<cmath>
#include<string>
using namespace std;

inline int times(int a, int b)
{
if(a==0 && b==0)
return 0;
else
{
if(a==0)
return 1;
else if(b==0)
return -1;
else if(a%b==0)
return 1;
else if(b%a==0)
return -1;
else
return 0;
}
}

bool dfs(vector<int> card)
{
if(card.size()==2)
{
if(card[0]+card[1]==24 || card[0]*card[1]==24 || abs(card[0]-card[1])==24)
return 1;
if(times(card[0],card[1])==0)
return 0;
if(times(card[0],card[1])==1)
return card[0]/card[1]==24;
if(times(card[0],card[1])==-1)
return card[1]/card[0]==24;
return 0;
}
for(int i = 0;i<card.size()-1;i++)
for(int j = i+1;j<card.size();j++)
{
for(int k = 0;k<4;k++)
{
if(k==0)
{
vector<int> temp;
for(int k = 0;k<card.size();k++)
if(k!=i && k!=j)
temp.push_back(card[k]);
temp.push_back(card[i]+card[j]);
if(dfs(temp))
return 1;
continue;
}
if(k==1)
{
vector<int> temp;
for(int k = 0;k<card.size();k++)
if(k!=i && k!=j)
temp.push_back(card[k]);
temp.push_back(abs(card[i]-card[j]));
if(dfs(temp))
return 1;
continue;
}
if(k==2)
{
vector<int> temp;
for(int k = 0;k<card.size();k++)
if(k!=i && k!=j)
temp.push_back(card[k]);
temp.push_back(card[i]*card[j]);
if(dfs(temp))
return 1;
continue;
}
if(k==3)
{
int result = times(card[i],card[j]);
if(result==0)
continue;
else
{
vector<int> temp;
for(int k = 0;k<card.size();k++)
if(k!=i && k!=j)
temp.push_back(card[k]);
if(result==1)
{
temp.push_back(card[i]/card[j]);
if(dfs(temp))
return 1;
continue;
}
else
{
temp.push_back(card[j]/card[i]);
if(dfs(temp))
return 1;
continue;
}
}
}
}
}
return 0;
}

int main()
{
vector<int> card;
string input;
for(;;)
{
for(int i = 0;i<4;i++)
{
cin>>input;
if(input=="J")
card.push_back(11);
else if(input=="Q")
card.push_back(12);
else if(input=="K")
card.push_back(13);
else if(input=="A")
card.push_back(1);
else if(input=="10")
card.push_back(10);
else
card.push_back(input[0] - 48);
}
if(dfs(card))
cout<<"YES";
else
cout<<"NO";
cout<<endl;
}
return 0;
}


c语言hello world怎么写
2、然后在一步步默认点击确定,完成即可,此时工作空间就建立起来了。二、接下来,再点击工具栏下的文件,里面有个新建菜单,点击它,出现下图的对话框:1、点击确定即可,创建出一个helloworld.c的小程序,然后我们就可以编写我们的Hello World小程序了。此时就需要我们的VC++ 6.0来编译此程序,编译无...

用C语言编写一个简单程序,有哪些步骤,可以举一个例子详细讲解下吗?_百 ...
include<stdio> \/\/这个是头文件 也是 C语言里面最常用的头文件之一 int main()\/\/这个是主函数 也就是程序的入口 你写的程序就是从这里开始的 { \/\/这个 { }表示里面的范围 是必须的 跟main 主函数是不可分的 int a=2; \/\/这里表示有一个 int型的数据a(int型就是整数...

用C语言编写一个程序:
void main(){ int result = 0; for(int i = 1;i <= 100; ++i)\/\/求和, result += i; std::cout<<result<<std::endl;\/\/打印和 char a[10] = {};itoa(result,a,10);\/\/转字符串 std::cout<<a<<std::endl;\/\/打印字符串 FILE* pf = NULL; fopen_s(&pf,"result.tx...

如何用C语言编写一个程序,输入你的姓名和年龄并输出?
include <stdio.h> int main(void){ char name[20];int age;printf("请输入你的姓名:");scanf("%s",name);printf("请输入你的年龄:");scanf("%d",&age);printf("你的姓名是:%s\\n",name);printf("你的年龄是:%d\\n",age);return 0;} ...

使用C语言编写一个程序完成以下任务
1,解:源程序如下:include <stdio.h> int juzhen(int a[3][3]){ int i,j,t;for (i=0;i<3;i++)for (j=i+1;j<3;j++){ t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;} } int juchen(int a[3][3],int b[][3],int c[][3]){ int i,j;for (i=0;i<3...

求用C语言编写一个程序
if(c!=1){ switch(c){case 0: break;case 2: printf( " twenty ");break;case 3: printf( " thirty ");break;case 4: printf( " forty ");break;case 5: printf( " fifty ");break;case 6: printf( " sixty ");break;case 7: printf(" seventy ");break;case 8: printf( ...

用c语言编写一个程序实现以下功能
include "stdio.h"int main(int argc,char *argv[]){int a,b;double x,y;char ch1,ch2;printf("Please enter the data...\\n");scanf("%d%d%lf%lf %c%c",&a,&b,&x,&y,&ch1,&ch2);printf("\\na=%d,b=%d\\nx=%f,y=%f\\nch1=%c,ch2=%c\\n",a,b,x,y,ch1,ch2);return ...

用C语言编写一个程序
include <string.h> include <memory.h> include <stdio.h> \/*要求:用C语言编写一个程序 ? 可以读入任何一个文本文件,并计算文件中每一个字符出现的次数与百分比,并将结果写入另一个文件中,输出格式如下:字符 次数 百分比 A 3 1.25% *\/ void f1(){ char filename[100];int charmap[...

用C语言能编出一个有计算器界面的计算器么?
这段代码是一个使用C语言编写的计算器程序,旨在图形界面下运行。不过,代码中存在一些问题,例如变量未初始化、语法错误、逻辑错误以及一些不正确的函数调用。以下是修改后的代码,我已经纠正了这些问题,并且改进了代码的结构和可读性。```c include include include include include include include \/* ...

如何用C语言编写一个窗体应用程序?
要用C语言编写一个窗体应用程序需要调用系统或第三方提供的API函数,一般的步骤是:定义窗口类 注册窗口类 创建窗口 显示、更新窗口 进行消息循环,不断处理窗口消息

奉化市15890677288: 24点游戏用c语言怎么写?? -
管万雷公: 你首先要懂得C语言编写规则,其次了解24点游戏的玩法及规则,然后就可以选择一个合适的编译器,开始编写24点游戏了

奉化市15890677288: 如何用C语言做一个24点游戏的程序? -
管万雷公: /*6.3.4nbsp;源程序*/#definenbsp;Nnbsp;20#definenbsp;COLnbsp;100#definenbsp;ROWnbsp;40#includenbsp;“stdio.h“#includenbsp;“time.h“nbsp;/*系统时间函数*/#includenbsp;“graphics.h“nbsp;/*图形函数*/#includenbsp;“alloc.h...

奉化市15890677288: 求助怎么用C语言设计一个算24游戏? -
管万雷公: #include"math.h" int total=0,count=0,page; char temp; main(){float sum(float,float,char);void test24(float [],char []);int i,j,k,l,q,r,s,t,n=0;float a[4];char f[4]={'+','-','*','/'};float x[4];char y[3];int go=1;while(go==1){printf("Please input how many ...

奉化市15890677288: 24点游戏设计与实现 C语言 -
管万雷公: 大概方法:1,利用srand和rand产生四个13以内的随机整数.2,利用堆栈校验游戏者输入算式的正确性.

奉化市15890677288: 加减乘除求24点的游戏怎么用C语言编啊?
管万雷公: #include "stdio.h" #include "math.h" #include "time.h" void main() { void first(); void second(); int third(); time_t t; int close=0; char get; clrscr(); srand((unsigned) time(&t)); for(;;) { clrscr(); printf("24 POINTS SYSTEM v2.2\n"); printf("MADE ...

奉化市15890677288: 求个C语言的24点游戏源代码
管万雷公: 用if 或者switch 就可以实现.下面分别用两种语句写的: 用if: #include "stdio.h" void main() { char a; scanf("%c",&a); if (a=='Y'||a=='y') printf("1\n"); if(a=='N'||a=='n') printf("0\n"); } 用switch :(请输大写) #include "stdio.h" void main(...

奉化市15890677288: C语言编写24点游戏 -
管万雷公: tony124说的那个,系统自动生成1-13的数,提示玩家输入算式(如A+B—C*if(result==24) /*如果结果等于24*/ text1(

奉化市15890677288: 用c语言编写24点代码分析 -
管万雷公: #include<stdio.h> double fun(double a1,double a2,int b) //用于尝试着计算的函数,b为运算控制 { switch(b) { case 0:return (a1+a2); case 1:return (a1-a2); case 2:return (a1*a2); case 3:return (a1/a2); } } void main() { int i,j,k,l,n,m,r,save[4]; double num...

奉化市15890677288: 用C语言设计算法完成24点游戏的计算. -
管万雷公: 这个不适合用C语言实现,扑克牌需要有图形界面,C语言是字符界面,建议用Java.

奉化市15890677288: C语言程序设计“算24”游戏求救! -
管万雷公: #include<iostream>#include<math.h> using namespace std; const double MIN=1E-6; void Print(int *Rank,double *FourNum) { for(int i=0;i<4;i++) cout<<FourNum[Rank[i]]<<" "; cout<<endl; } void Calculate_24(int *Rank,double *FourNum,char *...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网