C语言简介(3)含小游戏简单代码

前言

接上章


提示:以下是本篇文章正文内容,下面案例可供参考

一、跳转语句

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++;
            }
        }
    }
}


总结

上面的代码仅供参考,也不一定是最精简的,一些变量名命名比较随意,望大家不要模仿。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值