Linux中C语言实现推箱子小游戏

Linux中C语言实现推箱子小游戏

1. 包含头文件

#include <stdio.h>
#include <stdlib.h>
#include <getch.h>
  • stdio.h:用于标准输入输出函数。
  • stdlib.h:用于system("clear")函数。
  • getch.h:用于获取键盘输入,不回显。

头文件中<getch.h>
此头文件在。linux中存放方式
1、在windows中把getch.h放入共享文件夹
2、在Ubuntu终端输入cd /media/sf_Share/ 进入共享文件夹(vmware中我是在cd /mnt/share/)
3、复制getch.h到C标准库中
sudo cp getch.h /usr/include/
4、加读权限
sudo chmod +r /usr/include/getch.h
5、导入getch.h头文件,使用getch()函数获取键值
Ubuntu下的键值:
上:183 下:184 左:186 右:185

#ifndef GETCH_H
#define GETCH_H

#include <termios.h>
#include <unistd.h>
#include <stdio.h>

// 修改终端的控制方式,1取消回显、确认 2获取数据 3还原
static int getch(void)
{
    // 记录终端的配置信息
    struct termios old;
    // 获取终端的配置信息
    tcgetattr(STDIN_FILENO,&old);
    // 设置新的终端配置   
    struct termios new_1 = old;
    // 取消确认、回显
    new_1.c_lflag &= ~(ICANON|ECHO);
    // 设置终端配置信息
    tcsetattr(STDIN_FILENO,TCSANOW,&new_1);

    // 在新模式下获取数据   
    int key_val = 0; 
    do{
    	key_val += getchar();
    }while(stdin->_IO_read_end - stdin->_IO_read_ptr);

    // 还原配置信息
    tcsetattr(STDIN_FILENO,TCSANOW,&old); 
    return key_val; 
}

#endif//GETCH_H


2. 主函数

int main(int argc, const char* argv[])
  • main函数是程序的入口点。

3. 定义地图

char map[8][8] = {
    {0,0,2,2,2,2,0,0},
    {0,0,2,4,4,2,0,0},
    {0,2,2,0,4,2,2,0},
    {0,2,0,0,3,4,2,0},
    {2,2,0,3,0,0,2,2},
    {2,0,0,2,3,3,0,2},
    {2,0,0,1,0,0,0,2},
    {2,2,2,2,2,2,2,2}
};
  • map是一个8x8的二维数组,表示游戏地图。
  • 不同的数字代表不同的元素:
    • 0:空地
    • 1:玩家
    • 2:墙
    • 3:箱子
    • 4:目标点
    • 5:玩家在目标点上
    • 7:箱子在目标点上

4. 初始化玩家位置和步数

int px = 6, py = 3, step = 0;
  • pxpy是玩家的位置。
  • step是玩家走的步数。

5. 无限循环

for(;;)
  • 无限循环,直到游戏结束。

6. 清屏

system("clear");
  • 清屏,使每次显示地图时都是干净的。

7. 显示地图

int cnt = 0;
for(int i = 0; i < 8; i++) {
    for(int j = 0; j < 8; j++) {
        switch(map[i][j]) {
            case 0: printf("  "); break;//空地
            case 1: printf("@ "); break;//玩家
            case 2: printf("# "); break;//墙壁
            case 3: printf("$ "); break;//箱子
            case 4: printf("O "); break;//目标地点
            case 5: printf("@ "); break;//玩家正在目标点上
            case 7: printf("$ "); cnt++; break;//箱子出现在目标点上
        }
    }
    printf("\n");
}
  • 遍历地图,根据不同的元素打印不同的字符。
  • cnt用于计数箱子在目标点上的数量。

8. 检查游戏是否完成

if(4 == cnt) {
    printf("恭喜完成任务,一共走了%d步\n", step);
    return 0;
}
  • 如果所有箱子都在目标点上(cnt == 4),则游戏完成,输出步数并退出。

9. 处理键盘输入

switch(getch()) {
    case 183: // 上
        if(0 == map[px-1][py] || 4 == map[px-1][py]) {
            map[px-1][py] += 1;
            map[px][py] -= 1;
            px--;
            step++;
        } else if(3 == map[px-1][py] || 7 == map[px-1][py]) {
            if(0 == map[px-2][py] || 4 == map[px-2][py]) {
                map[px-2][py] += 3;
                map[px-1][py] -= 2;
                map[px][py] -= 1;
                px--;
                step++;
            }
        }
        break;
    case 184: // 下
        if(0 == map[px+1][py] || 4 == map[px+1][py]) {
            map[px+1][py] += 1;
            map[px][py] -= 1;
            px++;
            step++;
        } else if(3 == map[px+1][py] || 7 == map[px+1][py]) {
            if(0 == map[px+2][py] || 4 == map[px+2][py]) {
                map[px+2][py] += 3;
                map[px+1][py] -= 2;
                map[px][py] -= 1;
                px++;
                step++;
            }
        }
        break;
    case 185: // 右
        if(0 == map[px][py+1] || 4 == map[px][py+1]) {
            map[px][py+1] += 1;
            map[px][py] -= 1;
            py++;
            step++;
        } else if(3 == map[px][py+1] || 7 == map[px][py+1]) {
            if(0 == map[px][py+2] || 4 == map[px][py+2]) {
                map[px][py+2] += 3;
                map[px][py+1] -= 2;
                map[px][py] -= 1;
                py++;
                step++;
            }
        }
        break;
    case 186: // 左
        if(0 == map[px][py-1] || 4 == map[px][py-1]) {
            map[px][py-1] += 1;
            map[px][py] -= 1;
            py--;
            step++;
        } else if(3 == map[px][py-1] || 7 == map[px][py-1]) {
            if(0 == map[px][py-2] || 4 == map[px][py-2]) {
                map[px][py-2] += 3;
                map[px][py-1] -= 2;
                map[px][py] -= 1;
                py--;
                step++;
            }
        }
        break;
}
  • 根据键盘输入(上、下、左、右)移动玩家。
  • 处理玩家移动和推动箱子的逻辑。

总结

这段代码实现了一个简单的推箱子游戏。主要功能包括:

  1. 初始化地图和玩家位置。
  2. 无限循环显示地图和处理键盘输入。
  3. 根据键盘输入移动玩家和推动箱子。
  4. 检查游戏是否完成,并输出步数。

通过这段代码,玩家可以在控制台中玩推箱子游戏,直到所有箱子都到达目标点。
在这里插入图片描述

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值