#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define HEIGHT 10 //纵向
#define WIDIH 10 //横向
int x, y; //人的位置
int boxs; //箱子数
//函数声明
void drawMap(); //打印地图
void game(); //按键
void initData(); //初始化数据
int map[HEIGHT][WIDIH] = {
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,0,0,0,0},
{0,1,2,0,0,1,0,0,0,0},
{0,1,0,3,3,1,0,1,1,1},
{0,1,0,3,0,1,0,1,4,1},
{0,1,1,1,0,1,1,1,4,1},
{0,0,1,1,0,0,0,0,4,1},
{0,0,1,0,0,0,1,0,0,1},
{0,0,1,0,0,0,1,1,1,1},
{0,0,1,1,1,1,1,0,0,0}
/* {1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,3,0,0,0,0,0,0,1},
{1,4,4,4,3,2,0,0,0,1},
{1,3,0,0,0,0,0,0,0,1},
{1,0,0,0,3,0,0,0,0,1},
{1,0,0,0,4,3,0,0,0,1},
{1,0,0,0,4,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
*/};
int main() {
initData();
while(1){
system("cls"); //清屏并打印地图
printf("箱子数:%d\n",boxs);
drawMap();
if(boxs==0){
break; //箱子数等于零,跳出循环
}
game();
initData();
}
printf("恭喜你完成游戏..........");
}
void drawMap(){
int i, j;
for(i=0; i<HEIGHT; i++){
for(j=0; j<WIDIH; j++){
switch(map[i][j]){
case 0: printf(" ");break; // 空地
case 1: printf("■");break; // 墙
case 2: printf("♀");break; // 人
case 3: printf("◆");break; // 箱子
case 4: printf("☆");break; // 目的地
case 5: printf("★");break; // 已完成
case 6: printf("♀");break; // 人+目的地
}
}
printf("\n");
}
}
void initData(){
int i, j;
boxs = 0;
for(i=0; i<HEIGHT; i++){
for(j=0; j<WIDIH; j++){
if(map[i][j]==2){
y = i;
x = j;
}
if(map[i][j]==3){
boxs++;
}
}
}
}
void game(){
char direction; //定义按键输入
direction = getch();
switch(direction){
//向上
case 'w':
case 'W':
int wx,wy;
wx = x;
wy = y-1;
//判断边界
if(y==0){
break;
}
//人上方是墙 1
if(map[wy][wx]==1){
break;
}
//人上方是箱子或者已完成 3,5
if(map[wy][wx]==3||map[wy][wx]==5){
//箱子上方是墙或者是箱子或者是已完成(球) 1,3,5
if(map[wy-1][wx]==1||map[wy-1][wx]==3||map[wy-1][wx]==5){
break;
}
//箱子上面是目的地 4
if(map[wy-1][wx]==4){
map[wy-1][wx] = 5;
}else{ //箱子上面是空 0
map[wy-1][wx] = 3;
}
}
if(map[y][x]!=6){
map[y][x] = 0; //人向上移动,上面为空也是这种情况 0
}
if(map[y][x]==6){
map[y][x] = 4;
}
//人上面是目的地或者已完成 4,6
if(map[wy][wx]==4||map[wy][wx]==5){
map[wy][wx] = 6;
}else{
map[wy][wx] = 2;
}
y = wy;
break;
//向下
case 's':
case 'S':
int sx,sy;
sx = x;
sy = y+1;
if(y==HEIGHT-1){
break;
}
if(map[sy][sx]==1){
break;
}
if(map[sy][sx]==3||map[sy][sx]==5){
if(map[sy+1][sx]==1||map[sy+1][sx]==3||map[sy+1][sx]==5){
break;
}
if(map[sy+1][sx]==4){
map[sy+1][sx] = 5;
}else{
map[sy+1][sx] = 3;
}
}
if(map[y][x]!=6){
map[y][x] = 0;
}
if(map[y][x]==6){
map[y][x] = 4;
}
if(map[sy][sx]==4||map[sy][sx]==5){
map[sy][sx] = 6;
}else{
map[sy][sx] = 2;
}
y = sy;
break;
//向左
case 'a':
case 'A':
int ax,ay;
ax = x-1;
ay = y;
if(x==0){
break;
}
if(map[ay][ax]==1){
break;
}
if(map[ay][ax]==3||map[ay][ax]==5){
if(map[ay][ax-1]==1||map[ay][ax-1]==3||map[ay][ax-1]==5){
break;
}
if(map[ay][ax-1]==4){
map[ay][ax-1] = 5;
}else{
map[ay][ax-1] = 3;
}
}
map[y][x] = 0;
if(map[ay][ax]==4||map[ay][ax]==5){
map[ay][ax] = 6;
}else{
map[ay][ax] = 2;
}
x = ax;
break;
//向右
case 'd':
case 'D':
int dx,dy;
dx = x+1;
dy = y;
if(x==WIDIH-1){
break;
}
if(map[dy][dx]==1){
break;
}
if(map[dy][dx]==3||map[dy][dx]==5){
if(map[dy][dx+1]==1||map[dy][dx+1]==3||map[dy][dx+1]==5){
break;
}
if(map[dy][dx+1]==4){
map[dy][dx+1] = 5;
}else{
map[dy][dx+1] = 3;
}
}
if(map[y][x]!=6){
map[y][x] = 0;
}
if(map[y][x]==6){
map[y][x] = 4;
}
if(map[dy][dx]==4||map[dy][dx]==5){
map[dy][dx] = 6;
}else{
map[dy][dx] = 2;
}
x = dx;
break;
}
}
C语言推箱子的代码
最新推荐文章于 2023-04-03 15:09:04 发布