简单的C语言小游戏-冲冲冲,但是不要碰毒果

简介

最近在学习c语言时,看到其他文章中推箱子的小游戏。于是我突发奇想的制作出了一款纯c语言,WIndows平台下的小游戏。


 演示


 

环境及源代码

程序是在WIndows x64 系统平台上使用gcc-12.2.0版本编译器所编译的。

main.c

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>


#define ARRY_X_LENGTH 20 // 边框宽度
#define ARRY_Y_LENGTH 50 // 边框高度

// 刷新地图函数
int* loading(char (*loadingArry)[ARRY_Y_LENGTH]);
// 生成地图函数
void loadingMap(char (*loadingArry)[ARRY_Y_LENGTH]);
// 随机果实生成
void RandomFruitEvent(char (*loadingArry)[ARRY_Y_LENGTH]);
// 随机毒果实生成
void RandomPoisonousFruitEvent(char (*loadingArry)[ARRY_Y_LENGTH]);
// 移动事件
int moveEvent(char input, int *coordinate, char (*loadingArry)[ARRY_Y_LENGTH]);
// 游戏成功
void GameVictory(int fraction, int stepNumber, double duration);
// 主菜单
void menu();


int main()
{
    // 地图二维数组,游戏中所有位置数据都存放在此
    char loadingArry[ARRY_X_LENGTH][ARRY_Y_LENGTH] = {};
    
    loadingMap(loadingArry); // 加载地图
    menu(); // 主菜单

    int fraction = 0; // 游戏积分
    int stepNumber; // 步数
    char input; // 获取用户输入
    clock_t start_time = clock();
    while (input != 'q')
    {    
        int *coordinate;
        coordinate = loading(loadingArry);
        input = _getch();
        system("cls");
        // printf("(%d, %d)", coordinate[0], coordinate[1]);
        fraction += moveEvent(input, coordinate, loadingArry);

        printf("当前分数:%d\n", fraction);
        if (fraction == 100 || fraction < 0)
        {
            break;
        } else if ((fraction % 10) == 0 && fraction != 0) {
            // 生成果实
            for (int i = 0; i < 10; i++)
            {
                RandomFruitEvent(loadingArry);
            }
            // 生成一个毒果实
            RandomPoisonousFruitEvent(loadingArry);
        }
        stepNumber++;
    }
    clock_t stop_time = clock();
    system("cls");

    // 游戏积分判断输赢
    if (fraction < 0) {
        printf("Game Over!\n");
        return 0;
    } else if (fraction >= 100) {
        double duration = ((double)(stop_time-start_time))/CLK_TCK;
        GameVictory(fraction, stepNumber, duration);
    }

    return 0;
}

// 随机生成果实'o',并写入二维数组中
void RandomFruitEvent(char (*loadingArry)[ARRY_Y_LENGTH])
{
    int randomX = rand()%(ARRY_X_LENGTH - 2) + 1;
    int randomY = rand()%(ARRY_Y_LENGTH - 2) + 1;

    if (loadingArry[randomX][randomY] != '*')
    {
        loadingArry[randomX][randomY] = 'o';
    } else {
        RandomFruitEvent(loadingArry);
    }
}

// 随机生成毒果实
void RandomPoisonousFruitEvent(char (*loadingArry)[ARRY_Y_LENGTH])
{
    int randomX = rand()%(ARRY_X_LENGTH - 2) + 1;
    int randomY = rand()%(ARRY_Y_LENGTH - 2) + 1;

    if (loadingArry[randomX][randomY] != '*')
    {
        loadingArry[randomX][randomY] = '0';
    } else {
        RandomPoisonousFruitEvent(loadingArry);
    }
    
}

// 刷新界面地图
int* loading(char (*loadingArry)[ARRY_Y_LENGTH])
{
    static int coordinate[2];

    for (int i = 0; i < ARRY_X_LENGTH; i++)
    {
        for (int j = 0; j < ARRY_Y_LENGTH; j++)
        {
            char Arrychar = loadingArry[i][j];
            if (Arrychar == '*')
            {
                coordinate[0] = i;
                coordinate[1] = j;
            }
            printf("%c", Arrychar);
        }
        printf("\n");
    }

    return coordinate;
}

// 加载地图
void loadingMap(char (*loadingArry)[ARRY_Y_LENGTH])
{

    int randomX = rand()%(ARRY_X_LENGTH - 2) + 1;
    int randomY = rand()%(ARRY_Y_LENGTH - 2) + 1;

    for (int i = 0; i < ARRY_X_LENGTH; i++)
    {   
        for (int j = 0; j < ARRY_Y_LENGTH; j++)
        {
            loadingArry[0][j] = '=';
            loadingArry[ARRY_X_LENGTH-1][j] = '=';
            if (i<ARRY_X_LENGTH-1 && i>0)
            {
                if (j == ARRY_Y_LENGTH-1 || j == 0)
                {
                    loadingArry[i][j] = '|';
                }
            }
            if (i>0 && i<ARRY_X_LENGTH-1)
            {
                if (j != ARRY_Y_LENGTH-1 || j == 1)
                {
                    loadingArry[i][j] = ' ';
                }
            }
        }
    }
    loadingArry[randomX][randomY] = '*';
    // printf("* = (%d, %d)\n", randomX, randomY);

    for (int i = 0; i < 100; i++)
    {
        RandomFruitEvent(loadingArry);
    }
}

// 移动事件,其中包括:触发毒果实,普通果实
int moveEvent(char input, int *coordinate, char (*loadingArry)[ARRY_Y_LENGTH])
{
    int fraction = 0;
    switch (input) 
    {
    case 'w':
        if (loadingArry[coordinate[0]-1][coordinate[1]] != '=')
        {
            if (loadingArry[coordinate[0]-1][coordinate[1]] == 'o') 
            {
                fraction++;
            } else if (loadingArry[coordinate[0]-1][coordinate[1]] == '0') {
                fraction -= 10;
            }
            loadingArry[coordinate[0]][coordinate[1]] = ' ';
            coordinate[0]--;
        }
        
        break;
    case 's':
        if (loadingArry[coordinate[0]+1][coordinate[1]] != '=')
        {
            if (loadingArry[coordinate[0]+1][coordinate[1]] == 'o') 
            {
                fraction++;
            } else if (loadingArry[coordinate[0]+1][coordinate[1]] == '0') {
                fraction -= 10;
            }
            loadingArry[coordinate[0]][coordinate[1]] = ' ';
            coordinate[0]++;
        }
        break;
    case 'a':
        if (loadingArry[coordinate[0]][coordinate[1]-1] != '|')
        {
            if (loadingArry[coordinate[0]][coordinate[1]-1] == 'o') 
            {
                fraction++;
            } else if (loadingArry[coordinate[0]][coordinate[1]-1] == '0') {
                fraction -= 10;
            }
            loadingArry[coordinate[0]][coordinate[1]] = ' ';
            coordinate[1]--;
        }
        break;
    case 'd':
        if (loadingArry[coordinate[0]][coordinate[1]+1] != '|')
        {
            if (loadingArry[coordinate[0]][coordinate[1]+1] == 'o') 
            {
                fraction++;
            } else if (loadingArry[coordinate[0]-1][coordinate[1]+1] == '0') {
                fraction -= 10;
            }
            loadingArry[coordinate[0]][coordinate[1]] = ' ';
            coordinate[1]++;
        }
        break;
    }
    loadingArry[coordinate[0]][coordinate[1]] = '*';

    return fraction;
}

void GameVictory(int fraction, int stepNumber, double duration)
{
    printf("Congratulations! Game Victory! | ");
    printf("恭喜你!游戏胜利!\n");
    printf("分数:%d\n", fraction);
    printf("总步数:%d\n", stepNumber);
    printf("挑战时长:%lf\n", duration);
}

void menu()
{
    printf("启动游戏中...\n提示:按 q 键可以直接退出游戏。\n\n");
    printf("操作:上(w) 下(s) 左(a) 右(d)\n");
    printf("o:果子                 0:毒果子\n");
    printf("吃到毒果子会扣其积分:10\n");
    printf("=================================\n");
}

这就是全部内容了,有问题可以来我的群找我:706128290

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pymili

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值