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");

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容