用C语言实现推箱子游戏实例

目录
  • 前言
  • 游戏效果图
  • 游戏开发思路
    • 游戏逻辑的分析
  • 源代码实现
    • 头文件
    • PushBackGame.c文件
    • test.c文件
  • 总结

前言

本游戏需要用到的核心技术,如下

二维数组分支语句

技术难点: 二维数组的应用和游戏的判断逻辑

只要会以上的技术的萌新都能做出很棒的游戏,博主本身也是一枚小白,如果源代码的某些地方有不足,请大佬在评论区指出。

游戏效果图

实际游玩效果图​​​​​

游戏开发思路

分析游戏逻辑,再根据游戏分析游戏代码逻辑写出伪代码,再分析可能存在的问题,最后一步才是开发游戏。

游戏逻辑的分析

游戏逻辑分析图

源代码实现

头文件

#pragma once
#include <stdio.h>
#include <Windows.h>

#define ROW 10
#define COL 10

enum Control
{
	上 = 72,
	下 = 80,
	左 = 75,
	右 = 77
};

extern void Game();

extern void DisplayBoard(int board[ROW][COL]);

extern void MovePlayer(int board[ROW][COL]);

extern void PushBox(int board[ROW][COL], int y, int x, char ch);

extern void MovePlay(int board[ROW][COL], int y, int x);

extern int JudgeVictory(int board[ROW][COL]);

extern void HelpMan();

PushBackGame.c文件

#include "PushBoxGame.h"

void HelpMan()
{
	system("cls");
	printf("==============================\n");
	printf("\t移动操作\n");
	printf("向上移动:\t↑\tw\n");
	printf("向下移动:\t↓\ts\n");
	printf("向左移动:\t←\ta\n");
	printf("向右移动:\t→\td\n");
	printf("------------------------------\n");
	printf("\t功能性操作\n");
	printf("游戏内回到主菜单:\tz\n");
	printf("==============================\n");
	printf("按任意键退出.......\n");
	_getch();
}

int JudgeVictory(int board[ROW][COL])
{
	int i = 0;
	int j = 0;
	int count = 0;

	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (5 == board[i][j])
			{
				count++;
			}

			if (count == 4)
			{
				return 1;
			}
		}
	}

	return 0;
}

void MovePlay(int board[ROW][COL], int y, int x)
{
	//看是空地还是存放点
	if (0 == board[y][x])
	{
		board[y][x] = 6;
	}
	else if (3 == board[y][x])
	{
		board[y][x] = 4;
	}
}

void PushBox(int board[ROW][COL], int y, int x, char ch)
{
	//如果箱子在存放点
	if (5 == board[y][x])
	{
		switch (ch)
		{
		case 'w':
			if (0 == board[y - 1][x])
			{
				board[y--][x] = 4;
				board[y][x] = 2;
			}
			else if (3 == board[y - 1][x])
			{
				board[y--][x] = 4;
				board[y][x] = 5;
			}
			break;
		case 's':
			if (0 == board[y + 1][x])
			{
				board[y++][x] = 4;
				board[y][x] = 2;
			}
			else if (3 == board[y + 1][x])
			{
				board[y++][x] = 4;
				board[y][x] = 5;
			}
			break;
		case 'a':
			if (0 == board[y][x - 1])
			{
				board[y][x--] = 4;
				board[y][x] = 2;
			}
			else if (3 == board[y][x - 1])
			{
				board[y][x--] = 4;
				board[y][x] = 5;
			}
			break;
		case 'd':
			if (0 == board[y][x + 1])
			{
				board[y][x++] = 4;
				board[y][x] = 2;
			}
			else if (3 == board[y][x + 1])
			{
				board[y][x++] = 4;
				board[y][x] = 5;
			}
			break;
		}
	}
	//没在存放点
	else if (2 == board[y][x])
	{
		switch (ch)
		{
		case 'w':
			if (0 == board[y - 1][x])
			{
				board[y--][x] = 6;
				board[y][x] = 2;
			}
			else if (3 == board[y - 1][x])
			{
				board[y--][x] = 6;
				board[y][x] = 5;
			}
			break;
		case 's':
			if (0 == board[y + 1][x])
			{
				board[y++][x] = 6;
				board[y][x] = 2;
			}
			else if (3 == board[y + 1][x])
			{
				board[y++][x] = 6;
				board[y][x] = 5;
			}
			break;
		case 'a':
			if (0 == board[y][x - 1])
			{
				board[y][x--] = 6;
				board[y][x] = 2;
			}
			else if (3 == board[y][x - 1])
			{
				board[y][x--] = 6;
				board[y][x] = 5;
			}
			break;
		case 'd':
			if (0 == board[y][x + 1])
			{
				board[y][x++] = 6;
				board[y][x] = 2;
			}
			else if (3 == board[y][x + 1])
			{
				board[y][x++] = 6;
				board[y][x] = 5;
			}
			break;
		}
	}
}

void MovePlayer(int board[ROW][COL])
{
	int x = 0;
	int y = 0;
	int i = 0;
	int j = 0;

	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (6 == board[i][j])
			{
				x = j;
				y = i;
			}
		}
	}

	do
	{
		DisplayBoard(board);

		switch (_getch())
		{
		case 'w':
		case 'W':
		case 上:
			//判断是在空地,还是在存放点
			if (6 == board[y][x])
			{
				//如果人后面是箱子就移动箱子
				if (!(2 == board[y - 2][x]) && !(5 == board[y - 2][x]) && !(1 == board[y - 2][x]) && (2 == board[y - 1][x] || 5 == board[y - 1][x]))
				{
					board[y--][x] = 0;
					PushBox(board, y, x, 'w');
				}
				//如果人后面不是箱子就移动人
				else if (0 == board[y - 1][x] || 3 == board[y - 1][x])
				{
					board[y--][x] = 0;
					MovePlay(board, y, x);
				}
			}
			else if (4 == board[y][x])
			{
				//如果人后面是箱子就移动箱子
				if (!(2 == board[y - 2][x]) && !(5 == board[y - 2][x]) && !(1 == board[y - 2][x]) && (2 == board[y - 1][x] || 5 == board[y - 1][x]))
				{
					board[y--][x] = 3;
					PushBox(board, y, x, 'w');
				}
				//如果人后面不是箱子就移动人
				else if (0 == board[y - 1][x] || 3 == board[y - 1][x])
				{
					board[y--][x] = 3;
					MovePlay(board, y, x);
				}
			}

			break;
		case 's':
		case 'S':
		case 下:
			//判断是在空地,还是在存放点
			if (6 == board[y][x])
			{
				//如果人后面是箱子就移动箱子
				if (!(2 == board[y + 2][x]) && !(5 == board[y + 2][x]) && !(1 == board[y + 2][x]) && (2 == board[y + 1][x] || 5 == board[y + 1][x]))
				{
					board[y++][x] = 0;
					PushBox(board, y, x, 's');
				}
				//如果人后面不是箱子就移动人
				else if (0 == board[y + 1][x] || 3 == board[y + 1][x])
				{
					board[y++][x] = 0;
					MovePlay(board, y, x);
				}
			}
			else if (4 == board[y][x])
			{
				//如果人后面是箱子就移动箱子
				if (!(2 == board[y + 2][x]) && !(5 == board[y + 2][x]) && !(1 == board[y + 2][x]) && (2 == board[y + 1][x] || 5 == board[y + 1][x]))
				{
					board[y++][x] = 3;
					PushBox(board, y, x, 's');
				}
				//如果人后面不是箱子就移动人
				else if (0 == board[y + 1][x] || 3 == board[y + 1][x])
				{
					board[y++][x] = 3;
					MovePlay(board, y, x);
				}
			}
			break;
		case 'a':
		case 'A':
		case 左:
			//判断是在空地,还是在存放点
			if (6 == board[y][x])
			{
				//如果人后面是箱子就移动箱子
				if (!(2 == board[y][x - 2]) && !(5 == board[y][x - 2]) && !(1 == board[y][x - 2]) && (2 == board[y][x - 1] || 5 == board[y][x - 1]))
				{
					board[y][x--] = 0;
					PushBox(board, y, x, 'a');
				}
				//如果人后面不是箱子就移动人
				else if (0 == board[y][x - 1] || 3 == board[y][x - 1])
				{
					board[y][x--] = 0;
					MovePlay(board, y, x);
				}
			}
			else if (4 == board[y][x])
			{
				//如果人后面是箱子就移动箱子
				if (!(2 == board[y][x - 2]) && !(5 == board[y][x - 2]) && !(1 == board[y][x - 2]) && (2 == board[y][x - 1] || 5 == board[y][x - 1]))
				{
					board[y][x--] = 3;
					PushBox(board, y, x, 'a');
				}
				//如果人后面不是箱子就移动人
				else if (0 == board[y][x - 1] || 3 == board[y][x - 1])
				{
					board[y][x--] = 3;
					MovePlay(board, y, x);
				}
			}
			break;
		case 'd':
		case 'D':
		case 右:
			//判断是在空地,还是在存放点
			if (6 == board[y][x])
			{
				//如果人后面是箱子就移动箱子
				if (!(2 == board[y][x + 2]) && !(5 == board[y][x + 2]) && !(1 == board[y][x + 2]) && (2 == board[y][x + 1] || 5 == board[y][x + 1]))
				{
					board[y][x++] = 0;
					PushBox(board, y, x, 'd');
				}
				//如果人后面不是箱子就移动人
				else if (0 == board[y][x + 1] || 3 == board[y][x + 1])
				{
					board[y][x++] = 0;
					MovePlay(board, y, x);
				}
			}
			else if (4 == board[y][x])
			{
				//如果人后面是箱子就移动箱子
				if (!(2 == board[y][x + 2]) && !(5 == board[y][x + 2]) && !(1 == board[y][x + 2]) && (2 == board[y][x + 1] || 5 == board[y][x + 1]))
				{
					board[y][x++] = 3;
					PushBox(board, y, x, 'd');
				}
				//如果人后面不是箱子就移动人
				else if (0 == board[y][x + 1] || 3 == board[y][x + 1])
				{
					board[y][x++] = 3;
					MovePlay(board, y, x);
				}
			}
			break;

		case 'z':
			return;
		}

		if (JudgeVictory(board))
		{
			system("cls");
			DisplayBoard(board);
			printf("恭喜通关!\n");
			printf("按任意键继续\n");
			getchar();
			_getch();
			return;
		}

	} while (1);

}

void DisplayBoard(int board[ROW][COL])
{
	system("cls");

	int i = 0;
	int j = 0;

	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			switch (board[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;
			case 6:
				printf("♀");
				break;
			}
		}
		putchar('\n');
	}
}

void Game()
{
	//墙壁:1 ■
	//箱子:2 □
	//箱子存放点:3 ☆
	//人在箱子存放点:4 ♂
	//箱子在箱子存放点:5 ★
	//人:6 ♀
	int board[ROW][COL] = {
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
		{ 1, 0, 2, 0, 0, 1, 0, 2, 0, 1 },
		{ 1, 0, 0, 2, 0, 1, 0, 0, 0, 1 },
		{ 1, 1, 1, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 1, 0, 0, 1, 1, 1 },
		{ 1, 0, 2, 6, 1, 0, 0, 3, 3, 1 },
		{ 1, 0, 0, 0, 1, 0, 0, 3, 3, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	};

	//DisplayBoard(board);
	MovePlayer(board);
}

test.c文件

#include "PushBoxGame.h"
#define nullptr ((void*) 0)

int main()
{
	int input = 0;

	do
	{
		system("color 3e");
		system("mode con cols=30 lines=15");
		system("cls");
		printf("************************\n");
		printf("**** 1. 开始游戏   *****\n");
		printf("**** 2. 帮助手册   *****\n");
		printf("**** 0. 退出游戏   *****\n");
		printf("************************\n");
		printf("请输入>:");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			//游戏主体
			Game();
			break;
		case 2:
			HelpMan();
			break;
		case 0:
			printf("游戏已退出\n");
			break;
		default:
			printf("请输入有效数字!\a\n");
			Sleep(500);
			break;
		}
	} while (input);

	return 0;
}

总结

到此这篇关于用C语言实现推箱子游戏实例的文章就介绍到这了,更多相关C语言推箱子内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言扑克牌游戏示例

    目录 一. 设计目的 二. 设计内容与要求 三. 设计思路 四. 实现过程 五. 结论与改进 一. 设计目的 扑克牌是我们从小玩到大的纸牌类小游戏,我们有各种玩法跟不同的规则.我之所以选择的这个扑克牌,是因为我觉得可以提高我的编程逻辑能力跟运用循环的能力.还能让我自由运用所学知识完成我的项目设计的需求,对我综合能力的能力很有挑战! 二. 设计内容与要求 (1)设计内容:扑克牌游戏. (2)介绍扑克牌:一副没有大小王的52张牌,该牌从大到小的顺序为:2.3.4.5.6.7.8.9.10.J.Q.K

  • c语言实现可自定义的游戏地图

    本文实例为大家分享了c语言实现可自定义的游戏地图的具体代码,供大家参考,具体内容如下 博主相信每个人都有想做游戏的冲动,那么本文将给出一个用c语言制作的可自定义大小的游戏地图(包含player,撞墙设置).废话不多说,直接给出全代码! 1.完整代码 #include<stdio.h> #include<windows.h> #include<conio.h>    //this is the add function  int drawroom(int length,i

  • 用c语言实现《狼人杀》游戏发牌系统

    目录 1.前言 2.程序效果 3.完整代码 总结 1.前言 新年将至,亲戚朋友在家中免不了玩一下桌游,狼人杀确实是一个不错选择.那么针对正常的狼人杀玩法(8人局和12人局),博主利用一上午时间做了一个<狼人杀自动发牌系统>(可查看游戏教程和人物属性).接下来就直接看程序效果和完整代码吧! 2.程序效果 3.完整代码 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<window

  • C语言实现扫雷游戏详解(附源码)

    目录 1.游戏的功能 2.游戏实现的基本思路 2.1实现菜单给玩家选择 2.2初始化棋盘 2.3数组大小的问题 2.4对棋盘赋值 2.5打印棋盘 2.6布置雷 2.7排查雷 3.代码基本实现部分 3.1主函数部分 3.2 初始化棋盘 3.3对两个棋盘进行赋值 3.4打印棋盘 3.5布置雷 3.6排查雷  3.7函数声明 4.扫雷游戏的源代码 总结 1.游戏的功能 游戏的主要功能有 1:棋盘内有若干个雷 2:玩家输入要排查雷的坐标 3:在玩家输入的坐标处显示周围八个坐标有几个雷 3:若玩家将所有的

  • C语言实现井字棋游戏(人机对弈)

    井字棋游戏:即三子棋,英文名叫Tic-Tac-Tic,是一种在3*3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边线框,格线排成井字故得名. 题目分析 : 要完成该游戏的编写,我们需要先分析出完成整个游戏过程都需要干什么? 1.首先,需要定义出一个3*3的棋盘,根据相关知识,我们可以以二维数组的方式将棋盘表示出来: 2.棋盘定义出来后,需要将棋盘初始化,将3*3二维数组的每一个位置初始化为‘ ’(空格): 3.有了棋盘,我们就可以开始进行下棋了,首先要确定是玩家先下还是电脑先下.在这

  • 基于C语言实现简易三子棋游戏

    用C语言写三子棋的具体代码,供大家参考,具体内容如下 1.头文件 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> //标识符定义 #define ROW 3 #define COL 3 //函数定义 //棋盘初始化 void init_board(char board[ROW][COL], int row, int col); //打印棋盘 void display_board(char

  • c语言实现简单的五子棋游戏

    本文实例为大家分享了c语言实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 环境vs2017 一.游戏设计思想 1.该代码设置为 玩家1(*) vs 玩家2(O) 2.选择玩游戏 2.1 显示棋盘,玩家1下棋,判断游戏结果2.2 显示棋盘,玩家2下棋,判断游戏结果  3.判断游戏结果 有4种结果,玩家1赢,玩家2赢,平局,继续游戏若结果为玩家1赢或玩家2赢或平局,则显示结果,退回菜单界面,不再循环下棋        若结果为继续,则循环2.1和2.2 4.选择退出,则退出游戏 二.图片解说

  • C语言游戏项目球球大作战实现流程

    目录 项目代码 1.结构体 2.初始化 3.绘制函数 4.玩家控制函数 5.吃食物函数 6.电脑移动函数 7.主函数 总结 序 时间在流去,我们在长大 嗨,这里是狐狸~~ 今天是2022年1月11日,今天突然发现好久没有给你们更新项目了,今天来教大家一个新的项目,一个游戏项目——球球大作战. 球球大作战在宇宙深处一片遍布着荆棘之花的神秘星云中,生活着一群名叫“波拉哩”(译名“球球”)的奇特生物.他们外表萌萌,却有着勇敢的心.他们是天生的战斗种族,为战斗而生,为战斗而亡. 传说中,这群波拉哩的共同

  • C语言实现简单的推箱子游戏

    本文实例为大家分享了C语言实现简单的推箱子游戏的具体代码,供大家参考,具体内容如下 项目实现的具体方案: 先安装VS2019,后安装画图工具Easyx,安装以后就可以将推箱子中的(人物,墙壁,箱子目的地,箱子)的图片加载到程序中显示出来.游戏的实现是通过程序读取键盘中输入的字母,后控制加载到程序中的人物图片的移动实现小人的移动,通过人物图片和地板图片交换位置实现人物的行走,如果人物前面是箱子图片,箱子图片前面是地板图片,则人物图片和箱子图片一起移动,直到箱子图片前面是箱子目的地图片则箱子图片将箱

  • 用C语言实现推箱子游戏实例

    目录 前言 游戏效果图 游戏开发思路 游戏逻辑的分析 源代码实现 头文件 PushBackGame.c文件 test.c文件 总结 前言 本游戏需要用到的核心技术,如下: 二维数组分支语句 技术难点: 二维数组的应用和游戏的判断逻辑 只要会以上的技术的萌新都能做出很棒的游戏,博主本身也是一枚小白,如果源代码的某些地方有不足,请大佬在评论区指出. 游戏效果图 实际游玩效果图​​​​​ 游戏开发思路 分析游戏逻辑,再根据游戏分析游戏代码逻辑写出伪代码,再分析可能存在的问题,最后一步才是开发游戏. 游

  • 基于C语言实现推箱子游戏

    本文实例为大家分享了C语言实现推箱子游戏的具体代码,供大家参考,具体内容如下 代码在vs2013上测试运行. 思想: 1):地图用二维数组实现,箱子.墙壁.人等事物用不同的数字表示,遍历二维数组,遇到不同的数字打印相应的图案即可. 2):按键移动原理:判断要移动的方向是怎样的障碍物,如果理论上可以移动的话,只需把对应位置的数字作相应更改即可. #include<stdio.h> #include<stdlib.h> #include<windows.h> #includ

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

    C语言实现推箱子游戏完整代码,供大家参考,具体内容如下 前言 自己做的,可能有些代码不够工整,或者有些小问题,但游戏的基本操作是可以实现的 代码效果 代码一共分为8个部分,4个控制上下左右移动,2个判断输赢,1个统计归为的个数,一个作图. 手动设置地图 用'0'表示空格,"1"表示墙,"2"表示箱子,"3"表示人,"4"表示终点 这样可以提高代码的移植性 如需改为手动输入地图可以直接定义一个二维数组,在给他赋值就可以了 int

  • 用C语言编写推箱子游戏

    本文实例为大家分享了C语言推箱子游戏的具体实现代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include<string.h> #include <conio.h> //行和列 #define ROW 10 #define COL 11 /* run this program using the console pauser or add your own getch, system(&quo

  • C语言实现推箱子游戏的地图编辑器

    推箱子地图编辑器,供大家参考,具体内容如下 由于我在写推箱子的时候苦于没有地图可以试验程序运行效果,而且去搜了好长时间都没有找到一个储存16*16地图版本的推箱子关卡数据信息的文件. 于是想到了写了一个地图编辑器用来自己设计地图的想法. 原本以为这个伟大的创意只有我才想的出来,结果搜索后才发现还有很多人有着与我相同的想法. 但,其他人写的编辑器大部分都不是C语言版本的,而这一个是C语言版本的. 另外说明一下,该编辑器的想法完全是我个人想法写出来的,不敢保证编辑习惯符合别人的习惯. 但本着,能够实

  • C语言实现推箱子游戏的代码示例

    很早就想过做点小游戏了,但是一直没有机会动手.今天闲来无事,动起手来.过程还是蛮顺利的,代码也不是非常难.今天给大家分享一下~ 一.介绍 开发语言:C语言 开发工具:Dev-C++ 5.11 日期:2019年9月28日 作者:ZackSock 也不说太多多余的话了,先看一下效果图: 游戏中的人物.箱子.墙壁.球都是字符构成的.通过wasd键移动,规则的话就是推箱子的规则,也就不多说了. 二.代码实现 关于代码方面,我尽可能讲的细致.希望大家可以理解~ (1)方法列表 //主函数 void mai

  • C语言实现推箱子游戏

    每天学习一点点,每天容易一点点.一个简单的C语言程序,用来复习c语言,代码通俗易懂.有什么问题望各位不吝赐教. 本文用最简单的C语言语句写个推箱子的程序,分享给大家: /******************************************* 用最简单的C语言语句写个推箱子的程序. ********************************************/ #include <stdio.h> #include <conio.h> #include&l

  • Linux下用C语言实现推箱子游戏

    前面有Linux的常用命令和vim文本编辑器还没有介绍,之后我会补上的. 今天来介绍如何用C语言写一个简单的小游戏,叫做"小老鼠推箱子".虽然游戏的编写过程不复杂,但是我觉得能够从中找到自己对于编程的不足和完善自己的编程思维是最重要的.游戏代码不多,所以直接写在一个c文件中.本人小白,有不足之处还望指教 游戏介绍 下图是游戏开始界面,$是小老鼠,#是墙,O是终点,当小老鼠把所有箱子推进终点就代表游戏通过. 游戏思维 游戏地图用一个二维数组去存储.数组中不同的值代表不同的对象(老鼠.墙.

  • C语言实现推箱子小游戏

    本文实例为大家分享了C语言实现推箱子游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 1000 /* r目的地 o箱子 i人 x墙 路(空格) w上 a左 d右 s下 */ void menu(); int level1(); int level2(); void swap(char*,char*); int opera(char *p,int *

  • C语言系列之推箱子游戏

    本文实例为大家分享了C语言系列之推箱子游戏的具体代码,供大家参考,具体内容如下 输入WSAD控制行走,只需要把一个方向的代码写好了,剩下的是三个方向就是复制粘贴和简单的修改就可以了. #include <stdio.h> #include <conio.h> //键盘输入函数库 //0:空地 1:墙 2:箱子要放的位置 5:人与星号重叠5:箱子与星号重叠 3:人+-3 4:箱子:+-4 int map[10][10] = {1,1,1,1,1,1,1,1,1,1, 1,0,0,0,

随机推荐