精华内容
下载资源
问答
  • C语言实现推箱子游戏

    万次阅读 多人点赞 2019-09-28 22:57:23
    很早就想过做点小游戏了,但是一直没有机会动手。今天闲来无事,动起手来。过程还是蛮顺利的,代码也不是非常难。今天给大家分享一下~ ...通过wasd键移动,规则的话就是推箱子的规则,也就不多说了。 二、代...

    很早就想过做点小游戏了,但是一直没有机会动手。今天闲来无事,动起手来。过程还是蛮顺利的,代码也不是非常难。今天给大家分享一下~

    一、介绍

    开发语言:C语言
    开发工具:Dev-C++ 5.11
    日期:2019年9月28日
    作者:ZackSock
    

    也不说太多多余的话了,先看一下效果图:
    在这里插入图片描述
    游戏中的人物、箱子、墙壁、球都是字符构成的。通过wasd键移动,规则的话就是推箱子的规则,也就不多说了。

    二、代码实现

    关于代码方面,我尽可能讲的细致。希望大家可以理解~

    (1)方法列表

    //主函数
    void main();
    
    //初始化一些数据
    initData();
    
    //在控制台上打印地图
    drawMap();
    
    //向上移动
    moveUp();
    
    //向左移动
    moveLeft()
    
    //向下移动
    moveDown()
    
    //向右移动
    moveRight();
    

    这几个方法都顾名思义,而且用意也非常明确,就initData可能不知道具体用处,但是没有什么大问题。唯一的问题就是,上左下右的顺序可能会逼死几个强迫症患者,哈哈。

    (2)参数列表

    为了方便,我把include和宏定义也放到参数列表当中

    //导入函数库
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    //宏定义
    #define WIDTH 8
    #define HEIGHT 8
    
    //定义地图数组,二维数组有两个维度,而地图也是二维的矩形
    int map[HEIGHT][WIDTH] = {
    	{0, 0, 1, 1, 1, 0, 0, 0},
    	{0, 0, 1, 4, 1, 0, 0, 0},
    	{0, 0, 1, 0, 1, 1, 1, 1},
    	{1, 1, 1, 3, 0, 3, 4, 1},
    	{1, 4, 0, 3, 2, 1, 1, 1},
    	{1, 1, 1, 1, 3, 1, 0, 0},
    	{0, 0, 0, 1, 4, 1, 0, 0},
    	{0, 0, 0, 1, 1, 1, 0, 0} 
    };
    
    //人的位置,在二维地图中,我们可以用坐标表示一个人的位置,就好比经纬度
    int x, y;
    
    //箱子的个数,推箱子肯定要有箱子嘛。
    int boxs;
    

    这里参数不多,其中横为x,纵为y,另外这里再规定一下map的一些东西:

    /**
    *	0	表示空
    *	1	表示墙
    *	2	表示人
    *	3	表示箱子
    *	4	表示目的地(球)
    *	5	表示已完成的箱子
    */
    

    (3)函数具体分析

    接下来我们一个一个函数来分析。

    1、main函数
    int main(int argc, char *argv[]) {
    	char direction;		//存储键盘按的方向 
    	initData();			//初始化一些数据
    	
    	//开始游戏的循环,这里是个死循环,每按一次按钮循环一次
    	while(1){
    		//每次循环的开始清除屏幕
    		system("cls");
    		//绘画地图
    		drawMap();
    
    		//判断,当boxs的数量0时,!0为真,然后走break跳出循环(结束游戏) 
    		if(!boxs){
    			break;
    		}
    		
    		//键盘输入方向,这里使用getch,因为getch读取字符不会显示在屏幕上
    		direction = getch();
    		
    		//用switch判断用户输入的方向
    		switch(direction){
    			case 'w':
    				//按w时,调用向上移动函数
    				moveUp();
    				break;
    			case 'a':
    				//按a时,调用向左移动函数
    				moveLeft(); 
    				break;
    			case 's':
    				moveDown();
    				break;
    			case 'd':
    				moveRight();
    				break; 
    		}
    	}  
    	//当跳出循环时,运行该语句,游戏结束
    	printf("恭喜你完成游戏!※");
    	return 0;
    }
    

    我大概说一下流程,循环外面没有什么特别的。initData()只是一些简单数据的初始化,不需要太在意。循环中大致流程如下:

    • 清除屏幕
    • 绘制地图
    • 判断游戏是否结束
    • 对用户按下的按钮进行反馈

    进入循环体,先清除屏幕,再绘制地图,然后再判断游戏是否结束。可能大家对这个顺序不是很理解,这里我们先不考虑判断游戏结束的问题。我们把清屏和绘制地图合在一起,简称“重绘地图”,而游戏结束的判断先不考虑,那么流程就简化为“重绘地图 + 响应用户的操作”。简单来说就是,用户按一下按钮,我改变一下地图。

    2、initData()

    void initData(){
    	int i, j;
    	
    	//加载数据时让用户等待,一般情况加载数据比较快
    	printf("游戏加载中,请稍后........."); 
    	
    	//遍历地图中的数据
    	for(i = 0; i < HEIGHT; i++){
    		for(j = 0; j < WIDTH; j++){
    			//遍历到2(人)时,记录人的坐标。x, y是前面定义的全局变量
    			if(map[i][j] == 2){
    				x = j;
    				y = i;
    			} 
    			//遍历到3时,箱子的数目增加。boxs是前面定义的全局变量 
    			if(map[i][j] == 3){
    				boxs++;
    			}
    		}
    	} 
    }
    

    这个方法很简单,就是遍历地图,然后初始化人的位置和箱子的个数。这里有一点要注意一下,就是到底内层循环是WIDTH还是外层循环是WIDTH。在这里插入图片描述
    如图,在遍历过程中。外层循环控制行数,即HEIGHT。那么内层循环应该是WIDTH。

    3、drawMap()

    void drawMap(){
    	int i, j;
    	for(i = 0; i < WIDTH; i++){
    		for(j = 0; j < HEIGHT; j++){
    			switch(map[i][j]){
    				case 0:
    					printf("  ");
    					break;
    				case 1:
    					printf("■");
    					break;
    				case 2:
    					printf("♀");
    					break;
    				case 3:
    					printf("◆");
    					break;
    				case 4:
    					printf("●");
    					break;
    				case 5:
    					printf("★");
    					break; 
    			}
    		}
    		printf("\n");
    	}
    }
    

    这里也非常简单,变量map中的元素,然后通过switch判断应该输出的内容。然后内层循环每走完一次就换行。

    4、moveUp()

    这个函数内容有点多,想讲一下大概思路:

    向上移有两种情况
    1、前面为空白
    	这种情况有两个步骤
    	(1)将人当前的位置设置为空白(0),
    	(2)再讲人前面的位置设置为人(22、前面为箱子
    	当前面为箱子时有三种情况
    	1、箱子前面为空白
    		移动人和箱子,这个操作有三个步骤
    		(1)将人当前位置设置为空(0)
    		(2)将箱子位置设置为人(2)
    		(3)将箱子前面设置为箱子(32、箱子前面为墙
    		这种情况不需要做任何操作
    	3、箱子前面为终点
    		这种情况有四个个步骤
    		(1)将人的位置设置为空(0)
    		(2)将箱子的位置设置为人(2)
    		(3)将终点位置设置为★(5)
    		(4)箱子boxs的数量减一
    3、前面为墙
    	这种情况最简单,不需要做任何操作
    4、前面为终点
    	我这里没有考虑太多,这种情况不做操作。(如果更换地图的话可能需要修改代码)
    

    具体代码如下,解析我全写在注释里面:

    void moveUp(){
    	//定义变量存放人物上方的坐标
    	int ux, uy; 
    	
    	//当上方没有元素时,直接return	(其实人不可能在边缘)
    	if(y == 0){
    		return;
    	}
    	
    	//记录上方坐标,x为横,y为纵,所有ux = x, uy = y - 1;
    	ux = x;
    	uy = y - 1; 
    	
    	//上方为已完成的箱子
    	if(map[uy][ux] == 5){
    		return;
    	} 
    	//假设上方为墙,直接return,这个和上面的判断可以合在一起,这里为了看清楚分开写 
    	if(map[uy][ux] == 1){
    		return;
    	}
    	
    	//假设上方为箱子
    	if(map[uy][ux] == 3){
    		//判断箱子上方是否为墙 
    		if(map[uy - 1][ux] == 1){
    			return;
    		}
    		
    		//判断箱子上方是否为终点
    		if(map[uy - 1][ux] == 4){
    			//将箱子上面内容赋值为5★ 
    			map[uy - 1][ux] = 5;
    			map[uy][ux] = 0;
    					
    			//箱子的数目减1	
    			boxs--; 
    		}else{
    			//移动箱子
    			map[uy - 1][ux] = 3;
    		}
    	}
    	//当上面几种return的情况都没遇到,人肯定会移动,移动操作如下
    	map[y][x] = 0;
    	map[uy][ux] = 2;
    	//更新人的坐标
    	y = uy; 
    } 
    

    这是一个方向的,其它方向要考虑的问题也和前面一样,我也就不赘述了。

    6、moveLeft()

    这里大致都和上面一样,就是在记录左边坐标时,应该应该是lx = x - 1。

    void moveLeft(){
    	//定义变量存放人物左边的坐标
    	int lx, ly; 
    	
    	//当左边没有元素时,直接return	
    	if(x == 0){
    		return;
    	}
    	
    	//记录左边坐标
    	lx = x - 1;
    	ly = y; 
    	
    	//左边为已完成方块
    	if(map[ly][lx] == 5){
    		return;
    	} 
    	
    	//假设左边为墙,直接return 
    	if(map[ly][lx] == 1){
    		return;
    	}
    	
    	//假设左边为箱子
    	if(map[ly][lx] == 3){
    		//判断箱子左边是否为墙 
    		if(map[ly][lx - 1] == 1){
    			return;
    		}
    		
    		//判断箱子左边是否为球
    		if(map[ly][lx - 1] == 4){
    			//将箱子左边内容赋值为5★ 
    			map[ly][lx - 1] = 5;
    			map[ly][lx] = 0;
    		
    			//箱子的数目减1 
    			boxs--; 
    		}else{
    			//移动箱子 
    			map[ly][lx - 1] = 3; 
    		}
    	}
    	map[y][x] = 0;
    	map[ly][lx] = 2;
    	x = lx; 
    }
    

    7、moveDown()

    这里在判断边界时,判断的是 y == HEIGHT - 1。

    void moveDown(){
    	//定义变量存放人物下方的坐标
    	int dx, dy; 
    	
    	//当下方没有元素时,直接return	
    	if(y == HEIGHT - 1){
    		return;
    	}
    	
    	//记录下方坐标
    	dx = x;
    	dy = y + 1; 
    	
    	//下方为已完成方块
    	if(map[dy][dx] == 5){
    		return;
    	} 
    	
    	//假设下方为墙,直接return 
    	if(map[dy][dx] == 1){
    		return;
    	}
    	
    	//假设下方为箱子
    	if(map[dy][dx] == 3){
    		//判断箱子下方是否为墙 
    		if(map[dy + 1][dx] == 1){
    			return;
    		}
    		
    		//判断箱子下方是否为球
    		if(map[dy + 1][dx] == 4){
    			//将箱子下面内容赋值为5★ 
    			map[dy + 1][dx] = 5;
    			map[dy][dx] = 0;
    			
    			//箱子的数目减1 
    			boxs--; 
    		}else{
    			//移动箱子
    			map[dy + 1][dx] = 3; 
    		}
    	}
    	map[y][x] = 0;
    	map[dy][dx] = 2;
    	y = dy; 
    }
    

    8、moveRight()

    这里也没什么特别说的:

    void moveRight(){
    	//定义变量存放人物右边的坐标
    	int rx, ry; 
    	
    	//当右边没有元素时,直接return	
    	if(x == WIDTH - 1){
    		return;
    	}
    	
    	//记录右边坐标
    	rx = x + 1;
    	ry = y; 
    	
    	//右边为已完成方块
    	if(map[ry][rx] == 5){
    		return;
    	} 
    	
    	//假设右边为墙,直接return 
    	if(map[ry][rx] == 1){
    		return;
    	}
    	
    	//假设右边为箱子
    	if(map[ry][rx] == 3){
    		//判断箱子右边是否为墙 
    		if(map[ry][rx + 1] == 1){
    			return;
    		}
    		
    		//判断箱子左边是否为球
    		if(map[ry][rx + 1] == 4){
    			//将箱子右边内容赋值为5★ 
    			map[ry][rx + 1] = 5;
    			map[ry][rx] = 0;
    			
    			//箱子的数目减1 
    			boxs--; 
    		}else{
    			//移动箱子 
    			map[ry][rx + 1] = 3; 
    		}
    	}
    	map[y][x] = 0;
    	map[ry][rx] = 2;
    	x = rx; 
    }
    

    三、总结

    现在再回顾开始的运行步骤

    • 清除屏幕
    • 绘制地图
    • 判断游戏是否结束
    • 对用户按下的按钮进行反馈

    这里把判断游戏是否结束放到了重绘图像后面,因为在对用户进行反馈的时候只是改变了map中的数据,实际上最后一个箱子推到终点的图像还没有显示出来,所以要在重绘之后再判断是否结束游戏。

    代码有很多冗余的地方,一方面是想大家更好的理解,还有一方面出于懒。哈哈,代码运行起来没有问题,源码和源程序我会上传,有兴趣的可以下下来,或者直接复制代码运行也是没问题的。
    百度云连接如下:
    链接:https://pan.baidu.com/s/1pwEKt3VTKmssDgU6dLx0pg 提取码:4o9v

    展开全文
  • 本文实例为大家分享了C语言实现推箱子游戏的具体代码,供大家参考,具体内容如下 代码在vs2013上测试运行。 思想: 1):地图用二维数组实现,箱子、墙壁、人等事物用不同的数字表示,遍历二维数组,遇到不同的数字...
  • 主要为大家详细介绍了C语言实现推箱子小游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要介绍了C语言实现推箱子游戏的代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要为大家详细介绍了C语言实现推箱子游戏的地图编辑器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • c语言实现推箱子小游戏

    千次阅读 多人点赞 2019-02-28 13:25:50
    c语言实现推箱子小游戏 下面是实现推箱子小游戏的全部代码 这个推箱子小游戏采用文件操作,通过图形库实现了图形界面,相对来说更具有玩游戏的感觉,给人以视觉盛宴。 说笑了,好了大家可以好好的看一下源代码 本...

    c语言实现推箱子小游戏

    先让大家看一下效果

    在这里插入图片描述
    在这里插入图片描述

    下面是实现推箱子小游戏的全部代码

    这个推箱子小游戏采用文件操作,通过easy_x图形库实现了图形界面,相对来说更具有玩游戏的感觉,给人以视觉盛宴。

    说笑了,好了大家可以好好的看一下源代码
    本游戏所需的关卡文件在最后面,大家可以看一下
    另外运行此小游戏,大家可能还需要安装easy_x图形库文件,这里我分享以下easy_x的安装文件链接,由于时间关系,本游戏只设计了三关,在闯关成功后,可以弹出闯关成功的提示

    链接:https://pan.baidu.com/s/1zvMlFfLkKtU0sIwSS2KU2g
    提取码:q3n8

    关于本游戏的resource.h ,这个是需要我们导入图片后,才会有的头文件,下面是关于本游戏的图片素材,我会演示一下VS 如何导入图片

    链接:https://pan.baidu.com/s/1arc-bL-x6GG3Yrtfb70GeQ
    提取码:4xx5
    上面的图片链接已失效,我重新发了一份在下面
    链接:https://pan.baidu.com/s/1iiyBzp04YQ_bhycJOAx6dw
    提取码:4n4n
    复制这段内容后打开百度网盘手机App,操作更方便哦
    上面是图片素材的百度网盘链接
    下面是VS 导入图片的具体方法:
    在这里插入图片描述
    右键资源文件 选择添加->资源
    然后,出现在这里插入图片描述
    选择 Bitmap(位图),选择导入,找到你图片素材的存储路径,
    在这里插入图片描述
    这时你会发现素材路径下什么都没有,别急,我们需要把上面图片中的位图换成
    在这里插入图片描述
    就会出现图片素材了,全部选中,点击打开,
    然后就会出现 resource.h这个头文件了

    1.推箱子总体概述

    1.1游戏总体设计

    此游戏本着娱乐为目的,游戏界面简单,操作容易,游戏者可以在游戏中锻炼反应速度与灵敏速度,在游戏中设置有关卡,级别由低到高,一关更比一关难。

    1.2功能模块规划

    在该游戏中共设计了三个模块:

    (1)初始化模块,

    对游戏界面进行初始化,包含两个函数,分别为GameInitMap函数,进行图片的加载,GamePaint,进行贴图,从而完成对地图的绘制,在此游戏中,不同的数字代表贴不同的图。

    (2)游戏操作模块,

    由GamePlay构成玩家通过对小人的操作使小人能够操作木箱到各个位置

    (3)游戏判断模块,

    由GameJudgement构成,通过对地图的遍历,观察是否有箱子未推到目的地,进行游戏是否结束的判断。

    2程序说明

    2.1 按钮设计

    游戏中通过键盘输入来操作小人移动箱子完成游戏任务,键盘输入按钮及其效果如下
    (1)上:通过按w或W或 来移动小人往上移动。
    (1)下:通过按s或S或 来移动小人往下移动。
    (1)左:通过按a或A或 来移动小人往左移动。
    (1)右:通过按d或D或 来移动小人往右移动。

    2.2地图的绘制形成—初始化模块

    (1)二维数组数字的意义
     地图是以二维数组的形式进行存储的,不同的数字有着不同的含义。我将0~9解读为不同的图形。
     0代表地图内的空位;
     1代表墙壁;
     3’代表目的地;
     4代表箱子;
     5代表小人;
     7代表箱子在目的地;
     8代表人在目的地。
    
    (2)加载图片与贴图

    本游戏地图的绘制采用Easyx library进行游戏界面的加载与绘制,先声明IMAGE变量, loadimage函数用来进行图片的加载,然后用文件操作,从Map.txt读取地图信息,通过双层循环进行遍历,根据对应位置的Map二维数组的值来选择不同的图片进行贴图。

    2.3游戏操作模块

    2.3.1关卡设计

    本游戏采用文件操作进行关卡的设计,地图信息存储在Map.txt文档中,当一个关卡通过判断通过时,地图通过文件操作进行更新,直到所有关卡完成,弹出闯关成功窗口。
    关卡设计

    2.3.2小人与箱子移动

    本游戏移动只有正移动,小人上下移动归结起来是一个判断的算法。判断都是通过小人前面是否是空位,箱子,或者是墙。如果没有,就移动;有的话,在判断箱子是否可以移动。最后讨论箱子推过的,小移动的图形变化,重新绘制地图。:

    2.4游戏判断模块

    游戏通过双层for循环进行地图遍历,观察地图上是否有没有推到目的地的箱子,并返回结果,从而对这一关游戏与游戏是否结束进行判断,全部代码如下:

    #include <stdio.h>
    #include <conio.h> //控制台输入输出的头文件
    #include <graphics.h> //头文件图形库
    #include "resource.h"
    int Map[8][8] = {
    0, 0, 0, 1, 1, 1, 0, 0,
    0, 0, 0, 1, 3, 1, 0, 0,
    1, 1, 1, 1, 0, 1, 0, 0,
    1, 3, 4, 0, 4, 1, 1, 1,
    1, 1, 1, 5, 4, 0, 3, 1,
    0, 0, 1, 4, 1, 1, 1, 1,
    0, 0, 1, 3, 1, 0, 0, 0,
    0, 0, 1, 1, 1, 0, 0, 0
    };
    void GameInitMap();//加载图片
    void GamePaint(); //贴图
    void GamePlay(); //操作
    int GameJudgement(); //判断游戏是否结束
    IMAGE BackImage, Wall;  //背景  墙
    IMAGE Box, dBox; //箱子 箱子推到目的地
    IMAGE Point; //目的地
    IMAGE Person; //人
    void GameInitMap(int live) //给出关卡数 用来判断是第几关
    {	
    loadimage(&BackImage, L"jpg",MAKEINTRESOURCE(101), 550, 550);//背景
    loadimage(&Wall, L"jpg", MAKEINTRESOURCE(107), 69, 69);//墙壁
    loadimage(&Box, L"jpg", MAKEINTRESOURCE(103), 69, 69);//箱子
    loadimage(&Point, L"jpg", MAKEINTRESOURCE(106), 69, 69);//目的地
    loadimage(&dBox, L"jpg", MAKEINTRESOURCE(104), 69, 69);//箱子到达目的地
    loadimage(&Person, L"jpg", MAKEINTRESOURCE(105), 69, 69);//人物
    FILE *fp = fopen("Map.txt", "r");
    if (NULL == fp)  //如果打开失败  异常处理
    {
    	MessageBox(NULL, L"地图加载失败", NULL, NULL);
    	exit(0);
    }
    int FileOffset; // 文件的偏移
    FileOffset = 66 * (live - 1);
    fseek(fp, FileOffset, SEEK_SET);
    int i, j;
    char c;
    for (i = 0; i < 8; i++)
    {
    	for (j = 0; j < 8; j++)
    	{
    		c = fgetc(fp);
    		Map[i][j] = c - '0';
    	}
    }
    fclose(fp); //关闭文件  
    }
    void GamePaint()
    {
    for (int i = 0; i < 8; ++i)
    {
    	for (int j = 0; j < 8; ++j)
    	{
    		switch (Map[j][i])
    		{
    		case 0: //空地
    			break;
    		case 1: //墙壁
    			putimage(69 * i, 69 * j, &Wall);
    			break;
    		case 3://目的地
    			putimage(69 * i, 69 * j, &Point);
    			break;
    		case 4://箱子
    			putimage(69 * i, 69 * j, &Box);
    			break;
    		case 5://人物
    			putimage(69 * i, 69 * j, &Person);
    			break;
    		case 7://箱子在目的地上
    			putimage(69 * i, 69 * j, &dBox);
    			break;
    		case 8://人物在目的地上
    			putimage(69 * i, 69 * j, &Person);
    			break;
    		}
    	}
    }
    }
    /*
    0       空地
    1       墙壁
    3       目的地
    4       箱子
    5       人物
    7       箱子在目的地
    8       人在目的
    */
    int GameJudgement()
    {
    for (int i = 0; i < 8; i++)
    {
    	for (int j = 0; j < 8; j++)
    	{
    		if (Map[i][j] == 4) //判断 有没有落在空地上的箱子
    		{
    			return 1;  //游戏还没有结束
    		}
    	}
    }
    return 0;
    }
    
    void GamePlay()
    {
    	char ch; //用来获取键盘输入的信息
    	int x, y; //描述当前坐标
    	int live = 1; //描述关卡
    	GameInitMap(live); //贴图
    	while (true)
    	{
    		BeginBatchDraw();
    		cleardevice();
    		putimage(0, 0, &BackImage);
    		if (!GameJudgement()) //判断 每一关是否玩完了
    		{
    			live++;  // 进入下一关
    			if (4 == live) //
    			{
    				GamePaint();// 绘图
    				FlushBatchDraw(); //批量绘图 防闪屏
    				MessageBox(GetHWnd(), L"闯关成功\r\n", L"闯关提示", MB_OK);
    				// 弹出对话框 
    				FlushBatchDraw();
    				Sleep(5000); 
    				closegraph(); //关闭窗口
    				exit(0); //结束程序
    			}
    			GameInitMap(live);
    		} 
    		//批量绘图结束
    		GamePaint();
    		EndBatchDraw();
    		for (x = 0; x < 8; x++)
    		{
    			for (y = 0; y < 8; y++)
    			{	//如果人在目的地 或者 人在空地
    				if (Map[x][y] == 5 || Map[x][y] == 8)
    				{
    					break;
    				}
    			}
    			if (Map[x][y] == 5 || Map[x][y] == 8)
    			{
    				break;
    			}
    		}
    		ch = getch(); //获取键盘消息
    		//人在 Map[x][y]
    		switch (ch)
    		{
    		case 'w': 
    		case 'W':
    		case 72://向上
    			if (Map[x - 1][y] == 0 || Map[x - 1][y] == 3)
    			{
    				Map[x][y] -= 5; 
    				Map[x - 1][y] += 5; 
    			}
    			else if (Map[x - 1][y] == 4 || Map[x - 1][y] == 7)
    			{
    				if (Map[x - 2][y] == 0 || Map[x - 2][y] == 3)
    				{
    					Map[x - 2][y] += 4;
    					Map[x - 1][y] += 1;
    					Map[x][y] -= 5; 
    				}
    			}
    			break;
    		case 'a':
    		case 'A':
    		case 75://向左
    			if (Map[x][y - 1] == 0 || Map[x][y - 1] == 3)
    			{
    				Map[x][y] -= 5;
    				Map[x][y - 1] += 5;
    			}
    			else if (Map[x][y - 1] == 4 || Map[x][y - 1] == 7)
    			{
    				if (Map[x][y - 2] == 0 || Map[x][y - 2] == 3)
    				{
    					Map[x][y - 2] += 4;
    					Map[x][y - 1] += 1;
    					Map[x][y] -= 5;
    				}
    			}
    			break;
    		case 's':
    		case 'S':
    		case 80:  // 往下
    			if (Map[x + 1][y] == 0 || Map[x + 1][y] == 3)
    			{
    				Map[x][y] -= 5;
    				Map[x + 1][y] += 5;
    			}
    			else if (Map[x + 1][y] == 4 || Map[x + 1][y] == 7)
    			{
    				if (Map[x + 2][y] == 0 || Map[x + 2][y] == 3)
    				{
    					Map[x + 2][y] += 4;
    					Map[x + 1][y] += 1;
    					Map[x][y] -= 5;
    				}
    			}
    			break;
    		case 'd':
    		case 'D':
    		case 77:  //往右
    			if (Map[x][y + 1] == 0 || Map[x][y + 1] == 3)
    			{
    				Map[x][y] -= 5;
    				Map[x][y + 1] += 5;
    			}
    			else if (Map[x][y + 1] == 4 || Map[x][y + 1] == 7)
    			{
    				if (Map[x][y + 2] == 0 || Map[x][y + 2] == 3)
    				{
    					Map[x][y + 2] += 4;
    					Map[x][y + 1] += 1;
    					Map[x][y] -= 5;
    				}
    			}
    			break;
    		}
    	}
    }
    int main()
    {
    	initgraph(550, 550);
    	GamePlay();
    	return 0;
    }
    

    关卡文件的配置
    请在项目文件下建立 “地图Map.txt"文件,并将下面内容复制进去

    	0001110000013100111101001340411111154031001411110013100000111000
    	0111111101000001010343011104540110034301100000011111111100000000
    	0111100001001000010310001145100010401111100300011111000100011111
    
    展开全文
  • C语言实现推箱子项目

    2020-08-18 16:04:36
    主要为大家详细介绍了C语言实现推箱子项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 今天来介绍如何用C语言写一个简单的小游戏,叫做“小老鼠推箱子”。虽然游戏的编写过程不复杂,但是我觉得能够从中找到自己对于编程的不足和完善自己的编程思维是最重要的。游戏代码不多,所以直接写在一个c文件中。...
  • c语言实现推箱子游戏完整代码
  • 推箱子游戏C语言实现
  • C语言实现推箱子游戏,亲自写的源代码.
  • C语言实现推箱子.pdf

    2021-09-19 13:04:03
    C语言实现推箱子.pdf
  • C语言实现推箱子

    2020-04-18 12:54:35
    C语言实现推箱子一、工具介绍二、代码实现 在网上学习并且自己理解着完成这个推箱子的小游戏,来分享一下 一、工具介绍 1、easyx图形库工具 2、vs2013及以上都可以 二、代码实现 1、用到的头文件 #include<stdio...

    在网上学习并完成这个推箱子的小游戏,记录下来

    一、工具介绍

    1、easyx图形库工具
    2、vs2013及以上都可以

    二、代码实现

    1、用到的头文件

    #include<stdio.h>
    #include <stdlib.h>
    #include<easyx.h>
    #include"resource.h"
    #include<conio.h>
    #pragma comment(lib,"winmm.lib")

    2、初始化地图,定义了一个二维数组,利用二维数组来对地图上的元素实现定义(如:0为空地,1是围墙,2是人物,3是目的地,4是箱子,5是箱子进入目的地,6是人进入目的地)

     int arr[10][10] = 
     {  
         {1,1,1,1,1,1,1,1,1,1},
         {1,0,0,0,0,0,0,0,0,1},
         {1,0,0,0,0,0,0,0,0,1},
         {1,0,0,0,0,0,4,4,0,1},
         {1,0,0,0,0,2,3,3,0,1},
         {1,0,0,0,0,0,0,0,0,1},
         {1,0,0,0,0,0,0,0,0,1},
         {1,0,0,0,0,0,0,0,0,1},
         {1,0,0,0,0,0,0,0,0,1},
         {1,1,1,1,1,1,1,1,1,1},
      };
    
     int map[10][10];
     int map1[10][10];
     IMAGE image[6];//图片函数 定义图片数组
     int life = 0;//定义血量

    3、对游戏初始化,使定义的全局变量等于定义的二维数组

    void init()
    {
    for (int i = 0; i < 10; i++)
    {  
       for (int j = 0; j < 10; j++)
        {
          map[i][j] = arr[i][j];
        }
     }
    
    }

    4、利用贴图函数对游戏贴图,

     void drawmap()
     {
      BeginBatchDraw();//开始批量贴图
      putimage(0, 0, &image[0]);//贴空地的图片
      for (int i = 0; i < 10; i++)//遍历地图,寻找元素
      {
       for (int j = 0; j < 10; j++)
       {
        switch (map[i][j])
        {
        case 1: putimage(50 * j, 50 * i, &image[1]); break;//围墙
        case 2: putimage(50 * j, 50 * i, &image[2]); break;//人
        case 3: putimage(50 * j, 50 * i, &image[3]); break;//目的地
        case 4: putimage(50 * j, 50 * i, &image[4]); break;//箱子
        case 5: putimage(50 * j, 50 * i, &image[5]); break;//箱子进入目的地
        case 6: putimage(50 * j, 50 * i, &image[2]); break;//人进目的地
        }
       }
      }
      EndBatchDraw();//结束贴图
     }

    5、悔棋的函数(就是保存上一步各个元素的位置)

        void huiqi()//返回上一步
     {
      for (int i = 0; i < 10; i++)
      {
       for (int j = 0; j < 10; j++)
       {
        map1[i][j] = map[i][j];
       }
      }
     }

    6、移动的函数,主要的思想就是对人和箱子下一步的位置进行判断,通过改变值,来使人物和箱子移动

    void play()
    {
      int i, j;
      for (int n = 0; n < 10; n++)//遍历数组,找人
      {
       for (int m = 0; m < 10; m++)
        if (map[n][m] == 2 || map[n][m] == 6)
        {
         i = n;
         j = m;
        }
      }
      char key = _getch();
      switch (key)//判断按键
      {
      case 'r':case 'R':
       for (int i = 0; i < 10; i++)
       {
        for (int j = 0; j < 10; j++)
        {
         map[i][j] = map1[i][j];
        }
       }
       break;
         case'w':case'W': //按w键
       huiqi();//每次按下w键,记录当前位置后,在进行移动
       if (map[i - 1][j] == 0)//人面前是空地
       {
        map[i - 1][j] = 2;//人往前走
        if (map[i][j] == 6)
         map[i][j] = 3;
        else
         map[i][j] = 0;
       }
          else if (map[i - 1][j] == 3)//人面前是目的地
       {
        map[i - 1][j] = 6;
        if (map[i][j] == 6)//人站在目的地
         map[i][j] = 3;
        else//人站在空地上
         map[i][j] = 0;
       }
        else if (map[i - 1][j] == 4)//人前是空地上的箱子
       {
        if (map[i - 2][j] == 0)//箱子和人向前走遇见的是空地
        {
         map[i - 2][j] = 4;
         map[i - 1][j] = 2;
         if (map[i][j] == 6)//对人原位置进行判断
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
        else if (map[i - 2][j] == 3)//遇见的是目的地
        {
         map[i - 2][j] = 5;
         map[i - 1][j] = 2;
         if (map[i][j] == 6)
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
       }  
    
    }
       else if (map[i - 1][j] == 5)//人前是在目的地的箱子
       {
        if (map[i - 2][j] == 0)//箱子前是空地
        {
         map[i - 2][j] = 4;
         map[i - 1][j] = 6;
         if (map[i][j] == 6)
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
        else if (map[i - 2][j] == 3)//箱子前是目的地
        {
         map[i - 2][j] = 5;
         map[i - 1][j] = 6;
         if (map[i][j] == 6)
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
       }
       break;
         case's':case'S':
       huiqi();//每次按下s键,记录当前位置后,在进行移动
       if (map[i + 1][j] == 0)//人面前是空地
       {
        map[i + 1][j] = 2;//人往前走
        if (map[i][j] == 6)
         map[i][j] = 3;
        else
         map[i][j] = 0;
       }
          else if (map[i + 1][j] == 3)//人面前是目的地
       {
        map[i + 1][j] = 6;
        if (map[i][j] == 6)//人站在目的地
         map[i][j] = 3;
        else//人站在空地上
         map[i][j] = 0;
     }
        else if (map[i + 1][j] == 4)//人前是箱子
       {
        if (map[i + 2][j] == 0)//箱子和人向前走
        {
         map[i + 2][j] = 4;
         map[i + 1][j] = 2;
         if (map[i][j] == 6)//对人原位置进行判断
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
            else if (map[i+ 2][j] == 3)
        {
         map[i + 2][j] = 5;
         map[i + 1][j] = 2;
         if (map[i][j] == 6)
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
       }
          else if (map[i + 1][j] == 5)
       {
        if (map[i + 2][j] == 0)
        {
         map[i + 2][j] = 4;
         map[i + 1][j] = 6;
         if (map[i][j] == 6)
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
        else if (map[i + 2][j] == 3)
        {
         map[i+ 2][j] = 5;
         map[i+ 1][j] = 6;
         if (map[i][j] == 6)
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
       }
       break;
         case'A':case'a':
       huiqi();//每次按下a键,记录当前位置后,在进行移动
       if (map[i][j - 1] == 0)//人面前是空地
       {
        map[i][j - 1] = 2;//人往前走
        if (map[i][j] == 6)
         map[i][j] = 3;
        else
         map[i][j] = 0;
       }
       else if (map[i][j - 1] == 3)//人面前是目的地
       {
        map[i][j - 1] = 6;
        if (map[i][j] == 6)//人站在目的地
         map[i][j] = 3;
        else//人站在空地上
         map[i][j] = 0;
       }
          else if (map[i][j-1] == 4)//人前是箱子
       {
        if (map[i][j - 2] == 0)//箱子和人向前走
        {
         map[i][j - 2] = 4;
         map[i][j - 1] = 2;
         if (map[i][j] == 6)//对人原位置进行判断
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
        else if (map[i][j - 2] == 3)
        {
         map[i][j - 2] = 5;
         map[i][j - 1] = 2;
         if (map[i][j] == 6)
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
       }
          else if (map[i ][j-1] == 5)
       {
        if (map[i][j-2] == 0)
        {
         map[i ][j-2] = 4;
         map[i ][j-1] = 6;
         if (map[i][j] == 6)
          map[i][j] =3;
         else
          map[i][j] = 0;
        }
        else if (map[i][j-2] == 3)
        {
         map[i ][j-2] = 5;
         map[i][j-1] = 6;
         if (map[i][j] == 6)
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
       }
       break;
         case'd':case'D':
       huiqi();//每次按下d键,记录当前位置后,在进行移动
       if (map[i][j + 1] == 0)//人面前是空地
       {
        map[i][j + 1] = 2;//人往前走
        if (map[i][j] == 6)
         map[i][j] = 3;
        else
         map[i][j] = 0;
       }
       else if (map[i][j + 1] == 3)//人面前是目的地
       {
        map[i][j + 1] = 6;
        if (map[i][j] == 6)//人站在目的地
         map[i][j] = 3;
        else//人站在空地上
         map[i][j] = 0;
       }
          else if (map[i][j + 1] == 4)//人前是箱子
       {
        if (map[i][j + 2] == 0)//箱子和人向前走
        {
         map[i][j + 2] = 4;
         map[i][j + 1] = 2;
         if (map[i][j] == 6)//对人原位置进行判断
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
        else if (map[i ][j+2] == 3)
        {
         map[i ][j+2] = 5;
         map[i ][j+1] = 2;
         if (map[i][j] == 6)
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
       }
          else if (map[i][j + 1] == 5)
       {
        if (map[i][j + 2] == 0)
        {
         map[i][j + 2] = 4;
         map[i][j + 1] = 6;
         if (map[i][j] == 6)
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
        else if (map[i][j + 2] == 3)
        {
         map[i][j + 2] = 5;
         map[i][j + 1] = 6;
         if (map[i][j] == 6)
          map[i][j] = 3;
         else
          map[i][j] = 0;
        }
       }
       break;
      }
     }
    
    

    7、判断输赢的函数

     void win()//判断输赢
     {
      int number = 0;
      for (int i = 0; i < 10; i++)
      {
       for (int j = 0; j < 10; j++)
       {
        if (map[i][j] == 4)//说明地图上还有箱子
         number++;
       }
      }
      for (int i = 0; i < 10; i++)
      {
       for (int j = 0; j < 10; j++)
       {
        if (map[i][j] == 4)//说明地图上还有箱子
        {
         if (map[i - 1][j] == 1 || map[i + 1][j] == 1)
         {
          if (map[i][j - 1] == 1 || map[i][j + 1] == 1)
          {
           life = 2;//loss
          }
         }
        }
       }
      }
      if (number == 0)
      {
       life = 1;//win
      }
     }

    8、在主函数中的调用,用loadimage加载的图片可以自己在网上找,并把它们保存在自己的项目中,方便调用

    int main()
    {
        initgraph(500, 500);
        loadimage(&image[0], L"背景.PNG", 500, 500);//背景
        loadimage(&image[1], L"墙.PNG", 50, 50);//50为加载图片x的长度和y的长度
        loadimage(&image[2], L"推人.PNG", 50, 50);
        loadimage(&image[3], L"目的地.PNG", 50, 50);
        loadimage(&image[4], L"箱子.png", 50, 50);
        loadimage(&image[5], L"箱子和目的地重合.PNG", 50, 50);
        init();
        drawmap();
        while (1)
        {
         play();
         drawmap();
         win();
         if (life == 1)
         {
          if (MessageBox(GetHWnd(), L"游戏胜利", L"是否继续", MB_YESNO) == IDYES)//如果按下是,进入if语句
          {
           life = 0;//下次循环不会进入if(语句)
           level++;
           if (level == 3)//end
           {
            if (MessageBox(GetHWnd(), L"最后一关结束", L"是否回到第一关", MB_YESNO) == IDYES)
            {
             level = 0;
             init();
             drawmap();
            }
            else return 0;
           }
           init();
           drawmap();
          }
          else
           return 0;
         }
         if (life == 2)//游戏失败
         {
          life = 0;
          if (MessageBox(GetHWnd(), L"游戏失败", L"是否重新开始", MB_YESNO) == IDYES)//如果按下是,进入if语句
          {
           init();
           drawmap();
          }     
         }
        }
        system("pause");
        closegraph();
        return 0;
       }

    本文件用作留念,可以适当用来参考

    展开全文
  • 推箱子游戏c语言实现

    2017-04-17 11:18:25
    控制台推箱子游戏
  • C语言实现推箱子游戏完整代码

    千次阅读 多人点赞 2020-12-17 17:28:43
    C语言实现推箱子游戏完整代码 前言 自己做的,可能有些代码不够工整,或者有些小问题,但游戏的基本操作是可以实现的 代码效果 代码一共分为8个部分,4个控制上下左右移动,2个判断输赢,1个统计归为的个数,一个...

    C语言实现推箱子游戏完整代码

    前言

    自己做的,可能有些代码不够工整,或者有些小问题,但游戏的基本操作是可以实现的

    代码效果

    在这里插入图片描述

    代码一共分为8个部分,4个控制上下左右移动,2个判断输赢,1个统计归为的个数,一个作图。

    手动设置地图

    用’0’表示空格,“1”表示墙,“2”表示箱子,“3”表示人,“4”表示终点

    这样可以提高代码的移植性

    如需改为手动输入地图可以直接定义一个二维数组,在给他赋值就可以了

    int screen[9][11]={
    	{0,1,1,1,1,1,1,1,1,0,0},
    	{0,1,0,0,0,1,0,0,0,1,0},
    	{0,1,0,2,2,2,2,2,0,1,0},
    	{0,1,0,2,0,2,0,2,0,1,1},
    	{0,1,0,0,0,3,0,0,2,0,1},
    	{1,1,0,1,1,1,1,0,2,0,1},
    	{1,0,4,4,4,4,4,1,0,0,1},
    	{1,0,4,4,4,4,4,0,0,1,1},
    	{1,1,1,1,1,1,1,1,1,1,0}
    };//定义为全局变量 (地图) i表示行,j表示列 
    

    计算地图中终点的个数

    这一步主要是为了后面判断游戏输赢的

    int cum(){
    	int i,j,k=0;
    	for(i=0;i<9;i++){
    		for(j=0;j<11;j++){
    			if(screen[i][j]==2){
    				k++;
    			}
    		}
    	}//遍历整个二维数组
    	return k;
    }//计算地图中有多少个终点
    

    打印地图函数

    通过switch函数对二维数组中的值进行可视化,也就是画出地图

    注意:这里还定义出了6和7,是通过重叠的关系来算的,就是箱子在终点上,这个位置又有箱子又有终点2个标识,所以让两个的数值加起来,方便理解,也方便后面的计算

    void print(){
    	int i,j;
    	printf("请用wsad代表上下左右来进行游戏\n");
    	for(i=0;i<9;i++){
    		for(j=0;j<11;j++){
    			switch(screen[i][j]){
    				case 0:
    					printf("  ");//空 
    					break;
    				case 1:
    					printf("■");//墙 
    					break;
    				case 2:
    					printf("★");//箱子 
    					break;
    				case 3:
    					printf("♀");//人 
    					break;
    				case 4:
    					printf("○");//终点 
    					break;
    				case 6:
    					printf("★");
    					break;//箱子和终点 
    				case 7://人和终点显示人
    					printf("♀");
    					break; 
    			}
    		}
    		printf("\n");
    	}
    }
    

    判断游戏输赢

    这里我写了2个函数,一个判断赢,一个判断输,并返回值,然后在主函数的最后面通过判断返回值来确定游戏的输赢

    判断赢

    int win(){
    	int i,j,k=0;
    	int t=0;
    	for(i=0;i<9;i++){
    		for(j=0;j<11;j++){
    			if(screen[i][j]==6){
    				k++;
    			}
    		}
    	}//遍历整个二维数组,计算箱子在终点上的个数
    	if(k==cum()){
    	t=1;
    	}//如果个数等于前面计算出的终点个数,则说明所有终点都放了箱子,说明游戏胜利
    	return t;
    } //判断赢 
    

    判断输

    int lose(){
    	int i,j;
    	int k=0;
    	for(i=0;i<9;i++){
    		for(j=0;j<11;j++){
    			if(i>0 && j>0 ){	
    			if(screen[i][j] == 2 || screen[i][j] == 6){
    				if(((screen[i-1][j] == 1 || screen[i-1][j] == 2 || screen[i-1][j] == 6) && (screen[i][j-1] == 1 || screen[i][j-1] == 2 || screen[i][j-1] == 6)) 
    				|| ((screen[i][j-1] == 1 || screen[i][j-1] == 2 || screen[i][j-1] == 6) && (screen[i+1][j] == 1 || screen[i+1][j] == 2 || screen[i+1][j] == 6))
    				|| ((screen[i+1][j] == 1 || screen[i+1][j] == 2 || screen[i+1][j] == 6) && (screen[i][j+1] == 1 || screen[i][j+1] == 2 || screen[i][j+1] == 6))
    				|| ((screen[i][j+1] == 1 || screen[i][j+1] == 2 || screen[i][j+1] == 6) && (screen[i-1][j] == 1 || screen[i-1][j] == 2 || screen[i-1][j] == 6))){
    					k++;
    				}
    			}
    		}
    		}/*这里也是遍历了整个数组,判断所有的箱子四个方向的情况,
    		如果有三个方向被堵住了说明箱子无法移动了,也表明这个箱子失效了,
    		用k来记录失效的个数,当全部失效时游戏失败
    		(这是游戏的玩法,其实有一个被堵住就已经不可能胜利了)*/
    	}
    	if(k==cum()){
    		k=1;
    	}
    	return k;//返回1说明游戏失败
    }
    

    接下来是最重要的四个控制函数

    向上移动

    通过数字的变化来控制二维数组的变化,进而控制地图的更新

    这里非常重要的就是要理解:加1,加2,加3减3都是什么意思

    加1:箱子的值是2,人的值是3,所以箱子的位置变成人需要加1来实现

    加2:空地的值是0,箱子的值是2,箱子和终点在一起的值是6,所以在推箱子的时候,前方的空格或者终点放上箱子后数值会加2

    加3减3:人的值是3,人要动的话,它原先在的格子就会因为人走了导致数值减3,走到的那个格子就会因为站了人而加3

    如果这个理解的话,代码就非常简单了

    void movew(){
    	if(x>0){
    		if(screen[x-1][y]==1){
    			return ;/*如果箱子的上面是墙,则地图不会发生变化,因为
    			推不动嘛*/
    		}else if(screen[x-1][y]==0){
    			screen[x-1][y]+=3;
    			screen[x][y]-=3;
    			x--;/*如果前面是空地,则需要向前移动一格,也就是原先人的位置
    			变成空地,前方的空地变成人,空地(0)变成人(3)需要加3,
    			人变成空地需要减3*/
    		}else if(screen[x-1][y]==4){
    			screen[x-1][y]+=3;
    			screen[x][y]-=3;
    			x--;
    		}//一样的
    		else if(screen[x-1][y]==2||screen[x-1][y]==6){
    				if(screen[x-2][y]==0){
    					screen[x-2][y]+=2;//箱子前面的格变成箱子(2)
    					screen[x-1][y]+=1;//箱子的位置变成人(3)
    					screen[x][y]-=3;/*如果前面是空地,则需要向前移动
    					一格,也就是原先是箱子的格子变成人,人的位置变成空
    					地,原先的空地变成箱子,箱子(2)变成人(3)需要减
    					3,空地变成人*/
    					x--;
    				}else if(screen[x-2][y]==1){
    					return ;
    				}else if(screen[x-2][y]==2){
    				return;//如果箱子的前面是墙或者其他的箱子,则箱子推不动
    				}else if(screen[x-2][y]==4){
    					screen[x-2][y]+=2;
    					screen[x-1][y]+=1;
    					screen[x][y]-=3;
    					x--;
    				}//这个情况别漏了
    			}
    	}
    }
    

    其他三个方向的代码思路和这个是一样的

    向下移动

    void moves(){
    	if(x<9){
    		if(screen[x+1][y]==1){
    			return ;
    		}else if(screen[x+1][y]==0){
    			screen[x+1][y]+=3;
    			screen[x][y]-=3;
    			x++;
    		}else if(screen[x+1][y]==4){
    			screen [x+1][y]+=3;
    			screen[x][y]-=3;
    			x++;
    		}
    		else if(screen[x+1][y]==2||screen[x+1][y]==6){ 
    				if(screen[x+2][y]==1){
    					return;
    				}else if(screen[x+2][y]==0){
    					screen[x+2][y]+=2;
    					screen[x+1][y]+=1;
    					screen[x][y]-=3;
    					x++;
    				}else if(screen[x+2][y]==2){
    					return ;
    				}else if(screen[x+2][y]==4){
    					screen[x+2][y]+=2;
    					screen[x+1][y]+=1;
    					screen[x][y]-=3;
    					x++;
    					}
    				}
    			}
    }
    

    向左移动

    void movea(){
    	if(y>0){
    	if(screen[x][y-1]==1){
    		return;
    	}else if(screen[x][y-1]==4){
    		screen[x][y-1]+=3;
    		screen[x][y]-=3;
    		y--;
    	}
    	else if(screen[x][y-1]==0){
    		screen[x][y-1]+=3;
    		screen[x][y]-=3;
    		y--;
    	}else if(screen[x][y-1]==2||screen[x][y-1]==6){
    			if(screen[x][y-2]==0){
    				screen[x][y-2]+=2;
    				screen[x][y-1]+=1;
    				screen[x][y]-=3;
    				y--;
    			}else if(screen[x][y-2]==1){
    				return;
    			}else if(screen[x][y-2]==2){
    				return;
    			}else if(screen[x][y-2]=4){
    				screen[x][y-2]+=2;
    				screen[x][y-1]+=1;
    				screen[x][y]-=3;
    				y--;
    			}
    		}
    }
    }
    

    向右移动

    void moved(){
    	if(y<9){
    		if(screen[x][y+1]==1){
    			return;
    		}else if(screen[x][y+1]==4){
    			screen[x][y+1]+=3;
    			screen[x][y]-=3;
    			y++;
    		}
    		else if(screen[x][y+1]==0){
    			screen[x][y+1]+=3;
    			screen[x][y]-=3;
    			y++;
    		}else 
    			if(screen[x][y+1]==2||screen[x][y+1]==6){
    				if(screen[x][y+2]==0){
    					screen[x][y+2]+=2;
    					screen[x][y+1]+=1;
    					screen[x][y]-=3;
    					y++;
    				}else if(screen[x][y+2]==4){
    					screen[x][y+2]+=2;
    					screen[x][y+1]+=1;
    					screen[x][y]-=3;
    					y++;
    				}else if(screen[x][y+2]==2){
    					return;
    				}else if(screen[x][y+2]==1){
    					return;
    				}
    			}
    		
    	}
    }
    

    主函数

    这个主函数写的有点乱,直接看注释吧

    
    int main(){
    	int n,t;
    	int j,k;
    	int b=1;
    	here:
    		system("cls");//
    	printf("开始游戏请按1\n退出游戏请按2\n"); 
    	scanf("%d",&j);
    	if(j==1){
    	printf("请用wsad代表上下左右来进行游戏\n");//这个就引导进入游戏
    	while(1){
    		system("cls");/*在每一次移动过后都清除上一个地图,不然就会每走
    		一步生成一个图*/
    		print();//先打印地图
    		scanf("%c",&n);//读入用户的操作
    		switch(n){
    			case 'w':
    				movew();
    				break;
    			case 's':
    				moves();
    				break;
    			case 'a':
    				movea();
    				break;
    			case 'd':
    				moved();
    				break;
    		} //控制人移动
    		t=win(); 
    		if(t==1){
    		goto there;
    	}//每次操作完先判断游戏是否胜利,如果胜利了直接跳到函数最后
    	if(b == lose()){
    		system("cls");
    		print();
    		printf("游戏失败");
    		return 0;
    	} //游戏失败提示
    }
    }else {
    	system("cls");
    	printf("您确认要退出游戏吗\n确认退出按1\t返回上一层按2\n"); 
    	scanf("%d",&k);
    		if(k==1){
    			printf("你已退出游戏,期待你的再次到来,谢谢"); 
    			return 0;
    		}else {
    			goto here;
    		}
    }//这一块是最前面用户进入游戏那里的,如果用户选择退出游戏执行的操作
    	there:
    		printf("恭喜你通过了游戏!");
    	return 0;
    }//主函数 
    

    所有的代码就到这里了,如果需要完整代码可以留言喔.

    展开全文
  • 主要为大家详细介绍了C语言实现简单推箱子游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 原创独一份,思路清晰,直接运行,比淘宝项目好,适用于大一课程设计
  • C语言实现推箱子

    2017-12-06 17:41:51
    主要特色: 1.有积分; 2.作者有多年C++经验; 3.用w,a,s,d控制前后左右 4.大家可以随便试一下,还很好玩的
  • C语言实现推箱子小游戏的代码(无可视化界面)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,032
精华内容 412
关键字:

c语言实现推箱子

c语言 订阅