c语言小游戏,推箱子

次游戏是个推箱子第一关最简单的小游戏 
有详细注释,下面是做出来的游戏界面

做出来的游戏界面

这里写图片描述 
游戏操作说明和功能说明:

  1. 按wasd控制小人的上下左右移动。
  2. 按 r 重新开始游戏
  3. 游戏开始有操作介绍
  4. 游戏结束有胜利提示

游戏原理分析

  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()函数
   
   
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
  • 函数名称: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}
 }; 
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

定义全局变量:

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

声明函数原型:

int count1();     // 星星的个数
 int count2();    // 箱子到了星星的位置的个数

 int up();        
 int down();
 int left();
 int right();

 int shuchu();
 int find();          //找到自己
 int zhujiemian();    //输出主界面
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

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;
 }
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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

 //制作主界面
int zhujiemian()
 {
     printf("*************************\n"
            "****请按任意键游戏开始~*****\n"
            "****制作:菜学匠************\n"
            "****请按wasd 控制上下左右****\n"
            "****请按r重新开始游戏*******\n"
            "*************************\n");
            }
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

 //找到自己的位置
 int find()
 {
     for(x=0; x<8; x++)
         for(y=0; y<8; y++)
         {
             if(map[x][y] == 3)
                 return 0;
         }
         return 0;
 }
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

//星星的个数
 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;
 }
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

接着来给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;
 } 
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

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

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;
         }
     }
 }
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

接下来给出整个完整的程序,经过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");
            }
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值