C语言案例之走迷宫(Ubuntu)

配置文件

1、在windows中把getch.h放入共享文件夹
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 = old;
    // 取消确认、回显
    new.c_lflag &= ~(ICANON|ECHO);
    // 设置终端配置信息
    tcsetattr(STDIN_FILENO,TCSANOW,&new);

    // 在新模式下获取数据   
    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、在Ubuntu终端输入cd /media/sf_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

案例1、走迷宫:

数据分析:
    1、定义二维的字符数作为迷宫地图
    2、定义变量记录角色的位置 x y
    3、时间:time(NULL)获取1970-1-1到运行时过了总秒数
逻辑分析:  
    进入死循环:
        1、显示地图
        2、获取方向键并处理
            判断前方是不是路' '
                如果是:
                    1、把旧位置变成' '
                    2、把新位置变成'@'
                    3、更新角色位置坐标 x y
        3、判断是否到达出口
            如果是:程序结束        

程序代码:

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

int main(int argc,const char* argv[])
{
	char maze[10][10]={
		{'#','#','#','#','#','#','#','#','#','#'},
		{'#',' ','#','#','#','#','#','#','#','#'},
		{'#','@','#','#','#','#','#','#','#','#'},
		{'#',' ','#',' ',' ',' ','#','#','#','#'},
		{'#',' ','#',' ','#',' ','#','#','#','#'},
		{'#',' ','#',' ','#',' ','#','#','#','#'},
		{'#',' ','#',' ','#',' ','#','#','#','#'},
		{'#',' ',' ',' ','#',' ',' ',' ',' ',' '},
		{'#','#','#','#','#','#','#','#','#','#'},
		{'#','#','#','#','#','#','#','#','#','#'},
		};
	// 记录角色的位置坐标
	char man_x=2,man_y=1;
	//记录时间
	time_t time_0=time(NULL);
	for(;;)
	{
		//清理屏幕
		system("clear");
		//显示地图
		for(int i=0;i<10;i++)
		{
			for(int j=0;j<10;j++)
			{
				printf("%c ",maze[i][j]);	
			}
			printf("\n");
		}
		if('@'==maze[7][9])
		{
			printf("游戏胜利!用时%ld秒",time(NULL)-time_0);
			break;
		}

		//获取方向键并处理
		switch(getch())
		{
			case 183:		//向上
				if(' '== maze[man_x-1][man_y])
				{
					maze[man_x][man_y]=' ';
					/*	maze[man_x-1][man_y]='@';
						man_x--;*/
					maze[--man_x][man_y]='@';
				}
				break;
			case 184:		//向下
				if(' '== maze[man_x+1][man_y])
				{
					maze[man_x][man_y]=' ';
					/*	maze[man_x+1][man_y]='@';
						man_x++;*/
					maze[++man_x][man_y]='@';
				}
				break;
			case 186:		//向左
				if(' '== maze[man_x][man_y-1])
				{
					maze[man_x][man_y]=' ';
					/*	maze[man_x][man_y-1]='@';
						man_y--;*/
					maze[man_x][--man_y]='@';
				}
				break;
			case 185:		//向右
				if(' '== maze[man_x][man_y+1])
				{
					maze[man_x][man_y]=' ';
					/*	maze[man_x][man_y+1]='@';
						man_x++;*/
					maze[man_x][++man_y]='@';
				}
				break;
		}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值