C语言编程实现的推箱子小游戏

此次打是单推动箱子第一拖累最简易的小游戏

游玩操作证和功力说明:

按wasd控制小口的前后左右运动。 按 r 重新开玩 游戏开始发生操作介绍
游戏结束起赢提示

一日游原理分析

打闹开始时之有限个数 = 箱子在片上之个数时 , 游戏胜利。 按 r
键重新开始玩, 我们需要定义一个量 map_1[8][8]
来保存游戏开始时之界面, 操作时我们将那个赋值给 map[8][8]
来拓展操作,以便更归位, 这里就是因此到了memcpy()函数。 wasd 代表上下左右
操作人活动, 分别欲为该定义一个函数。
判断人活动之前我们需要一定到人选之职位,这里我们为此find()函数来定义。

先是初步文件开始介绍:

#include#include//malloc()函数

#include//memcpy()函数

#include//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#include#include#includeint 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”);

}