C中的MasterMind游戏

时间:2012-02-08 22:11:22

标签: c

我把这作为我的作业。编码时有点麻烦。我使用C作为语言。

问题:

  

Mastermind是两个玩家的游戏。在开始时,第一个玩家决定一个秘密密钥,它是一个序列(s1,s2,... sk),其中0< si< = n,然后第二个玩家进行轮次猜测,其中每个猜测的形式为(g1,g2,... gk),并且在每次猜测之后,第一个玩家计算猜测的分数。猜测的分数等于我们有gi = si的i的数量。

     

例如,如果密钥是(4,2,5,3,1)并且猜测是(1,2,3,7,1),那么得分是2,因为g2 = s2和g5 = S5。

     

给定一系列猜测和每个猜测的分数,您的程序必须确定是否存在至少一个生成这些精确分数的密钥。

输入:

  

第一行输入包含单个整数C(1 <= C <= 100)。 C测试案例如下。每个测试用例的第一行包含三个整数n,k和q。 (1&lt; = n,k <= 11,1 <= q <= 8)。接下来的q行包含猜测。

     

每个猜测由k个整数gi,1,gi,2,...... gi,k由单个空格分隔,然后是猜测bi的得分(1 <= gi,j <= n对于所有1&lt; = i&lt; = q,1&lt; = j&lt; = k;并且0&lt; = bi&lt; = k)

输出:

  

对于每个测试用例,如果至少存在生成那些精确分数的密钥,则输出“是”(不带引号),否则输出“否”。

我写的代码是:

#include <stdio.h>
#include <string.h>
#include <stdarg.h>  
#include <stdlib.h>
#include <stdbool.h>

typedef struct set_t{    
    int count;     
    void **values; 
} *SetRef;

SetRef set_create(void *values, ...); 
int  set_count(SetRef this);
bool set_contains(SetRef this, void *value);  
int rscore(SetRef set1, void *value, int score);


int main(int argc,char **argv )
{
    int t = 0, n = 0 ,k = 0,q = 0, score = 0;
    char ch;
    int arr1[n];
    int arr2[n];
    printf("Please enter the number of test cases(between 1 to 100):");
    scanf("%d",&t);
    printf("\n");
    for ( int i = 1; i<=t;i++)
    {
        printf("Please enter values of n,k, q:");
        scanf("%i %i %i",&n, &k, &q);

        printf("\n");
        printf("Enter the values of secret key");
        score = 0;
        for ( int c = 0 ; c < n ; c++ )
        {
            scanf("%d",&arr1[c]);
         }
        printf("\n");
        printf("Enter the values of guess");
            for ( int c = 0 ; c < n ; c++ )
            {
                scanf("%d",&arr2[c]);
             }

        }
       SetRef set1 = set_create(&arr1); 
       SetRef set2 = set_create(&arr2); 
       for ( int i = 0; i < set2->count; i++){
            void *val = set2->values[i]; 
            score = rscore(set1, val,score);
        }        
        if ( score == set1->count)
            printf("Yes");
        else
            printf("No");
        printf("\n");
    }
}

SetRef set_create(void *values, ...) 
{   
    SetRef set = calloc(1, sizeof(struct set_t));    
    if (values)   
    {        
        int count = 1;     
         va_list args;       
         va_start(args, values);       
        while (va_arg(args, void *)) 
        {             
            count++;    
        }          
        va_end(args);       
        set->count = count;      
        set->values = calloc(count, sizeof(void *));      
        set->values[0] = values;    
        va_start(args, values);       
        int i = 1;         
        void *val;       
        while ((val = va_arg(args, void *)))
        {            
            set->values[i++] = val;      
        }       
        va_end(args);    
    }      
    return set; 
}  
int set_count(SetRef this) 
{    
    return this->count; 
} 
bool set_contains(SetRef this, void *value) 
{    
    for (int i = 0; i < this->count; i++)
    {      
        if (value == this->values[i])   
            return true;   
    }    
    return false;
}  

int rscore(SetRef set1, void *value, int score){
    void *val = value;
    if (set_contains(set1, val))
        score ++;
    return score;
}  

我有这些错误:

  

solution.cc:60:1:错误:'}'令牌之前的预期声明

除此之外,我的逻辑是否正确?我犯过任何重大错误吗?

不确定如何解决这个问题。需要一些指导。

3 个答案:

答案 0 :(得分:4)

您正在将C源代码编译为C ++。 C和C ++是不同的语言。

将您的文件重命名为solution.c而不是solution.cc,并确保使用C编译器进行编译(例如,gcc而不是g++

编辑:实际上,源代码看起来既不是C也不是C ++。选择一个并坚持下去。它几乎是C,您需要将#include <cstdarg>更改为#include <stdarg.h>,然后您需要为#include <stdbool.h>类型添加bool。您还需要将YESNO更改为truefalse

如果使用Microsoft的MSC编译器,bool类型可能不可用,该编译器使用过时的C版本。

答案 1 :(得分:2)

在C ++中this是一个关键字,用作指向类成员函数内当前对象的指针。

您必须使用该语言未保留的其他名称。

或者,如果这实际上是C代码,则不包括<cstdarg>等C ++标头,并将文件从.cc重命名为.c

选择您的语言!

答案 2 :(得分:1)

您不能在C ++中将this用作变量名。这是一个语言关键字。如果要编译C程序,请不要使用C ++编译器。