如何用TC3.0编写一个算24点的简单程序

要求:1不涉及指针栈等高端技巧,最多只能有递归出;2现允许出现重复解但解必须完备正确;3A=1,J=11,Q=12,K=13,0(不是字母O)=10;... 要求:1不涉及指针栈等高端技巧,最多只能有递归出;
2现允许出现重复解但解必须完备正确;
3A=1,J=11,Q=12,K=13,0(不是字母O)=10;
展开
 我来答
百度网友d127579
推荐于2016-10-08 · TA获得超过1663个赞
知道小有建树答主
回答量:634
采纳率:0%
帮助的人:0
展开全部
完美的24点运算与游戏程序

一个功能较全的24点程序

有倒计时的游戏计算模式(电子词典上那种)
和直接计算模式

Turbo C 3.0上编译通过

作者王煜城
Email:wyc890618 at 163 dot com
QQ:398872223

#include stdio.h 调用函数库
#include math.h
#include time.h
#include conio.h
#include string.h
#include stdlib.h
#include bios.h

#define SECOND 20 设定一秒钟长度
#define TIMELEFTX 35 定位TIME LEFT横坐标
#define TIMELEFTY 3 定位TIME LEFT纵坐标
#define MAXTIME 60 设定游戏模式的思考时间长度

void main()
{
void first(); 游戏模式
void second(); 计算模式
void third(); 离开
time_t t; 作时间种子
char get; 存储选择模式时的按键
srand((unsigned) time(&t)); 产生随机数的起始发生数据
for(;;)
{
clrscr(); 清屏
printf(24 POINTS SYSTEM v2.3n); 输出信息
printf(MADE BY DANTE WANGn);
printf(Oct.29th 2006nn);
printf(Please choose mode!nn);
printf(1. Game Moden);
printf(2. Count Moden);
printf(3. Quitnn);
get=getch(); 记录按键
switch(get)
{
case '1' first(); break; 调用函数first
case '2' second(); break; 调用函数second
case '3' third(); break; 调用函数third
default printf(Please input 1, 2 or 3!n);
getch(); 提示只输入1,2,3
}
if(get=='3') 判断是否退出循环
break;
}
}

void first() 游戏模式
{
int getstring(char p); 游戏模式时输入函数
int check(char p);
int exam2(char p,int a,int b,int c,int d);
int sign(int a,int b,int c,int d,int mode);
double figure(char p);
int n[4],i; 存储4张牌点数
char ch[100],ch1[100]; 存储输入数据
void draw(int p);
for(;;)
{
for(i=0;i4;i++)
{
n[i]=rand()%13+1; 随机产生4张牌的点数
}
draw(n); 画出开局
if(!sign(n[0],n[1],n[2],n[3],0))判断是否有解
{
printf(No answer!); 无解输出No answer!
getch();
continue; 循环重新进行
}
if(getstring(ch)) 判断是否在规定时间输入
{
if(!strcmp(strlwr(ch),quit))
输入内容与quit比较
break; 相同即退出
else
{
strcpy(ch1,ch); 否则将ch值递给ch1
if(!check(ch) &&
检查输入数据符号格式
!exam2(ch,n[0],n[1],n[2],n[3]) &&
检查输入数据数值格式
fabs(figure(ch1)-24)=0.000001)
判断答案是否为24
{
printf(nGood job!n);
getch(); 输出Good job!
}
else
{
printf(nWrong!nnAnswer );
sign(n[0],n[1],n[2],n[3],1);
getch();
答案错输出Wrong!Answer及答案
}
}
}
else
{
printf(nTime Over!nnAnswer );
sign(n[0],n[1],n[2],n[3],1);
getch();
超时间输出TimeOver!Answer及答案

}
}
}

void second() 计算模式
{
int n[4],i; 储存输入4数数值
char c[4][10]; 储存输入的数字字符

作者: ·兲兲· 2006-10-10 2216 回复此发言

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

2 完美的24点运算与游戏程序
int exam(char p);
int sign(int a,int b,int c,int d,int mode);
double recog(char p);
clrscr(); 清屏
printf(Input 0 to leave.nn);输出提示
for(;;)
{
for(i=0;i4;i++)
{
scanf(%s,&c[i]); 输入4数字符
if(exam(c[i])) 检查4数数值范围
{
printf(GRAMMER ERROR!n);
输出错误
i--; 重新输入
continue;
}
n[i]=(int)recog(c[i]); 将字符转化数值
if(n[i]==0)

return ; 值为0退出
}
sign(n[0],n[1],n[2],n[3],1); 输出正解
}
}

void third()
{
printf(Thanks for using this software!nn);
printf(If you have any advices or suggestions,nn);
printf(welcome to send email to wyc890618@163.com.nn);
getch(); 输出个人信息
}

int sign(int a,int b,int c,int d,int mode)
{ mode=0为判断,=1为输出模式
char change(int x); 将数值转化成字符型数字
double figure(char p); 将字符型算数表达式求值
int i[4],n1,n2,n3,n4,s1,s2,s3,t,flag=0;
char s[4][2]={+,-,,},p[64]={0},p1[64]={0};
i[0]=a; 数组i用于存储4个数
i[1]=b; 数组s用于存储4种符号
i[2]=c; n1-n4分别存储0-3对应数组i不同
i[3]=d; 元素即四个求24点的数
for(n1=0;n14;n1++) s1-s3分别存储0-3对应数组s不同
{ 元素即四种不同的符号
for(n2=0;n24;n2++) 数组p用于存储可能输出内容
{ 数组p1用于临时存储p判断值是
if(n2==n1) 否24,因为figure函数会破坏p
continue; 因为i[n1]-i[n4]要代表不同数
for(n3=0;n34;n3++) 所以n1-n4相等即continue
{
if(n3==n2n3==n1)
continue;
for(n4=0;n44;n4++)
{
if(n4==n3n4==n2n4==n1)
continue;
for(s1=0;s14;s1++) s1-s3为穿插在4数中的3个符号
{
for(s2=0;s24;s2++) 以下1代表1-13的数
{ +代表+,-
for(s3=0;s34;s3++) 代表,
{
strcat(p,change(i[n1])); 此为1+1+1+1类型
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)
{
if(mode)
printf(%sn,p);
flag++;
return flag;
}
p='0';
if(s12==1&&(s22==0s32==0)) 此为1(1+1+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,s[s3]);
strcat(p,change(i[n4]));
strcat(p,));
strcpy(p1,p);
if(fabs(figure(p1)-24)=0.000001)
{
if(mode)
printf(%sn,p);
flag++;
return flag;
}
p='0';
}
if(s12==0&&s22==1) 此为(1+1)1+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)
{
if(mode)
printf(%sn,p);
flag++;
return flag;

}
p='0';
}
if(s22==0&&s12==1) 此为1(1+1)+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,));

作者: ·兲兲· 2006-10-10 2216 回复此发言

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

3 完美的24点运算与游戏程序
strcat(p,s[s3]);
strcat(p,change(i[n4]));
strcpy(p1,p);
if(fabs(figure(p1)-24)=0.000001)
{
if(mode)
printf(%sn,p);
flag++;
return flag;
}
p='0';
}
if((s12==0s22==0)&&s32==1) 此为(1+1+1)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)
{
if(mode)
printf(%sn,p);
flag++;
return flag;
}
p='0';
}
if(s12==0&&s22==1&&s32==0) 此为(1+1)1+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,();
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)
{
if(mode)
printf(%sn,p);
flag++;
return flag;
}
p='0';
} 以上几种类型可代表所有类型
} 不重不漏
}
}
}
}
}
}
if(mode)
printf(No answer!n);
return flag;
}

char change(int x) 将数值转化成字符型数字
{
static char a[64]; 存储字符数字
char c; 存储字符数字的首位
c=a+63;
c='0';
c--;
for(;;c--) 通过每次的除10取余
{ 将十进制数每位转化成字符
if(x=10)
{
c=x%10+'1'-1;
x=x10;
}
else
{
c=x+'1'-1;
break;
}
}
return?; 最后将字符数字的首位传出
}

double figure(char p) 此部分实现一计算器功能
{
int judge_sym(char sym); 判断是否是+,-,,
int judge(char p);
int judge2(char p);
void add(char p); 添加负数的括号
void pick(char p); 摘除表达式两侧括号
double recog(char p); 将字符型数转化为double型
char c=p,c1,c2[64];
int sign,kuoh=0,flag2=0;
double result,chu;
add(p);
for(sign=0;c!='0';c++) 判断表达式内是否还有符号
{
if(judge_sym(c)c=='('c==')')
{
sign++;
break;
}
}
if(sign==0) 没有符号,直接转化
return(recog(p));
else
{
c=p;
for(;c!='0';c++)
{
if(c=='(')
kuoh++;
if(c==')')
kuoh--;
if(!judge2?) 判断c后面是否有+,-
{ 有则做后面的
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?) 判断c后面是否有+,-,,
{ 有则做后面的
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;
}
} 解释一下为什么做后面的
} 例1-2-3就是分成1-2和3
if(flag2) 中间用-连接 就变成递归
return(result+0); 1-2和3 所以做后面的起
else
{
pick(p);
result=figure(p);
return(result+0);
}
}
}

int judge(char p) 判断括号外是否有符号
{ 有返回1,无返回0

作者: ·兲兲· 2006-10-10 2216 回复此发言

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

4 完美的24点运算与游戏程序
int judge_sym(char sym);
char c=p;
int kuoh=0,flag=0;
for(c++;c!='0';c++)
{
if(c=='(')
kuoh++;
if(c==')')
kuoh--;
if(kuoh==0&&judge_sym(c))
{
flag++;
break;
}
}
return(flag);
}

int judge2(char p) 判断括号外是否有+,-
{ 有返回1,无返回0
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) 这部分是给诸如-1+6-9这类式
{ 前面的-1添加()成(-1)+6-9
int judge_num(char num);便于理解优先级
int judge_sym(char sym);
char c=p,b[64];
int flag=0;
for(;c!='0';c++)
{
if((c=='-'c=='+')&&judge_num((c+1)))
flag++;
if((judge_num(c)c=='.')&&judge_sym((c+1)))
{
flag++;
break;
}
if((judge_num(c)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'0'c'9')&&c!='.')
{
strcpy(b,c);
c=')';
strcpy(c+1,b);
break;
}
}
}
}

void pick(char p) 函数功能如果表达式两侧皆为括号
{ 例(1+1+1) 则将其两侧括号去除成1+1+1
char c=p;
if(c=='('&&(c+strlen?-1)==')')
{
strcpy(c,c+1);
(c+strlen?-1)='0';
}
}

double recog(char p) 函数功能与函数change的相反
{ 将字符数据转化成double型
int judge_num(char num);
char c=p;
int flag=0,number;
double quan,ans=0;
for(;;c++)
{
if(c=='.')
{
flag++;
number=c-p;
}
if(c!='.'&&!judge_num(c))
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) 检查输入数字是否在1-13之间
{
int judge_num(char num);
double recog(char p);
char c=p;
int number=0;
for(;c!='0';c++)
{
if(!judge_num(c))
number++;
if(number)
break;
}
if(!number)
{
if(recog(p)13recog(p)0)
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;n4;n++)
{
gotoxy(1+7n,3);
printf(xdaxc4xc4xc4xc4xbf);
gotoxy(1+7n,4);
printf(xb3%c xb3,rand()%4+3);
gotoxy(1+7n,5);
printf(xb3 xb3);
gotoxy(1+7n,6);
switch((p+n))
{
case 1
printf(xb3 Axb3);
break;
case 2case 3case 4case 5case 6case 7case 8case 9case 10
printf(xb3%4dxb3,(p+n));
break;
case 11
printf(xb3 Jxb3);
break;
case 12
printf(xb3 Qxb3);
break;
case 13
printf(xb3 Kxb3);
}

gotoxy(1+7n,7);
printf(xc0xc4xc4xc4xc4xd9);
}
gotoxy(TIMELEFTX-1,TIMELEFTY-2);

作者: ·兲兲· 2006-10-10 2216 回复此发言

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

5 完美的24点运算与游戏程序
printf(TIME);
gotoxy(TIMELEFTX-1,TIMELEFTY-1);
printf(LEFT);
gotoxy(TIMELEFTX,TIMELEFTY);
printf(60);
gotoxy(1,9);

}

int exam2(char p,int a,int b,int c,int d)
{ 检查输入的表达式中4数是否
int judge_num(char num); 与所求4数相同
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(judge_num(p)&&!judge_num((p+1)))
number++;
if(m0&&p='0'&&p='9'&&judge_num((p-1)))
continue;
if(p='9'&&p='0')
{
if(recog(p)13recog(p)1)
{
flag++;
break;
}
else
{
for(n=0;n4;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 judge_sym(char sym);涉及到方方面面
int kuoh=0,flag=0;
for(;p!='0';p++)
{
if(p==' ')
{
flag++;
break;
}
if(kuoh0)
{
flag++;
break;
}
if(p=='(')
kuoh++;
if(p==')')
kuoh--;
if(judge_sym(p)&&judge_sym((p+1)))
{
flag++;
break;
}
if(p=='('&&(!judge_num((p+1))&&(p+1)!='-'))
{
flag++;
break;
}
if(p==')'&&!judge_sym((p+1))&&(p+1)!='0')
{
flag++;
break;
}
}
if(!flag)
{
if(kuoh!=0)
flag++;
}
return(flag);
}

int getstring(char p)
{ 游戏模式中接受输入
int countdown(); 以及倒计时部分
int i=0,time=MAXTIME-1;
for(;;)
{
if(countdown())
{
if(!(time+1))
return 0;
gotoxy(TIMELEFTX,TIMELEFTY);
printf(%2d,time--);
}
gotoxy(i+1,9);
if(bioskey(1))
{
(p+i)=getch();
if(((p+i)=65&&(p+i)91(p+i)=97&&
(p+i)123judge_num((p+i)))&&
(p+i)!=0x48&&(p+i)!=0x4b&&(p+i)!=0x4d&&
(p+i)!=0x50(p+i)==8(p+i)==13
judge_sym((p+i))(p+i)=='('
(p+i)==')')
{
if((p+i)=='x8')
{
(p+i)=0;
if(i)
{
putchar('b');
putchar(' ');
putchar('b');
i--;
}
continue;
}
if((p+i)=='xd')
{
(p+i)='0';
printf(n);
return 1;
}
putch((p+i));
i++;
}
}
}
}

int countdown()
{
static long new, old;
new=biostime(0,0L);
if(!old)
old=new;
if(new-oldSECOND)
return 0;
else
{
old=new;
return 1;
}
}

int judge_num(char num)
{
if(num='0'&&num='9')
return 1;
else
return 0;
}

int judge_sym(char sym)
{
if(sym=='+'sym=='-'sym==''sym=='')
return 1;
else
return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式