简单的推箱子

本文详细介绍了使用C语言实现Sokoban(推箱子)游戏的过程。通过定义棋盘、玩家位置及游戏元素,实现了游戏的基本逻辑,包括玩家移动、箱子推动及目标达成判断。利用系统清屏和字符绘图,提供了简洁的文本界面。
摘要由CSDN通过智能技术生成
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

int main()
{
    int map[8][8] = {//定义棋盘 0表示空位,3表示墙壁,4表示箱子,5表示目标位置,2表示人
        {0,0,3,3,3,3,0,0},
        {0,0,3,5,5,3,0,0},
        {0,3,3,0,5,3,3,0},
        {0,3,0,0,4,5,3,0},
        {3,3,0,4,0,0,3,3},
        {3,0,0,3,4,4,0,3},
        {3,0,0,2,0,0,0,3},
        {3,3,3,3,3,3,3,3},
    };
    int mx = 6, my = 3;//记录玩家的位置
    for (;;)
    {
        system("cls");
        int cnt = 0, ox = 0, oy = 0;//cnt 是用来计算有几个箱子别推到目标上,当cnt为4的时候表示游戏结束
        for (int i = 0; i < 8; i++)//ox,oy是用来记录人移动所带来的偏移位置
        {
            for (int j = 0; j < 8; j++)
            {
                printf("%d ", map[i][j]);
            }
            printf("\n");
        }
        printf("\n");
        printf("\n");
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                switch (map[i][j])
                {
                case 0:printf("  "); break;
                case 2:printf("@ "); break;
                case 3:printf("# "); break;
                case 4:printf("O "); break;
                case 5:printf("X "); break;
                case 7:printf("@ "); break;//人站在目标位置
                case 9:printf("O "); break;//箱子在目标位置
                default: break;
                }
                if (9 == map[i][j])cnt++;
            }
            printf("\n");
        }
 

        if (4 == cnt)break;

        switch (getch())//获取方向键
        {
        case 72:ox--; break;               //上 下 左 右

        case 80:ox++; break;

        case 75:oy--; break;

        case 77:oy++; break;
        }
        if ((4 == map[mx + ox][my + oy] || 9 == map[mx + ox][my + oy]) &&    //第一种情况是人移动的方向有箱子,箱子前方是空格或者目标地点,那就允许
            (5 == map[mx + 2 * ox][my + 2 * oy] || 0 == map[mx + 2 * ox][my + 2 * oy]))//移动
        {
            map[mx + 2 * ox][my + 2 * oy] += 4;
            map[mx + ox][my + oy] -= 2;
            map[mx][my] -= 2;
            mx += ox;
            my += oy;
        }
        if (0 == map[mx + ox][my + oy] || 5 == map[mx + ox][my + oy]) //第二种是人移动的方向有空格或者目标地点,允许移动
        {
            map[mx + ox][my + oy] += 2;
            map[mx][my] -= 2;
            mx += ox;
            my += oy;
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值