小游戏:推箱子

一、Windows下获取方向键

1、导入#include <conio.h>

2、通过getch()的返回值获取键盘上的键值

            上:72   下:80   左:75    右:77

二、Linux下获取方向键

1、在window中吧getch.h文件放入共享文件夹中

2、把getch.h放入C标准库默认路径中,在Linux终端输入 sudo cp/media/共享文件名/getch.h user/include/

3、给getch.h加读写权限

        sudo chmod +r /user/include/getch.h

4、Linux方向键键值:上183 下184 左186 右185

 getch.h文件内容

#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

三、项目分析

数据分析

        1、定义整数类型的二维数组(int型,以下数值代表对应一个物体或事件)

        0       路          ' '

        1     墙壁        '#'

        2       人         '@'

        3      箱子       '$'

        4   目标点       'o'

        6       人+目标点          '@'

        7      箱子+目标点        '$'

        2、定义记录人的位置变量

        3、定义记录步数

逻辑分析

        进入死循环

                1、清屏、显示界面

                2、获取方向键并处理

                        ① 前方是路或者空目标点

                                参考走迷宫项目,前方+2,原位置-2

                        ② 当人前方是箱子

                                当箱子的前方是路/目标点,移动

                3、判断在目标点上箱子的数量是否==4

                        是:程序结束;

                        否:循环继续;

四、项目实现

#include <stdio.h>
#include <stdbool.h>
#include <getch.h>
#include <stdlib.h>

//定义整张游戏地图二维数组
int arr[8][8]={
	{0,0,1,1,1,1,0,0},
	{0,0,1,4,4,1,0,0},
	{0,1,1,0,4,1,1,0},
	{0,1,0,0,3,4,1,0},
	{1,1,0,3,0,0,1,1},
	{1,0,0,1,3,3,0,1},
	{1,0,0,2,0,0,0,1},
	{1,1,1,1,1,1,1,1}
	};
//定义记录人位置变量
int x=6,y=3;
//定义记录步数变量
int cnt=0;

//显示地图
void show(void);
//移动
void up(void);
void down(void);
void left(void);
void right(void);
//判断游戏结束
bool end(void);

int main()
{
	while(1)
	{
		int dir=0;
		//显示地图
		show();
		//移动
		dir=getch();
		switch(dir)
		{
			case 183:up();break;
			case 184:down();break;
			case 186:left();break;
			case 185:right();break;
		}
		//判断游戏结束
		if(end())
		{
			show();
			printf("恭喜通关!\n一共走了%d步\n",cnt);
			return 0;
		}
	}
}


//显示地图
void show(void)
{
	//清屏
	system("clear");
	for(int i=0;i<8;i++)
	{
		for(int j=0;j<8;j++)
		{
			switch(arr[i][j])
			{
				case 0:printf("  ");break;
				case 1:printf("# ");break;
				case 2:printf("@ ");break;
				case 3:printf("$ ");break;
				case 4:printf("o ");break;
				case 6:printf("@ ");break;
				case 7:printf("$ ");break;
			}
		}
		printf("\n");
	}
}
//移动
void up(void)
{
	if(arr[x-1][y]==0||arr[x-1][y]==4)
	{
		arr[x-1][y]+=2;
		arr[x][y]-=2;
		x=x-1;
		cnt++;
	}
	else if(arr[x-1][y]==3||arr[x-1][y]==7)
	{
		if(arr[x-2][y]==0||arr[x-2][y]==4)
		{
			arr[x-2][y]+=3;
			arr[x-1][y]=arr[x-1][y]-1;
			arr[x][y]-=2;
			x=x-1;
			cnt++;
		}
	}
}
void down(void)
{
	if(arr[x+1][y]==0||arr[x+1][y]==4)
	{
		arr[x+1][y]+=2;
		arr[x][y]-=2;
		x=x+1;
		cnt++;
	}
	else if(arr[x+1][y]==3||arr[x+1][y]==7)
	{
		if(arr[x+2][y]==0||arr[x+2][y]==4)
		{
			arr[x+2][y]+=3;
			arr[x+1][y]=arr[x+1][y]-1;
			arr[x][y]-=2;
			x=x+1;
			cnt++;
		}
	}
}
void left(void)
{
	if(arr[x][y-1]==0||arr[x][y-1]==4)
	{
		arr[x][y-1]+=2;
		arr[x][y]-=2;
		y=y-1;
		cnt++;
	}
	else if(arr[x][y-1]==3||arr[x][y-1]==7)
	{
		if(arr[x][y-2]==0||arr[x][y-2]==4)
		{
			arr[x][y-2]+=3;
			arr[x][y-1]=arr[x][y-1]-1;
			arr[x][y]-=2;
			y=y-1;
			cnt++;
		}
	}
}
void right(void)
{
	if(arr[x][y+1]==0||arr[x][y+1]==4)
	{
		arr[x][y+1]+=2;
		arr[x][y]-=2;
		y=y+1;
		cnt++;
	}
	else if(arr[x][y+1]==3||arr[x][y+1]==7)
	{
		if(arr[x][y+2]==0||arr[x][y+2]==4)
		{
			arr[x][y+2]+=3;
			arr[x][y+1]=arr[x][y+1]-1;
			arr[x][y]-=2;
			y=y+1;
			cnt++;
		}
	}
}
//判断游戏结束
bool end(void)
{
	int sum=0;
	for(int i=0;i<8;i++)
	{
		for(int j=0;j<8;j++)
		{
			if(arr[i][j]==7)
			{
				sum++;
			}
		}
	}
	if(sum==4)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就酱77叭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值