#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;
}
}
}
简单的推箱子
最新推荐文章于 2024-11-07 15:25:24 发布
本文详细介绍了使用C语言实现Sokoban(推箱子)游戏的过程。通过定义棋盘、玩家位置及游戏元素,实现了游戏的基本逻辑,包括玩家移动、箱子推动及目标达成判断。利用系统清屏和字符绘图,提供了简洁的文本界面。
摘要由CSDN通过智能技术生成