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;
px
和py
是玩家的位置。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;
}
- 根据键盘输入(上、下、左、右)移动玩家。
- 处理玩家移动和推动箱子的逻辑。
总结
这段代码实现了一个简单的推箱子游戏。主要功能包括:
- 初始化地图和玩家位置。
- 无限循环显示地图和处理键盘输入。
- 根据键盘输入移动玩家和推动箱子。
- 检查游戏是否完成,并输出步数。
通过这段代码,玩家可以在控制台中玩推箱子游戏,直到所有箱子都到达目标点。