在C语言中拼图游戏

问题描述 投票:0回答:2

我一直试图像在报纸上那样迷惑单词,如下所示:

15 rows 12 colums
X T Z M Q Y K C E C F H -->12 chars 
S H O U T E X O E A P I
X G T L Q B E L T N F K
'
'
'

如您在第二行中看到的,是单词SHOUT。现在设计了拼图游戏,以便用户可以逐行输入他们想要的任何类型的字符集。

我想做的是当搜索一个单词(如SHOUT)时,我将返回其起始索引。我想象的索引将从0开始到180结束,因为12 * 15 = 180像这样很清楚:

X T Z M Q Y K C E C F H
0 1 2 3 4 5 6 7 8 9 10 11
S H O U T E X O E A P I
12 13 14 15 16 17 18 19 20 21 22 23
'
'
'
'''''''''''''''''''179

没有图片很难解释,希望您能理解。

现在,棘手的是单词可以在各个方向(从上到下,从下到上,从左到右,从右到左)。我已经编写了大部分代码,但始终会出错,并且只能检查该单词是否从左到右存在。我尝试实现单词长度以使其更容易

#include <stdio.h>
#define COLUNM 12
#define ROW 15

void printPuzzle(char matrix[][COLUNM]){

   int i,j;
   printf("PUZZLE");
   for (i=0;i<ROW;i++)
   {
       for(j=0;j<COLUNM;j++)
       {
           printf("%3c",matrix[i][j]);
       }
       printf("\n");
   }

}

int computeLength(char str[50]){
    int i;
    for(i=0; str[i]!='\0'; ++i){}

    return i;
}

int findString(char matrix[ROW][COLUNM],char string[15],int computeLength(string[15])){
    int i,j,k,count=0;
    for (i=0;i<180;i++){
        for(j=0;j<ROW;j++){
            for(k=0;k<COLUNM;k++){
                if(string[i]==matrix[j][k]){
                    count++;
                }
            }
        }
    }

    if(count==computeLength(string[15])){
        return i;
    }
} 

int main (){
    int i,j=0;
    char matrix[ROW][COLUNM];
    char string[50];
    int b=1;

    for(i = 0 ; i < ROW ; i++)
    {
        printf("Enter line %d of the puzzle :\n",i+1);       
       scanf("%s",&matrix[j][i]);

       j++;    
    }

    while(b>0){
        printf("Enter the string to be searched in the puzzle:\n");

        scanf("%s",&string[50]);
        if((string[0]!='q')||(string[0]!='Q')){
            b=0;
        }

    }

    printPuzzle(matrix);
    printf("%d",computeLength("küfür"));
    return 0;
}

并且我现在收到此错误

c:29:76: error: expected declaration specifiers or ‘...’ before ‘*’ token
29 |  int findString(char matrix[ROW][COLUNM],char string[15],int computeLength(*string[15])){

我不认为使用python很难实现,但是我对C并不熟悉,以至于我不肯收到错误和警告。

仅需要工作的部分是第三功能。不要打扰输入,因为我会自己进行测试。

您能帮忙吗?

c arrays matrix search puzzle
2个回答
0
投票
您不能像以前那样声明函数。现在稍作进一步建议...

已经有一个C函数可以计算C字符串长度:

#include <string.h> 
...
const char* string = "hello";

int length = strlen(string);
...

0
投票

int findString(char matrix[ROW][COLUNM],char string[15],int computeLength(string[15])){

作者

int findString(char matrix[ROW][COLUNM], char string[15])
注意大小15也没用,您可以将

char string []或

char * string用作参数

string

第39行无效,替换if(count==computeLength(string[15])){

作者

if(count==computeLength(string)){
现在您可以编译程序,但这还不够。

main中的一些问题。


您交换了该行中的索引

scanf("%s",&matrix[j][i]);

可以替换为

scanf("%s",&matrix[i][0]);
(我使用0而不是

j,因为它更清楚,它不要求我们检查

j值0)] >>

但是这还不够,如果输入无效,scanf

可以读取多个COLUNM个字符,甚至您输入的12个字符也可以忘记

scanf也会写入空字符完成字符串,因此它写入13个字符。一种方法是读入比[[COLUMN

多2的string”,并检查输入字符串的长度。因此,您的for可以替换为:

for(i = 0 ; i < ROW ; i++) { printf("Enter line %d of the puzzle :\n",i+1); if ((scanf("%49s", string) != 1) || (strlen(string) != COLUMN)) { puts("invalid line"); return -1; } memcpy(&matrix[i][0], string, COLUMN); i++; }

也请注意在末尾i
而不是j

while

循环中scanf("%s",&string[50]);

是无效的,因为它将结果放在string

之后,索引必须为0,实际上您可以只给出
string。
和以前一样,如果输入的字符数超过49个,[[scanf将从

string中写出,所以]]scanf("%49s", string); 如果要允许搜索50个字符的字符串而不计算最终的空字符,则必须将其大小设置为51,并将49替换为50。

退出打印并读取while

循环没有任何作用,很可能您想在其中调用findString并写入返回的值,直到第一个读取字符为q或Q。实例:
 for (;;) {
   puts("Enter the string to be searched in the puzzle:");
   if ((scanf("%49s", string) != 1) || (string[0] =='q') || (string[0] == 'Q'))
     break;
   printf("position in the puzzle: %d\n", findString(matrix, string));
 }

main

的结尾,该行的含义不明确:
printf("%d",computeLength("küfür"));

printPuzzle

中,您在打印
PUZZLE
后遗漏了换行符,您可以将
printf
替换为
puts。请注意,当您知道没有[%]时,要求

printf搜索%等是没有用的。findString

第一个问题是,仅当count == computeLength(string)为true时才返回值,您需要始终返回一个值。通常,如果字符串不在拼图中,则可以返回-1,因此
return (count==computeLength(string)) ? i : -1;

但是这也是错误的,有两个原因:

到达测试i时始终为180,而不是字符串所在的位置

这不是因为

count == computeLength(string)

是真的,因为您习惯了增加[[count并增加下一个错误:
    您未正确搜索难题中的字符串,因为在
  • i
  • 上的第一个循环通过了字符串(string [i]
),最糟糕的情况是当其长度为时将访问其中的180个字符仅49(不带最后一个空字符)。即使找到了字符串,您也不会停止搜索。在您的算法中,您忘记了字符串的字符必须连续放置在矩阵中,每当您(错误地)在矩阵中的任何位置发现字符串的字符时,您递增
  • count。仅考虑您从左到右水平搜索字符串:

    string

    上的循环必须是嵌入度更高的循环,以检查其字符在矩阵中是否连续。

    您在行上有一个循环,在列上有一个循环,这是无用的,只会使工作变得一无所有。因为

      matrix是一个数组,所以
    • matrix [r] [COLUMN]
    • 处的字符是

      matrix [r + 1] [0]

    处的字符,这意味着您可以遍历matrix 就像是一个
  • ROW * COLUMN个字符的字符串。

    我让您重写findString

    ,它类似于strstr
  • ,除了您返回索引或-1而不是子字符串的地址或NULL
    © www.soinside.com 2019 - 2024. All rights reserved.