温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

利用C语言怎么编写一个推箱子小游戏

发布时间:2020-12-29 14:02:11 来源:亿速云 阅读:184 作者:Leah 栏目:开发技术

本篇文章给大家分享的是有关利用C语言怎么编写一个推箱子小游戏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

游戏原理分析

1、游戏开始时的星星个数 = 箱子在星星上的个数时 , 游戏胜利。
2、按 r 键重新开始游戏, 我们需要定义一个量 map_1[8][8] 来保存游戏初始时的界面, 操作时我们将其赋值给 map[8][8] 来进行操作,以便重新归位, 这里就用到了memcpy()函数。
3、wasd 代表上下左右 操作人物移动, 分别需要为其定义一个函数。
4、判断人物移动之前我们需要定位到人物的位置,这里我们用find()函数来定义。

首先从头文件开始介绍:

#include<stdio.h>  #include<stdlib.h> //malloc()函数 #include<string.h> //memcpy()函数 #include<conio.h> //getch()函数

函数名称:malloc
函数原型: void * malloc(unsigned size);
函数功能: 分配size字节的存储区
函数返回: 所分配的内存区地址,如果内存不够,返回0

函数函数:memcpy
函数原型:void *memcpy(void *dest, const void *src, size_t n);
函数功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
函数返回:函数返回指向dest的指针。

函数名称:getch
函数原型: int getch(void);
函数功能: 从控制台读取一个字符,但不显示在屏幕上
函数返回: 读取的字符

上图是简单的8*8的图,我们定义一个二维数组来保存整张图,用0,1,2,3,4 来代表游戏界面中的每个符号。代码如下:

int map_1[8][8]={   {0,0,1,1,1,0,0,0},   {0,0,1,4,1,0,0,0},   {0,0,1,2,1,1,1,1},   {1,1,1,0,0,2,4,1},   {1,4,0,2,3,1,1,1},   {1,1,1,1,2,1,0,0},   {0,0,0,1,4,1,0,0},   {0,0,0,1,1,1,0,0}  };

定义全局变量:

int x, y; int map[8][8] = {0};

声明函数原型:

int count1();  // 星星的个数 int count2(); // 箱子到了星星的位置的个数 int up();   int down(); int left(); int right(); int shuchu(); int find();   //找到自己 int zhujiemian(); //输出主界面

接着我们来给每个数字赋值他们所代表的符号, 代码如下:

int shuchu()  {   for(x=0; x<8; x++)   {    for(y=0; y<8; y++)    {     if(map[x][y] == 1)      printf("■"); //输出砖块的样子     if(map[x][y] == 3)      printf("⊙"); //输出自己的位置     if(map[x][y] == 2)      printf("□"); //输出箱子     if(map[x][y] == 4)      printf("☆"); //输出箱子要到的位置     if(map[x][y] == 0)      printf(" "); //输出空白     if(map[x][y] == 5)       printf("★"); //输出箱子到了该到的位置    }    printf("\n");   }   return 0;  }

接着我们需要一个开始游戏之前的一个主界面来提示游戏玩法, 代码如下:

 //制作主界面 int zhujiemian()  {   printf("*************************\n"    "****请按任意键游戏开始~*****\n"    "****制作:菜学匠************\n"    "****请按wasd 控制上下左右****\n"    "****请按r重新开始游戏*******\n"    "*************************\n");    }

接着要想操作人物移动首先要找到界面中人物的位置:

 //找到自己的位置  int find()  {   for(x=0; x<8; x++)    for(y=0; y<8; y++)    {     if(map[x][y] == 3)      return 0;    }    return 0;  }

再来记录游戏开始之前星星的个数, 和箱子到了星星位置的个数:

//星星的个数  int count1()  {   int n=0;   for(x=0; x<8; x++)    for(y=0; y<8; y++)    {     if(map[x][y] == 4)      n++;    }  return n;  }  //箱子到了位置的个数  int count2()  {   int m=0;   for(x=0; x<8; x++)    for(y=0; y<8; y++)    {     if(map[x][y] == 5)      m++;    }    return m;  }

接着来给wasd 四个方向上的人物移动做判断, 确定人物的移动:

// 按w的时候的输出结果  int up()  {   if(map[x][y] == 3) //找到自己的位置   {    if(map[x-1][y] == 0) //判断下一格子是不是空    {     map[x-1][y] = 3;     map[x][y] = 0;    }    if(map[x-1][y] == 2 && map[x-2][y] == 4) /*判断下一格子是不是箱子,下下个格子是不是箱子要到的地方*/    {     map[x][y] = 0;     map[x-1][y] = 3;     map[x-2][y] = 5;    }   }   return 0;  }  //按d的时候的输出结果  int down()  {   if(map[x][y] == 3)    //找到自己   {    if(map[x+1][y] == 0)  //判断下个格子是否空格    {    map[x+1][y] = 3;    map[x][y] = 0;    }    if(map[x+1][y] == 2 && map[x+2][y] == 4) /*判断下个格子是不是箱子且箱子后面的是不是星星*/    {     map[x][y] = 0;     map[x+1][y] = 3;     map[x+2][y] = 5;    }   }   return 0;  }  //按a的时候的输出结果  int left()  {   if(map[x][y] == 3)   {    if(map[x][y-1] == 0)  //判断下个格子是否空格    {     map[x][y-1] = 3;     map[x][y] = 0;    }   if(map[x][y-1] == 2 && map[x][y-2] == 4) /*判断下个格子是不是箱子且箱子后面的是不是星星*/     {    map[x][y] = 0;    map[x][y-1] = 3;    map[x][y-2] = 5;   }   if(map[x][y-2] == 0 && map[x][y-1] == 2) /*判断下个格子是不是箱子且箱子后面的格子是不是空格*/   {    map[x][y] = 0;    map[x][y-1] = 3;    map[x][y-2] = 2;   }   }   return 0;  }  //按d的时候的输出结果  int right()  {   if(map[x][y] == 3)   {    if(map[x][y+1] == 0)  //判断下个格子是否空格    {     map[x][y+1] =3;     map[x][y] = 0;    }    if(map[x][y+1] == 2 && map[x][y+2] == 4)/*判断下个格子是不是箱子且箱子后面的是不是星星*/    {     map[x][y] = 0;     map[x][y+1] = 3;     map[x][y+2] = 5;    }   }   return 0;  }

最后就是最重要的主函数了:

int main()  {   int n,m;   system("title 推箱子游戏~"); //给一个标题   memcpy(map, map_1, sizeof(map_1));    zhujiemian();   getch();   system("cls");    //清屏   n=count1();        while(1)   {    system("cls");    shuchu();    m= count2();    find();    switch(getch())    {     case 'w':up(); break;     case 's':down(); break;     case 'a':left(); break;     case 'd':right(); break;     case 'r':memcpy(map, map_1, sizeof(map_1)); break;    }    if(n==m)    {    system("cls");    printf("游戏胜利~\n");    getch();    return 0;    }   }  }

接下来给出整个完整的程序,经过gcc 编译可以运行,代码如下:

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h>  int x=0,y=0;  int map[8][8]={0};  // 定义的游戏界面模型  int map_1[8][8]={   {0,0,1,1,1,0,0,0},   {0,0,1,4,1,0,0,0},   {0,0,1,2,1,1,1,1},   {1,1,1,0,0,2,4,1},   {1,4,0,2,3,1,1,1},   {1,1,1,1,2,1,0,0},   {0,0,0,1,4,1,0,0},   {0,0,0,1,1,1,0,0}  };  int count1();  int count2();  int ();  up();  int down();  int left();  int right  int shuchu();  int find();  int zhujiemian();  int main()  {   int n,m;   system("title 推箱子游戏~");   memcpy(map, map_1, sizeof(map_1));   zhujiemian();   getch();   system("cls");   n=count1();   while(1)   {    system("cls");    shuchu();    m= count2();    find();    switch(getch())    {     case 'w':up(); break;     case 's':down(); break;     case 'a':left(); break;     case 'd':right(); break;     case 'r':memcpy(map, map_1, sizeof(map_1)); break;    }    if(n==m)    {    system("cls");    printf("游戏胜利~\n");    getch();    return 0;    }   }  }  // 按w的时候的输出结果  int up()  {   if(map[x][y] == 3) //找到自己的位置   {    if(map[x-1][y] == 0) //判断下一格子是不是空    {     map[x-1][y] = 3;     map[x][y] = 0;    }    if(map[x-1][y] == 2 && map[x-2][y] == 4) //判断下一格子是不是箱子,下下个格子是不是箱子要到的地方    {     map[x][y] = 0;     map[x-1][y] = 3;     map[x-2][y] = 5;    }   }   return 0;  }  //按d的时候的输出结果  int down()  {   if(map[x][y] == 3)   {    if(map[x+1][y] == 0)    {    map[x+1][y] = 3;    map[x][y] = 0;    }    if(map[x+1][y] == 2 && map[x+2][y] == 4)    {     map[x][y] = 0;     map[x+1][y] = 3;     map[x+2][y] = 5;    }   }   return 0;  }  //按a的时候的输出结果  int left()  {   if(map[x][y] == 3)   {    if(map[x][y-1] == 0)    {     map[x][y-1] = 3;     map[x][y] = 0;    }   if(map[x][y-1] == 2 && map[x][y-2] == 4)   {    map[x][y] = 0;    map[x][y-1] = 3;    map[x][y-2] = 5;   }   if(map[x][y-2] == 0 && map[x][y-1] == 2)   {    map[x][y] = 0;    map[x][y-1] = 3;    map[x][y-2] = 2;   }   }   return 0;  }  //按d的时候的输出结果  int right()  {   if(map[x][y] == 3)   {    if(map[x][y+1] == 0)    {     map[x][y+1] =3;     map[x][y] = 0;    }    if(map[x][y+1] == 2 && map[x][y+2] == 4)    {     map[x][y] = 0;     map[x][y+1] = 3;     map[x][y+2] = 5;    }   }   return 0;  }   int shuchu()  {   for(x=0; x<8; x++)   {    for(y=0; y<8; y++)    {     if(map[x][y] == 1)      printf("■"); //输出砖块的样子     if(map[x][y] == 3)      printf("⊙"); //输出自己的位置     if(map[x][y] == 2)      printf("□"); //输出箱子     if(map[x][y] == 4)      printf("☆"); //输出箱子要到的位置     if(map[x][y] == 0)      printf(" "); //输出空白     if(map[x][y] == 5)       printf("★"); //输出箱子到了该到的位置    }    printf("\n");   }   return 0;  }  //找到自己的位置  int find()  {   for(x=0; x<8; x++)    for(y=0; y<8; y++)    {     if(map[x][y] == 3)      return 0;    }    return 0;  }  //箱子要到的位置的个数  int count1()  {   int n=0;   for(x=0; x<8; x++)    for(y=0; y<8; y++)    {     if(map[x][y] == 4)      n++;    }  return n;  }  //箱子到了位置的个数  int count2()  {   int m=0;   for(x=0; x<8; x++)    for(y=0; y<8; y++)    {     if(map[x][y] == 5)      m++;    }    return m;  }  //制作主界面  int zhujiemian()  {   printf("*************************\n"    "***请按任意键游戏开始~***\n"    "*********制作:小菜*******\n"    "**请按wasd 控制上下左右**\n"    "**请按r重新开始游戏******\n"    "*************************\n");  }

以上就是利用C语言怎么编写一个推箱子小游戏,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI