C语言学习笔记第五天_项目训练

  • 添加自定义的一个函数库文件 <getch.h>

    步骤:

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

    个人代码实现:

    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include <getch.h>
    int main(int argc,const char* argv[])
    {const uint8_t MAP_SIZE=10;int8_t loc_x=0,loc_y=0;char arr[10][10]={{'$','*','*','*','*','*','*','*','*','*'},{' ',' ',' ','*','*',' ',' ',' ',' ','*'},{'*',' ','*','*','*',' ','*','*',' ','*'},{'*',' ','*',' ',' ',' ','*','*',' ','*'},{'*',' ','*','*','*',' ','*','*',' ',' '},{'*',' ','*','*','*',' ','*','*',' ','*'},{'*',' ',' ',' ',' ',' ','*','*',' ','*'},{'*',' ',' ','*','*','*','*','*',' ','*'},{'*','*','*','*',' ',' ','*','*','*','*'},{'*','*','*','*','*','*','*','*','*','*'},};time_t time_start;time_start = time(NULL);for(;;){//清理屏幕system("clear");for(int i=0;i<10;i++){for(int j=0;j<10;j++){printf("%c ",arr[i][j]); }printf("\n");}//判断是否游戏结束if(loc_x==4&&loc_y==9){printf("游戏结束……\n");break;   }int ch=getch();int new_loc_x=loc_x,new_loc_y=loc_y;//根据读取键盘值判断走向switch(ch){case 183:new_loc_x-=1;break;case 184:new_loc_x+=1;break;case 185:new_loc_y+=1;break;case 186:new_loc_y-=1;break;default:break; }//刷新位置参数if(arr[new_loc_x][new_loc_y]==' '){arr[loc_x][loc_y]=' ';loc_x=new_loc_x;loc_y=new_loc_y;arr[loc_x][loc_y]='$';}}time_t time_end;time_end = time(NULL);printf("您花费的时间为:%lus\n",time_end-time_start);return 0;
    }
  • 项目二:推箱子

    数据分析:
    1、确定数值与字符的对应关系

                0       '  '1       '@'2       ' # '3       ' $ '4       ' O '5       ' @ '7       ' $ '
    

    ​ 2、定义8*8整数地图并初始化
    ​ 3、定义记录角色位置的变量 x y
    ​ 4、定义记录步数的变量

    逻辑分析:进入死循环
    ​        1、清理屏幕、显示地图
    ​            `if(0 == map[i][j])  printf(" ");`
    ​        2、判断是否游戏胜利
    ​        3、获取方向键并处理
    ​               1、前方是路/目标点,参考走迷宫
    ​                   前方    +1
    ​                   原位置  -1
    ​                   更新坐标
    ​               2、前方是箱子
    ​                   箱子的前方是路\目标点
    ​                       人前方的前方    +3
    ​                       人前方          -3+1
    ​                       人原位置        -1
    ​                       更新左边
    

个人代码实现:

按照目前进度,没有学过#define 数组 结构体 联合等相关内容,故代码有点 非常粗糙

#include <stdio.h>
#include <stdint.h>
#include <getch.h>
#include <stdlib.h>int main(int argc,const char* argv[])
{uint8_t 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},      };int step=0;int loc_x=6,loc_y=3;char sign[8]={' ','@','*','#','&','@','1','!'};// 0路径// 1人// 2墙壁// 3箱子// 4目标// 5目标和人在一起// 6// 7目标和箱子在一起//打印地图for(;;){system("clear");int cnt=0;for(int i=0;i<8;i++){for(int j=0;j<8;j++){if(map[i][j]==7){cnt+=1; }printf("%c ",sign[map[i][j]]);   }printf("\n");}if(cnt==4){printf("游戏结束……您走了%d步",step);    }int ch=getch();int new_loc_x=loc_x,new_loc_y=loc_y;switch(ch){case 183:new_loc_x-=1;break; case 184:new_loc_x+=1;break;  case 185:new_loc_y+=1;break;  case 186:new_loc_y-=1;break;   }if(map[new_loc_x][new_loc_y] == 0)//前面是路{map[loc_x][loc_y]-=1;loc_x = new_loc_x;loc_y = new_loc_y;map[loc_x][loc_y] +=1;step+=1;}if(map[new_loc_x][new_loc_y] == 4 )//前面是目标{map[loc_x][loc_y]-=1;loc_x = new_loc_x;loc_y = new_loc_y;map[loc_x][loc_y] +=1;step +=1;}if(ch==183 &&( map[new_loc_x][new_loc_y]==3|| map[new_loc_x][new_loc_y]==7)&& (map[new_loc_x-1][new_loc_y]==0 || map[new_loc_x-1][new_loc_y]==4)){map[new_loc_x-1][new_loc_y]+=3;map[new_loc_x][new_loc_y] -= 2;map[loc_x][loc_y]-=1;loc_x = new_loc_x;loc_y = new_loc_y;step+=1; }if(ch==184&& (map[new_loc_x][new_loc_y]==3 || map[new_loc_x][new_loc_y]==7)&&(map[new_loc_x+1][new_loc_y]==0 || map[new_loc_x+1][new_loc_y]==4)){map[new_loc_x+1][new_loc_y]+=3;map[new_loc_x][new_loc_y] -=2;map[loc_x][loc_y]-=1;loc_x = new_loc_x;loc_y = new_loc_y;step+=1;   }if(ch==185&&( map[new_loc_x][new_loc_y]==3 || map[new_loc_x][new_loc_y]==7)&&(map[new_loc_x][new_loc_y+1]==0 || map[new_loc_x][new_loc_y+1]==4)){map[new_loc_x][new_loc_y+1]+=3;map[new_loc_x][new_loc_y] -=2;map[loc_x][loc_y]-=1;loc_x = new_loc_x;loc_y = new_loc_y;step+=1;   }if(ch==186&& (map[new_loc_x][new_loc_y]==3 || map[new_loc_x][new_loc_y]==7)&&(map[new_loc_x][new_loc_y-1]==0 || map[new_loc_x][new_loc_y-1]==4)){map[new_loc_x][new_loc_y-1]+=3;map[new_loc_x][new_loc_y] -=2;map[loc_x][loc_y]-=1;loc_x = new_loc_x;loc_y = new_loc_y;step+=1;  }}return 0;
}

<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

最后,如有更好思路或着看出bug的,还请不吝赐教,谢谢……

C语言学习笔记第五天_项目训练相关推荐

  1. codesys工程ST语言学习笔记(五)打开压缩文件projectarchive失败,指定的工程不能被加载

    codesys解压文件projectarchive失败 不会编译程序或者建立工程的点击第一篇文章codesys工程ST语言学习笔记(一)建立工程与编译 不会编译程序或者建立工程的点击第一篇文章code ...

  2. C语言学习笔记(五) 数组

    数组 数组的出现就是为了解决大量同类型数据的存储和使用的问题: 数组的分类:一维数组.二维数组. 一维数组:为多个变量连续分配存储控件:所有的变量的数据类型必须相同:所有变量所占的字节大小必须相等: ...

  3. R语言学习笔记(五)假设检验及其R实现

    文章目录 写在前面 概念回顾 关于χ2\chi^2χ2分布的一个重要定理 假设检验 概念 两类错误 功效与样本量 假设检验与置信区间的关系 单个正态总体均值的检验 推导过程 ppp值的有关结论 R语言 ...

  4. C语言学习笔记——输入五个国家的名称,按字母顺序排列输出

    建立一个指针数组,数组内的每一个指针分别指向每一个国家名的字符串.排序时,直接操作指针更加方便. 程序运行结果: /*Name: sortCountryNameAuthor: leeooDate: 1 ...

  5. C语言学习笔记(五):《C语言深度剖析》笔记

    register变量必须是能被cpu寄存器所接受的类型.此变量必须是一个单个的值,并且其长度应小于或等于整形的长度,而且此变量可能不存放在内存中,所以不能用取址运算符"&" ...

  6. C语言程序设计CAP——C语言学习笔记(五) 下

    5.3循环应用 #include <stdio.h>int main() {int n;int i;double ret=0.0;scanf("%d", &n) ...

  7. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  8. JavaScript学习笔记(五)---cookie、Proxy、服务器、PHP语言、http协议、同步异步、事件轮循机制、ajax编写、接口

    JavaScript学习笔记(五)---cookie.Proxy.服务器.PHP语言.http协议.同步异步.事件轮循机制.ajax编写.接口 1.cookie 1.1cookie概念 1.2cook ...

  9. c语言用位运算将一个数清零,C语言学习笔记_位运算

    C语言学习笔记_位运算 知识点记录 基本位运算 按位与:全1为1,见0为0:与1相与无变化,与0相与变为0:可用于特定位清零 按位或:见1为1,全0为0:与1相或变为1,与0相或无变化:可用于特定位置 ...

最新文章

  1. 最新最全的 Android 开源项目合集(一)
  2. Silverlight实用窍门系列:59.多个中心点联动多线的可拖动控件扩展为拓扑图
  3. 织梦dedecms移动版设置二级域名的方法 织梦如何设置m.开头的域名
  4. 漫说单例模式--宝宝成长记 你真的了解了吗?
  5. 算个欧拉函数给大家助助兴(米勒拉宾(判断素数)+Pollard_rho(求一个大数的因子 ))
  6. 郑州军办计算机学校,郑州市国防科技学校2019级新生开启军训模式
  7. myabatis oracle 调用存储过程返回list结果集
  8. Quartz.NET 架构与源代码分析系列 part 1 :Quartz.NET 入门
  9. Silverlight 同域WCF免跨域文件
  10. python发起http请求(httplib)
  11. cacti监控linux和windows磁盘io,为CactiEZ(或者Cacti)增加监控磁盘IO功能
  12. TikTok Shop 英国限售商品规则
  13. html项目答辩策划书,职业生涯规划大赛答辩会策划书
  14. Unity学习笔记(一)——基本概念之场景(Scene)
  15. 苹果开发证书导出P12的问题
  16. idear怎么设置自动导包
  17. 【概率图与随机过程】06 朴素贝叶斯:基于条件独立性假设
  18. c语言无符号整型越界,整型输出越界问题
  19. Python pdf 去水印
  20. Figma 中文社区找到了!

热门文章

  1. 我们游戏后台架构学习
  2. sass详细知识点介绍(环境配置)
  3. 删除电脑被占用的串口
  4. python gdal安装_Windows 7 X64Python安装GDAL
  5. 【一起学Rust | 框架篇 | Frui框架】rust一个对开发者友好的GUI框架——Frui
  6. 打包SWF和HTML,将多个swf打包成一个EXE文件
  7. 六成受访美国人认为教育系统正在令这一代人失望
  8. 每周一品 · 音圈电机(VCM)中的磁性材料
  9. Android通过广播接收器BroadcastReceiver监听蓝牙连接变化
  10. Springboot框架整合Mybatis-plus实战动态SQL以及常见的Mybatis面试题