回 帖 发 新 帖 刷新版面

主题:做了个算24点牌的C程序,另求算“猜数字”思想

先说“猜数字”,是不是最少7步?

//以下为24点程序//
//    +    -    *    /    --    -/
//    0    1    2    3    4    5

#include<stdio.h>
#include<math.h>

int treat(float a,float b,float c,float d);
float myF(int flag,float m,float n);
void myPrint(int type,int i,int j,int k,float a,float b,float c,float d);

int time,temp=0;
void main()
{
    int i,j,k,t,again,res,flag;
    float num[4];
    again=1;
    while(again==1)
    {
        printf ("\nPlease Enter 4 nums(1~13):\n");
        i=0;
        flag=0;
        while (flag==0)
        {
            i++;
        //    printf ("Input num-%d\n",i);
            for(i=0;i<4;i++)
            {
                scanf("%f",&num[i]);
                if (num[i]<1 || num[i]>13 || num[i]!=int(num[i]))
                    flag++;
            }
            if(flag!=0)
            {
                printf ("Error input again\n",i);
                flag=0;
            }
            else
                flag=1;
        }
        for (i=0;i<4;i++)
            for (j=0;j<4;j++)
                if (j!=i)
                    for (k=0;k<4;k++)
                        if (k!=j && k!=i)
                            for (t=0;t<4;t++)
                                if (t!=i && t!=j && t!=k)
                                {
                                    res=treat(num[i],num[j],num[k],num[t]);
                                }
    if (res==0)
        printf ("\nNo answer\n");
    else ;
    //    printf ("time=%d\n\n",time);
    printf ("\n1: Go on\n2: Quit\n");
    scanf ("%d",&again);
    }
}

int treat(float a,float b,float c,float d)
{
    int i,j,k;
    float sum1,sum2,sum3;
    for (i=0;i<4;i++)
        for (j=0;j<6;j++)
            for (k=0;k<6;k++)
            {
                if ((!(i==3 && b==0)) && (!(j==3 && c==0)) && (!(k==3 && d==0)))
                {
                    sum1=myF(i,a,b);
                    sum2=myF(j,sum1,c);
                    sum3=myF(k,sum2,d);
                    if (fabs(sum3-24)<0.1)
                    {
                        temp++;
                        myPrint(1,i,j,k,a,b,c,d);
                    //    printf ("sum1:myF(%d,%2.0f,%2.0f)  sum1=%f\n",i,a,b,sum1);
                    //    printf ("sum2:myF(%d,%2.0f,%2.0f)  sum2=%f\n",j,c,d,sum2);
                    //    printf ("1:myF(%d,myF(%d,myF(%d,%2.0f,%2.0f),%2.0f),%2.0f)   sum3=%f\n\n",k,j,i,a,b,c,d,sum3);
                    }
                }
                if (k==2)
                {
                    sum1=myF(i,a,b);
                    sum2=myF(j,c,d);
                    sum3=sum1*sum2;
                     if (fabs(sum3-24)<0.1)
                    {
                        temp++;
                        myPrint(2,i,j,k,a,b,c,d);
                    //    printf ("sum1:myF(%d,%2.0f,%2.0f)  sum1=%f\n",i,a,b,sum1);
                    //    printf ("sum2:myF(%d,%2.0f,%2.0f)  sum2=%f\n",j,c,d,sum2);
                    //    printf ("2:myF(%d,myF(%d,%2.0f,%2.0f),myF(%d,%2.0f,%2.0f))   sum3=%f\n\n",k,i,a,b,j,c,d,sum3);
                    }
                }

                if (k==3)
                {
                    sum1=myF(i,a,b);
                    sum2=myF(j,c,d);
                    if (sum2!=0)
                    {
                        sum3=sum1/sum2;
                         if (fabs(sum3-24)<0.1)
                        {
                            temp++;
                            myPrint(3,i,j,k,a,b,c,d);
                        //    printf ("sum1:myF(%d,%2.0f,%2.0f)  sum1=%f\n",i,a,b,sum1);
                        //    printf ("sum2:myF(%d,%2.0f,%2.0f)  sum2=%f\n",j,c,d,sum2);
                        //    printf ("3:myF(%d,myF(%d,%2.0f,%2.0f),myF(%d,%2.0f,%2.0f))   sum3=%f\n\n",k,i,a,b,j,c,d,sum3);
                        }
                    }
                }
            }
    if (temp==0)
        return 0;
    else
        return 1;
}

float myF(int flag,float m,float n)
{    
//    time++;
    if (flag==0)
        return (m+n);
    if (flag==1)
        return (m-n);
    if (flag==2)
        return (m*n);
    if (flag==3)
        if (n==0)
            return 30000;
        else
            return (m/n);
    if (flag==4)
        return (n-m);
    if (flag==5)
        if (m==0)
            return 30000;
        else
            return (n/m);
    return 0;
}

void myPrint(int type,int i,int j,int k,float a,float b,float c,float d)
{
    char sigle[6];
        sigle[0]='+';
        sigle[1]='-';
        sigle[2]='*';
        sigle[3]='/';
        sigle[4]='-';
        sigle[5]='/';
    if (type==1){
        if(j==4 || j==5)
        {
            if (k==4 || k==5)
                printf("%2.0f %c (%2.0f %c (%2.0f %c %2.0f)) =24\n",d,sigle[k],c,sigle[j],a,sigle[i],b);
            else
                printf("(%2.0f %c (%2.0f %c %2.0f)) %c %2.0f =24\n",c,sigle[j],a,sigle[i],b,sigle[k],d);
        }
        else if (k==4 || k==5)
        {
            printf("%2.0f %c ((%2.0f %c %2.0f) %c %2.0f) =24\n",d,sigle[k],a,sigle[i],b,sigle[j],c);
        }
        else
            printf("((%2.0f %c %2.0f) %c %2.0f) %c %2.0f =24\n",a,sigle[i],b,sigle[j],c,sigle[k],d);
    }
    if (type==2 || type==3)
    {
    //    if (k==4 || k==5)
    //        printf("(%2.0f %c %2.0f) %c (%2.0f %c %2.0f)=24\n",c,sigle[j],d,sigle[k],a,sigle[i],b);
    //    else
            printf("(%2.0f %c %2.0f) %c (%2.0f %c %2.0f) =24\n",a,sigle[i],b,sigle[k],c,sigle[j],d);
    }
}                    

回复列表 (共57个回复)

41 楼

先看思想,思想看懂了,看代码很容易,自己写一个也不是难事

42 楼

 

43 楼

5次可以猜中57.74%
6次可以猜中98.27%
7次可以猜中100%
第1次猜出个数:1
第2次猜出个数:4
第3次猜出个数:56
第4次猜出个数:511
第5次猜出个数:2338
第6次猜出个数:2043
第7次猜出个数:87
第8次猜出个数:0
平均步数只有约为5.3131 步


44 楼

5次可以猜中60.42%
6次可以猜中98.31%
7次可以猜中100%
第1次猜出个数:1
第2次猜出个数:3
第3次猜出个数:51
第4次猜出个数:521
第5次猜出个数:2469
第6次猜出个数:1910
第7次猜出个数:85
第8次猜出个数:0
平均步数只有约为5.2865步

45 楼

有没有对猜数字感兴趣的请跟贴,本人对猜数字的研究断断续续已有几个月了

46 楼

出来乍到,请多关照
各位用的是什么编程软件?C++么??
猜数字和24点我都用VB编过
猜数字我今天刚编完,而且如果用VB编24点的话,只需几行源代码就行了

47 楼

郁闷死 我看这么多代码头都大了555.........
  我要坚持下去...好好学........

48 楼

#define RAND random(10)
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
int a[4],b[3],*p1,*p2;


int init()

{
int i,j;
p1=a;
p2=b;
srand((unsigned)time(NULL));
a[0]=RAND;
for(i=1;i<=3;i++)
{
  tc:a[i]=RAND;
  for(j=0;j<i;j++)
  {
   if(a[i]==a[j])
   {goto tc;}
  }
}
printf("%d%d%d%d",a[0],a[1],a[2],a[3]);
return 0;
}

int input()
{
int i,j;
printf("Input the numbers(no need to input space):");
scanf("%1d%1d%1d%1d",&b[0],&b[1],&b[2],&b[3]);
for(i=0;i<=2;i++)
{
  for(j=i+1;j<=3;j++)
  {
   if(b[i]==b[j])
   {return 1;}
  }
}
return 0;
}

int compare(int* p1,int* p2)
{
int i,j,numa=0,numb=0;
for(i=0;i<=3;i++)
{
  for(j=0;j<=3;j++)
  {
   if((*(p1+i)==*(p2+j))&&(i==j))
   {numa++;}
   if((*(p1+i)==*(p2+j))&&(i!=j))
   {numb++;}
  }
}
if(numa==4)
{
  printf("Well done!!The right numbers are: %d%d%d%d\n",a[0],a[1],a[2],a[3]);
  return 0;
}
printf("%d A %d B \n",numa,numb);
return 1;
}

void main()
{
printf("*************************************************\n");
printf("***** Number Guessing Game V1.0 *****************\n");
printf("**************************** by Jerry ***********\n");
init();
do
{
  while(input()) {}
} while (compare(p1,p2));


printf("Thank you for playing!! ^_^ ^o^ :-> ;-> -_- #_#  \n");
printf("                       Jerry,who is drunk in Castlevania! \n");
};

  这是我的猜数字实现,请高手指教指教!!它只有最基本的框架,很多东西没加进去,如次数限制等等!

49 楼

完全看不懂,看来是要多学习了,各位老大帮帮忙啊~[em10]

50 楼

楼上那位朋友!
看不懂不要紧,只要有兴趣就好办了!!!
我的QQ43961207加我吧,我也是菜鸟一个,咱一起努力!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册