前言
接上章
提示:以下是本篇文章正文内容,下面案例可供参考
一、跳转语句
goto 可以在函数内任意跳转
它可能会破坏已经设计好的分支、循环语句,因此绝大多数公司禁止使用
但是它在驱动编程时特别适用于处理异常
标签名:
...
goto 标签名
break
1、配合switch使用,关闭执行开关
2、跳出当前次循环,只能跳一层。
continue
结束当前循环,进入下一次循环。
return
1、返回一个数值给函数的调用者
2、立即结束函数的执行
二、数组
什么是数组:变量的组合,是一种批量定义变量的方式
定义:类型 数组名[数量];
使用:数组名[下标];
下标范围:从0~数量-1
遍历:与for循环配合,使用循环变量i当作数组的下标
初始化:类型 数组名[数量]={1,2,3,4....};
1、数组与普通变量一样,默认值是随机的,为了安全要对数组进行初始化
2、这种初始化语法只能在定义数组时使用,并且只能逐个赋值,不能整体赋值
3、初始化数据过多,编译器会产生警告并丢弃
4、初始化数据不足时,编译器会自动补0
5、初始化的数据可以省略,只写大括号,相当于给所有的数据赋0
6、初始化数组时,长度可以省略,编译器会自动统计数据的个数并告诉数组
数组的长度=sizeof(arr)/sizeof(arr[0])
int num1,num2,....
数据越界:为了程序的运行效率是不会检查数组的下标
数据越界的后果:
1、一切正常
2、段错误(非法使用内存)
3、脏数据
三、二维数组:
一维数组相当于把变量排成一排,通过编号访问
二维数组相当于把变量排成矩阵,通过行号和列号访问
定义:类型 数组名[行数][列数]
int arr[3][5]
使用:数组名[行下表][列下标]
行下标:0~行数-1
列下标:0~列数-1
遍历:需要与双层for循环配合,一般外层负责遍历行,内层循环负责遍历列
初始化:
类型 数组名 [行数][列数]={{,,...},{,,...},{,,...},...};
注意:行数可以省略,列数不能省略
注意:没有所谓的多维数组,所有的多维数组都是用一维数组来模拟的
变长数组:
定义数组时使用变量作为它的长度,在代码编译期间数组的长度时是不确定的,当执行到数组的定义语句时,它的长度才能定下来,并且一旦确定就无法改变,这叫变长数组。
优点:可以根据实际情况来确定数组的长度,达到节约内存的目的
缺点:不可以初始化(初始化是发生在编译期间)
四、走迷宫小游戏:
获取方向键的功能:使用 getch.h 中的getch函数
getch.h头文件是自己编辑的,代码等会给在下面
1、在windows中把 getch.h 头文件放入共享文件夹
2、终端进入共享文件夹
cd/media/sf_share
3、复制头文件到标准库:
sudo cp getch.h /usr/include/
4、加读文件
sudo chmod +r /usr/include/getch.h
上:183 下:184 右:185 左:186
走迷宫:
1、定义二维数组作为迷宫
0 <=> ‘’
1 <=> ‘#’
2 <=> ‘@’
2、定义变量记录老鼠的坐标
3、记录游戏开始时间
4、进入死循环
1、清理屏幕system(“clear”);
2、显示迷宫(遍历)
3、获取方向键并处理
4、判断是否到达出口
是:获取游戏结束时间
结束程序
代码如下(示例):
#include <stdio.h>
#include <time.h>
#include <getch.h>
#include <stdlib.h>
int main(int argc,const char* argv[])
{
char mg[10][10]={
{1,1,1,1,1,1,1,1,1,1},
{1,0,2,0,0,0,0,0,1,1},
{1,1,1,1,1,1,1,0,1,1},
{1,1,1,1,1,1,1,0,1,1},
{1,1,1,1,1,1,1,0,1,1},
{1,1,1,1,1,1,1,0,1,1},
{1,1,0,0,0,0,0,0,1,1},
{1,1,0,1,1,1,1,1,1,1},
{1,1,0,0,0,0,1,1,1,1},
{1,1,1,1,1,0,1,1,1,1},
};
//老鼠坐标
int mouse_x=1,mouse_y=2;
//获取开始时间
time_t start=time(NULL);
for(;;)
{
//清屏幕
system("clear");
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
switch(mg[i][j])
{
case 0:printf(" ");break;
case 1:printf("# ");break;
case 2:printf("$ ");break;
}
}
printf("\n");
}
//获取方向键并处理
switch(getch())
{
case 183:
if(mg[mouse_x-1][mouse_y]==1)
break;
else
{
mg[mouse_x][mouse_y]=0;
mg[--mouse_x][mouse_y]=2;
break;
}
case 184:
if(mg[mouse_x+1][mouse_y]==1)
break;
else
{
mg[mouse_x][mouse_y]=0;
mg[++mouse_x][mouse_y]=2;
break;
}
case 185:
if(mg[mouse_x][mouse_y+1]==1)
break;
else
{
mg[mouse_x][mouse_y]=0;
mg[mouse_x][++mouse_y]=2;
break;
}
case 186:
if(mg[mouse_x][mouse_y-1]==1)
break;
else
{
mg[mouse_x][mouse_y]=0;
mg[mouse_x][--mouse_y]=2;
break;
}
}
}
}
getch.h代码如下(示例):
#ifndef GETCH_H
#define GETCH_H
#include <termios.h>
#include <unistd.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
五、推箱子小游戏:
跟上个小游戏很相似,分析就不列举了
#include <stdio.h>
#include <getch.h>
#include <stdlib.h>
int main(int argc,const char* argv[])
{
char map[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}
};
char m_x = 6, m_y = 3;
int step = 0;
for(;;)
{
int cnt = 0;
system("clear");
for(int i=0; i<8; i++)
{
for(int j=0; j<8; j++)
{
switch(map[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("$ ");
cnt++;
break;
}
}
printf("\n");
}
if(4 == cnt)
{
printf("游戏结束,共走了%d步\n",step);
return 0;
}
int x,y;
switch(getch())
{
case 183:
x=-1;y=0;
break;
case 184:
x=1;y=0;
break;
case 185:
x=0;y=1;
break;
case 186:
x=0;y=-1;
break;
}
if(0 == map[m_x+x][m_y+y] ||
4 == map[m_x+x][m_y+y])
{
map[m_x+x][m_y+y] += 2;
map[m_x][m_y] -= 2;
m_x+=x;
m_y+=y;
step++;
}
else if(3 == map[m_x+x][m_y+y] ||
7 == map[m_x+x][m_y+y])
{
if(0 == map[m_x+2*x][m_y+2*y] ||
4 == map[m_x+2*x][m_y+2*y])
{
map[m_x+2*x][m_y+2*y] += 3;
map[m_x+x][m_y+y] -= 1;
map[m_x][m_y] -= 2;
m_x+=x;
m_y+=y;
step++;
}
}
}
}