C 语言实现单词搜索游戏:从项目需求到代码落地

在 C 语言编程学习过程中,通过实际项目来巩固和提升技能是非常有效的方式。今天我们就来深入探讨如何用 C 语言开发一个单词搜索游戏,这个游戏不仅能锻炼编程能力,还充满趣味性。

一、项目需求剖析

单词搜索游戏是一种常见的文字游戏,玩家需要在一个字母网格中找出隐藏的单词,这些单词可以水平、垂直或对角排列。具体功能如下:

  1. 单词搜索谜题生成:存储特定主题(如动物、颜色、行星等,这里我们以动物、水果、体育活动为例)的单词列表;生成一个20x20 大小的二维字母网格,且网格中包含 7 个所选类别的单词;单词在网格中随机放置,水平放置概率为 40%,垂直放置概率为 40%,对角放置概率为 20%(对角单词可升序或降序);保证单词之间不会相互覆盖。
  2. 单词搜索游戏:程序启动时欢迎玩家并获取玩家姓名;展示可供选择的单词类别;玩家输入在网格中看到的单词,猜对的单词在网格中被移除;设置 2 分钟的时间限制,时间结束或玩家找出所有单词时给出相应提示。

二、代码实现详解

(一)准备工作

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <curses.h>

char **create2DArray(void); 
char** createMaskArray(void);
void printArray(char** array); 
void insertHorizontally(char* word, char** array, char** maskArray);
void insertVertically(char* word, char** array, char** maskArray);
void insertDiagonally(char* word, char** array, char** maskArray);

#define WIDTH 20
#define HEIGHT 20
char** myArray; 
char** maskArray;
int Row, Col, Sequence;
clock_t start, end1;
double duration1;

在这段代码中,我们包含了多个头文件,这些头文件提供了程序所需的各种函数和定义。create2DArraycreateMaskArray等函数用于创建二维数组和掩码数组;printArray用于打印二维数组;insertHorizontallyinsertVerticallyinsertDiagonally分别用于在二维数组中水平、垂直和对角插入单词。通过#define定义了二维数组的宽度和高度,还声明了一些全局变量,用于记录数组、插入位置和游戏时间等信息。

(二)主函数逻辑

int main(void) {
    int i;
    printf("\n\n---------------------------------\n");
    printf("|                               |\n");
    printf("|  Welcome to Word Search 3000  |\n");
    printf("|                               |\n");
    printf("-------------------------------\n\n");
    printf("What is your name? ");
    char name[10];
    scanf("%s", name);
    printf("\nHi %s! What category would you like?", name);
    printf("\n\n-----------------");
    printf("\n1. Animals\n2. Fruit\n3. Physical_activity\n");
    printf("-------------------\n\n");
    srand((unsigned)time(NULL));
    myArray = create2DArray();
    maskArray = createMaskArray();
    char *animals[] = {"LION", "FISH", "RABBIT", "CAT", "ANT", "SNAKE", "KANGAROO"};
    char *fruit[] = {"", "APPLE", "GRAPE", "ORANGE", "BANANA", "WATERMELON", "MANGO", "PEAR"};
    char *physical_activity[] = {"", "FOOTBALL", "SWIM", "RUN", "SHOOT", "VOLLEYBALL", "BICYCLE", "BADMINTON"};
    printf("Category: ");
    char category[20];
    scanf("%s", category);
    printf("\nOK %s - There are 7 %s hidden in this grid.\n", name, category);
    printf("Can you find them all?\n");
    printf("You have 2 minutes!\n");
    int flag = 0;
    int row[10];
    int col[10];
    int seq[10];
    int Flag[10];
    if (strcmp(category, "Animals") == 0) {
        flag = 1;
        for (i = 0; i < 7; i++) {
            int way = rand() % 5;
            if (way == 0 || way == 1) {
                Flag[i] = 1;
                insertHorizontally(animals[i], myArray, maskArray);
                row[i] = Row;
                col[i] = Col;
            }
            if (way == 2 || way == 3) {
                Flag[i] = 2;
                insertVertically(animals[i], myArray, maskArray);
                row[i] = Row;
                col[i] = Col;
            }
            if (way == 4) {
                Flag[i] = 3;
                insertDiagonally(animals[i], myArray, maskArray);
                row[i] = Row;
                col[i] = Col;
                seq[i] = Sequence;
            }
        }
    } else if (strcmp(category, "Fruit") == 0) {
        flag = 2;
        for (i = 1; i < 8; i++) {
            int way = rand() % 5;
            if (way == 0 || way == 1) {
                Flag[i] = 1;
                insertHorizontally(fruit[i], myArray, maskArray);
                row[i] = Row;
                col[i] = Col;
            }
            if (way == 2 || way == 3) {
                Flag[i] = 2;
                insertVertically(fruit[i], myArray, maskArray);
                row[i] = Row;
                col[i] = Col;
            }
            if (way == 4) {
                Flag[i] = 3;
                insertDiagonally(fruit[i], myArray, maskArray);
                row[i] = Row;
                col[i] = Col;
                seq[i] = Sequence;
            }
        }
    } else if (strcmp(category, "Physical_activity") == 0) {
        flag = 3;
        for (i = 1; i < 8; i++) {
            int way = rand() % 5;
            if (way == 0 || way == 1) {
                Flag[i] = 1;
                insertHorizontally(physical_activity[i], myArray, maskArray);
                row[i] = Row;
                col[i] = Col;
            }
            if (way == 2 || way == 3) {
                Flag[i] = 2;
                insertVertically(physical_activity[i], myArray, maskArray);
                row[i] = Row;
                col[i] = Col;
            }
            if (way == 4) {
                Flag[i] = 3;
                insertDiagonally(physical_activity[i], myArray, maskArray);
                row[i] = Row;
                col[i] = Col;
                seq[i] = Sequence;
            }
        }
    }
    int number = 7;
    int result;
    start = time(NULL);
    int minute = 1;
    while (1) {
        int ROW, COL;
        printArray(myArray);
        end1 = time(NULL);
        duration1 = (double)difftime(end1, start);
        printf("\n%d Words left\n", number);
        if (60 < duration1 && duration1 < 119) {
            minute = 0;
            printf("You have %d:%.0f seconds\n", minute, (60 + 59 - duration1));
        } else {
            printf("You have %d:%.0f seconds\n", minute, 59 - duration1);
        }
        if (duration1 >= 119) {
            printf("You have 0:0 seconds\n");
        }
        printf("Word : ");
        char word[10];
        scanf("%s", word);
        if (duration1 >= 119) {
            result = 0;
            break;
        }
        if (flag == 1) {
            for (i = 0; i < 7; i++) {
                int j, k;
                if (strcmp(word, animals[i]) == 0 && Flag[i] == 1) {
                    j = i;
                    ROW = row[j];
                    COL = col[j];
                    for (k = 0; k < strlen(word); k++) {
                        myArray[ROW][COL + k] = ' ';
                    }
                    number = number - 1;
                    break;
                }
                if (strcmp(word, animals[i]) == 0 && Flag[i] == 2) {
                    j = i;
                    ROW = row[j];
                    COL = col[j];
                    for (k = 0; k < strlen(word); k++) {
                        myArray[ROW + k][COL] = ' ';
                    }
                    number = number - 1;
                    break;
                }
                if (strcmp(word, animals[i]) == 0 && Flag[i] == 3 && seq[i] == 1) {
                    j = i;
                    ROW = row[j];
                    COL = col[j];
                    for (k = 0; k < strlen(word); k++) {
                        myArray[ROW - k][COL + k] = ' ';
                    }
                    number = number - 1;
                    break;
                }
                if (strcmp(word, animals[i]) == 0 && Flag[i] == 3 && seq[i] == 0) {
                    j = i;
                    ROW = row[j];
                    COL = col[j];
                    for (k = 0; k < strlen(word); k++) {
                        myArray[ROW + k][COL + k] = ' ';
                    }
                    number = number - 1;
                    break;
                }
            }
        } else if (flag == 2) {
            for (i = 1; i < 8; i++) {
                int j, k;
                if (strcmp(word, fruit[i]) == 0 && Flag[i] == 1) {
                    j = i;
                    ROW = row[i];
                    COL = col[j];
                    for (k = 0; k < strlen(word); k++) {
                        myArray[ROW][COL + k] = ' ';
                    }
                    number = number - 1;
                    break;
                }
                if (strcmp(word, fruit[i]) == 0 && Flag[i] == 2) {
                    j = i;
                    ROW = row[i];
                    COL = col[j];
                    for (k = 0; k < strlen(word); k++) {
                        myArray[ROW + k][COL] = ' ';
                    }
                    number = number - 1;
                    break;
                }
                if (strcmp(word, fruit[i]) == 0 && Flag[i] == 3 && seq[i] == 1) {
                    j = i;
                    ROW = row[i];
                    COL = col[j];
                    for (k = 0; k < strlen(word); k++) {
                        myArray[ROW - k][COL + k] = ' ';
                    }
                    number = number - 1;
                    break;
                }
                if (strcmp(word, fruit[i]) == 0 && Flag[i] == 3 && seq[i] == 0) {
                    j = i;
                    ROW = row[i];
                    COL = col[j];
                    for (k = 0; k < strlen(word); k++) {
                        myArray[ROW + k][COL + k] = ' ';
                    }
                    number = number - 1;
                    break;
                }
            }
        } else if (flag == 3) {
            for (i = 1; i < 8; i++) {
                int j, k;
                if (strcmp(word, physical_activity[i]) == 0 && Flag[i] == 1) {
                    j = i;
                    ROW = row[j];
                    COL = col[j];
                    for (k = 0; k < strlen(word); k++) {
                        myArray[ROW][COL + k] = ' ';
                    }
                    number = number - 1;
                    break;
                }
                if (strcmp(word, physical_activity[i]) == 0 && Flag[i] == 2) {
                    j = i;
                    ROW = row[j];
                    COL = col[j];
                    for (k = 0; k < strlen(word); k++) {
                        myArray[ROW + k][COL] = ' ';
                    }
                    number = number - 1;
                    break;
                }
                if (strcmp(word, physical_activity[i]) == 0 && Flag[i] == 3 && seq[i] == 1) {
                    j = i;
                    ROW = row[j];
                    COL = col[j];
                    for (k = 0; k < strlen(word); k++) {
                        myArray[ROW - k][COL + k] = ' ';
                    }
                    number = number - 1;
                    break;
                }
                if (strcmp(word, physical_activity[i]) == 0 && Flag[i] == 3 && seq[i] == 0) {
                    j = i;
                    ROW = row[j];
                    COL = col[j];
                    for (k = 0; k < strlen(word); k++) {
                        myArray[ROW + k][COL + k] = ' ';
                    }
                    number = number - 1;
                    break;
                }
            }
        }
        if (number == 0) {
            result = 1;
            break;
        }
        system("clear");
    }
    if (result == 1) {
        printf("\n\nCongratulations %s! You found all the words in %.0f seconds!!", name, duration1);
        printf("\n\n******** PARTY TIME **************.\n");
    } else {
        printf("\n\nUnfortunately, time has run out and you haven't finished the game.\n");
    }
    free(myArray);
    free(maskArray);
    myArray = NULL;
    maskArray = NULL;
    return 0;
}

主函数首先欢迎玩家并获取玩家姓名,展示单词类别让玩家选择。根据玩家选择的类别,从相应的单词数组中随机选取单词,并以指定概率水平、垂直或对角插入到二维数组中。游戏过程中,记录开始时间,在循环中不断打印网格、提示剩余时间和待查找单词数量,接收玩家输入的单词。判断玩家输入的单词是否正确,如果正确则从网格中移除该单词,并更新剩余单词数量。当时间用完或玩家找出所有单词时,结束游戏并给出相应提示。最后释放动态分配的内存,避免内存泄漏。

(三)核心功能函数

  1. 创建二维数组
    char** create2DArray(void) {
        int i, j;
        char **array = (char **)malloc(sizeof(char *) * WIDTH);
        for (i = 0; i < WIDTH; i++) {
            array[i] = (char *)malloc(sizeof(char) * HEIGHT);
        }
        srand((unsigned)time(NULL));
        for (i = 0; i < WIDTH; i++) {
            for (j = 0; j < HEIGHT; j++) {
                array[i][j] = 65 + rand() % 25;
            }
        }
        return array;
    }

    这个函数使用malloc动态分配内存创建一个WIDTH * HEIGHT大小的二维字符数组,并使用随机数生成 A - Z 之间的字母填充数组。

  2. 创建掩码数组
    char** createMaskArray(void) {
        int i, j;
        char **maskarray = (char **)malloc(sizeof(char *) * WIDTH);
        for (i = 0; i < WIDTH; i++) {
            maskarray[i] = (char *)malloc(sizeof(char) * HEIGHT);
        }
        srand((unsigned)time(NULL));
        for (i = 0; i < WIDTH; i++) {
            for (j = 0; j < HEIGHT; j++) {
                maskarray[i][j] = '.';
            }
        }
        return maskarray;
    }

    掩码数组用于记录单词在二维数组中的位置,避免单词重叠。函数创建一个与二维数组大小相同的掩码数组,初始值为.,表示该位置未被单词占用。

  3. 打印二维数组
    void printArray(char** array) {
        int i, j;
        for (i = 0; i < WIDTH; i++) {
            for (j = 0; j < HEIGHT; j++) {
                printf("%c ", array[i][j]);
            }
            printf("\n");
        }
    }


    三、结果展示



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值