前言
接上章
提示:以下是本篇文章正文内容,下面案例可供参考
一、跳转语句
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>
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
五、推箱子小游戏:
跟上个小游戏很相似,分析就不列举了
#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++;
}
}
}
}
总结
上面的代码仅供参考,也不一定是最精简的,一些变量名命名比较随意,望大家不要模仿。
|