您的位置:首页 > 编程语言 > C语言/C++

c语言实现的推箱子小游戏-1

2016-07-10 21:40 671 查看
本次游戏是个推箱子第一关最简单的小游戏

有详细注释,下面是做出来的游戏界面





游戏操作说明和功能说明:

按wasd控制小人的上下左右移动。

按 r 重新开始游戏

游戏开始有操作介绍

游戏结束有胜利提示

游戏原理分析

游戏开始时的星星个数 = 箱子在星星上的个数时 , 游戏胜利。

按 r 键重新开始游戏, 我们需要定义一个量 map_1[8][8] 来保存游戏初始时的界面, 操作时我们将其赋值给 map[8][8] 来进行操作,以便重新归位, 这里就用到了memcpy()函数。

wasd 代表上下左右 操作人物移动, 分别需要为其定义一个函数。

判断人物移动之前我们需要定位到人物的位置,这里我们用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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: