控制台推箱子小游戏C语言

自己开发的C语言控制台推箱子小游戏,基于二维数组实现,功能不多但是游戏整体较为完整,因为技术有限,所以代码暂未优化且整体显得较为臃肿,整体架构简单,代码全自主设计编写,仅作交流学习,还望大佬多多指点。

源代码和exe程序下载链接:https://download.csdn.net/download/weixin_46355280/87385765?spm=1001.2014.3001.5503

#include <stdio.h>
#include<Stdlib.h>
#include<Conio.h>
//全局二维数组
char map[13][10] = {
    {'*','*','*','*','*','*','*','*','*','*'},
    {'*',' ',' ',' ',' ',' ',' ',' ',' ','*'},
    {'*',' ',' ',' ',' ',' ',' ',' ',' ','*'},
    {'*',' ',' ',' ',' ',' ','o',' ',' ','*'},
    {'*','*','*','*','*',' ',' ',' ',' ','*'},
    {'*',' ',' ',' ','*',' ',' ','@',' ','*'},
    {'*',' ',' ',' ','*',' ',' ',' ',' ','*'},
    {'*',' ',' ',' ','*',' ',' ','i',' ','*'},
    {'*',' ',' ',' ',' ',' ',' ',' ',' ','*'},
    {'*',' ',' ',' ',' ',' ',' ',' ',' ','*'},
    {'*',' ',' ',' ',' ',' ',' ',' ',' ','*'},
    {'*',' ',' ',' ',' ',' ',' ',' ',' ','*'},
    {'*','*','*','*','*','*','*','*','*','*'},
};

//全局控制变量
int player_x = 7;//玩家X轴位置
int player_y = 7;//玩家Y轴位置
int box_x = 5;//箱子X轴位置
int box_y = 7;//箱子Y轴位置
int target_x = 3;//目标X轴位置
int target_y = 6;//目标Y轴位置
char input;//当前键盘输入的指令
int foot_num = 0;//玩家移动的步数
char initial_map[13][10];
//保存上一步的数据,方便回撤数据
char map_back[13][10];//上一步地图信息
int re_player_x = player_x;//上一步玩家X轴位置
int re_player_y = player_y;//上一步玩家Y轴位置
int re_box_x = box_x;//上一步箱子X轴位置
int re_box_y = box_y;//上一步箱子Y轴位置
int re_foot_num = foot_num;//上一步累计的步数
int win = 0;//赢的次数
int lose = 0;//输的次数

//功能函数
void menu();//游戏开始菜单
void return_menu();//暂停游戏返回开始菜单
void initial_data();//保存初始地图数据
void keys_input();//读取键盘输入函数
void player_move();//玩家移动函数
void print_map();//打印地图函数
void box_move();//箱子移动函数
void time_out();//游戏暂停函数
void game_over();//游戏结束函数
void restart();//重新开始游戏
void exit_game();//退出游戏
void go_back();//返回上一步
void save_pre_data();//保存上一步的数据
void game_description();//打开游戏说明
void win_or_lose();//查看输赢次数

//主函数
int main()
{
    while (1)
    {
        for (int x = 0; x < 13; x++)//初始化返回地图变量
        {
            for (int y = 0; y < 10; y++)
            {
                map_back[x][y] = map[x][y];
            }
        }

        menu();
        initial_data();//保存游戏地图初始数据,以便重启游戏

        while (1)//死循环控制游戏运行
        {
            print_map();
            game_over();
            keys_input();
            return_menu();
            game_description();
            exit_game();
            restart();
            go_back();
            time_out();
            player_move();
            box_move();
            system("cls");
        }
    }
}

void menu()
{
    printf("\tgame begin menu\n\n");
    printf("\t1.进入游戏\n");
    printf("\t2.退出游戏\n");
    printf("\t3.查看输赢次数\n");
    while (1)
    {
        char input = _getch();
        if (input == '1')
        {
            system("cls");
            break;
        }
        if (input == '2')
        {
            exit(0);
        }
        if (input == '3')
        {
            win_or_lose();
            break;
        }
    }
}

void initial_data()
{
    for (int x = 0; x < 13; x++)
    {
        for (int y = 0; y < 10; y++)
        {
            initial_map[x][y] = map[x][y];
        }
    }
    input = NULL;
}

void print_map()//刷新并打印地图
{
    printf("按 I 键打开游戏指南...\n");
    for (int x = 0; x < 13; x++)
    {
        for (int y = 0; y < 10; y++)
        {
            printf("%c", map[x][y]);
        }
        printf("\n");
    }
    printf("player:%d %d,box:%d %d target:%d %d input:%c foot_num:%d\n", player_x, player_y, box_x, box_y, target_x, target_y, input, foot_num);
}

void keys_input()//键盘输入
{
    while (1)
    {
        input = _getch();
        if (input == 87 || input == 65 || input == 83 || input == 68 || input == 13 || input == 71 || input == 80 || input == 82 || input == 73 || input == 89)
        {
            break;
        }
    }
}

void player_move() //玩家移动
{
    if (player_x == target_x && player_y == target_y)
    {
        map[player_x][player_y] = 'o';
    }
    else
    {
        map[player_x][player_y] = ' ';
    }
    switch (input)
    {
    case 'W':
        if (map[player_x - 1][player_y] != '*' && map[box_x - 1][box_y] != '*')//如果玩家移动以后的位置不是墙并且箱子被玩家移动后也不是墙
        {
            save_pre_data();//执行玩家移动前,保存当前游戏数据到保存上一步的函数里
            player_x -= 1;
            foot_num++;
            break;
        }
        if (map[player_x - 1][player_y] != map[box_x][box_y] && map[player_x - 1][player_y] != '*')//玩家移动以后的位置不是箱子当前的位置也不是墙
        {
            save_pre_data();
            player_x -= 1;
            foot_num++;
            break;
        }
        break;
    case 'A':
        if (map[player_x][player_y - 1] != map[box_x][box_y] && map[player_x][player_y - 1] != '*')
        {
            save_pre_data();
            player_y -= 1;
            foot_num++;
            break;
        }
        if (map[player_x][player_y - 1] != '*' && map[box_x][box_y - 1] != '*')
        {
            save_pre_data();
            player_y -= 1;
            foot_num++;
            break;
        }
        break;
    case 'S':
        if (map[player_x + 1][player_y] != map[box_x][box_y] && map[player_x + 1][player_y] != '*')
        {
            save_pre_data();
            player_x += 1;
            foot_num++;
            break;
        }
        if (map[player_x + 1][player_y] != '*' && map[box_x + 1][box_y] != '*')
        {
            save_pre_data();
            player_x += 1;
            foot_num++;
            break;
        }
        break;
    case 'D':
        if (map[player_x][player_y + 1] != map[box_x][box_y] && map[player_x][player_y + 1] != '*')
        {
            save_pre_data();
            player_y += 1;
            foot_num++;
            break;
        }
        if (map[player_x][player_y + 1] != '*' && map[box_x][box_y + 1] != '*')
        {
            save_pre_data();
            player_y += 1;
            foot_num++;
            break;
        }
        break;
    default:
        break;
    }
    map[player_x][player_y] = 'i';
}

void box_move()//箱子移动
{
    if (player_x == box_x && player_y == box_y)
    {
        switch (input)
        {
        case 'W':
            if (map[box_x - 1][box_y] != '*')
            {
                box_x -= 1;
            }
            break;
        case 'A':
            if (map[box_x][box_y - 1] != '*')
            {
                box_y -= 1;
            }
            break;
        case 'S':
            if (map[box_x + 1][box_y] != '*')
            {
                box_x += 1;
            }
            break;
        case 'D':
            if (map[box_x][box_y + 1] != '*')
            {
                box_y += 1;
            }
            break;
        default:
            break;
        }
        map[box_x][box_y] = '@';
    }
}

void time_out()//游戏暂停
{
    if (input == 13)
    {
        printf("The game has been paused,press enter again to continue the game!\n");
        while (1)
        {
            char input_s = _getch();
            if (input_s == 13)
            {
                input = NULL;
                break;
            }
        }
    }
}

void game_over()//游戏结束
{
    if (box_x == target_x && box_y == target_y)
    {
        system("cls");
        printf("game over!you win!is restart?(yes is 1,no is 2)\n");
        win++;
        while (1)
        {
            char input_s = _getch();
            if (input_s == '1')
            {
                input = 71;
                restart();
                system("cls");
                print_map();
                break;
            }
            if (input_s == '2')
            {
                system("cls");
                input = 71;
                restart();
                menu();
                print_map();
                break;
            }
        }
    }
    if (map[box_x - 1][box_y] == '*' && map[box_x][box_y - 1] == '*' || map[box_x + 1][box_y] == '*' && map[box_x][box_y + 1] == '*' || map[box_x - 1][box_y] == '*' && map[box_x][box_y + 1] == '*' || map[box_x][box_y - 1] == '*' && map[box_x + 1][box_y] == '*')
    {
        system("cls");
        printf("game over!you lose!is restart?(yes is 1,no is 2)\n");
        lose++;
        while (1)
        {
            char input_s = _getch();
            if (input_s == '1')
            {
                input = 71;
                restart();
                system("cls");
                print_map();
                break;
            }
            if (input_s == '2')
            {
                system("cls");
                input = 71;
                restart();
                menu();
                print_map();
                break;
            }
        }
    }
}

void restart()//重启游戏,初始化所有游戏数据
{
    if (input == 71)//检查游戏数据,避免不必要的游戏重启,这一步可有可无,意义不大
    {
        if (foot_num > 0)
        {
            for (int x = 0; x < 13; x++)
            {
                for (int y = 0; y < 10; y++)
                {
                    map[x][y] = initial_map[x][y];
                }
            }
            player_x = 7;//玩家初始X轴位置
            player_y = 7;//玩家初始Y轴位置
            box_x = 5;//箱子初始X轴位置
            box_y = 7;//箱子初始Y轴位置
            target_x = 3;//目标初始X轴位置
            target_y = 6;//目标初始Y轴位置
            input = NULL;//初始化键盘当前的指令
            foot_num = 0;//初始化玩家移动的步数
        }
        //重置游戏后,将上一步的数据保存为游戏初始数据,避免返回重启前的位置
        for (int x = 0; x < 13; x++)
        {
            for (int y = 0; y < 10; y++)
            {
                map_back[x][y] = map[x][y];
            }
        }
        re_player_x = player_x;
        re_player_y = player_y;
        re_box_x = box_x;
        re_box_x = box_x;
        input = NULL;
    }
}

void exit_game()//退出游戏返回菜单
{
    if (input == 80)
    {
        printf("is exit game?(yes=enter,no=delete)\n");
        while (1)
        {
            char input_s = _getch();
            if (input_s == 13)
            {
                printf("The game has exited!\n");
                input = 71;
                restart();
                system("cls");
                menu();
                input = NULL;
                break;
            }
            else if (input_s == 8)
            {
                input = NULL;
                break;
            }
        }
    }
}

void go_back()//返回上一步移动
{
    if (input != NULL)
    {
        if (input == 82)
        {
            for (int x = 0; x < 13; x++)
            {
                for (int y = 0; y < 10; y++)
                {
                    map[x][y] = map_back[x][y];
                }
            }
            player_x = re_player_x;
            player_y = re_player_y;
            box_x = re_box_x;
            box_y = re_box_y;
            foot_num = re_foot_num;
            input = NULL;
        }
    }
}

void save_pre_data()//保存上一步数据
{
    for (int x = 0; x < 13; x++)
    {
        for (int y = 0; y < 10; y++)
        {
            map_back[x][y] = map[x][y];
        }
    }
    re_player_x = player_x;
    re_player_y = player_y;
    re_box_x = box_x;
    re_box_y = box_y;
    re_foot_num = foot_num;

}

void game_description()//打开游戏指南
{
    if (input == 73)
    {
        printf("游戏指南:\n");
        printf("按 W,A,S,D 移动玩家.\n按 回车键 暂停游戏.\n按 P 退出当前游戏并返回菜单.\n按 R 返回上一步移动.\n按 G 重置游戏.\n按 Y 暂停当前游戏返回开始菜单\n\n");
        printf("按I键继续游戏\n");
        int input = NULL;
        while (1)
        {
            input = _getch();
            if (input == 73)
            {
                break;
            }
        }
    }
}

void return_menu()//返回开始菜单
{
    if (input == 89)
    {
        system("cls");
        menu();
    }
}

void win_or_lose()//查看输赢次数
{
    printf("win:%d\nlose:%d\n\ninput delete to exit see!\n",win,lose);
    while (1)
    {
        char input_s = _getch();
        if (input_s == 8)
        {
            system("cls");
            menu();
            break;
        }
    }
}

感谢观看!

<font color="#fff">

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

</font>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值