前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言小游戏编程,最详细教程

C语言小游戏编程,最详细教程

原创
作者头像
调侃编程学
修改2018-08-22 17:40:29
5.9K0
修改2018-08-22 17:40:29
举报
文章被收录于专栏:调侃编程学调侃编程学

C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

很高兴你能光临小编寒舍

首先感谢百忙之中你能从万千文章中点小编得专属页面。这不是娱乐篇,这是学习道场。开始前,小编就做一个简单得自我介绍:(开启装逼模式)

我就是传说中写文章通俗而不庸俗,说话风流而不下流,智慧与美貌并重,英雄与侠义得化身得小编老师。人间人爱,花见花开已不足以形容我得帅气!

C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

我又被打了,帮忙叫下120

好了好了,我再也不敢了,进入主题:

C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

抽象属性:数据设计

C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

小编有话要说:

map[2][7][8]说:首先大家将会看到三维数组!!没听错就是三维得,不要怕,你要明白得是map[2][7][8]中 [2]是用来表达关数就没什么问题了哦。

剩下得你就和把他当作一个二维数组就可以了。

cas说: 我就是控制关数得,但是我要从0开始,为啥呢?因为地图是从0开始得呀

boxSum[2]说:我是用来控制胜负得,至于我里面得值是没一关卡箱子得数目啊。

资源初始化:绘制地图

小编有话要说:

绘制地图原理: 就是一个萝卜一个坑,在数组中用特殊得值表示不同得物品,这个就需要你去玩一遍推箱子了,要非常熟悉熟悉箱子得几个状态了。

  • 游戏7大状态
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

不知道的可以去玩玩哦

  • 用不同东西表示不同的状态

0: 空地 " "

1: 墙 "▆"

3: 目的地 "☆"

4: 箱子 "★"

5:人 "※"

7:/目的(3)和箱子(4)在一起"⊙"

8:人(5)和目的(3)在一起:"※"

  • 遍历数组绘制地图
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

由于截图是ps拼接的,截图姐去不了那么多

用户处理:按键处理

  • 按键处理基本框架:选择结构的使用,对于用户按键上下左右处理
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

基本上C语言中甚至是以后用到的按键处理基本都是这个框架

  • 按键处理实质: 按下方向键,根据数组的位置去做定位移动
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

​移动过程在同步数组下标变化

  • 针对不同情况的不同处理:(以向上为例,其他的根据对称可以求出来)

1.人前面是空地或者目的地

C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

​空地的值是0,目的地的是3

2.人前面是箱子,箱子前面是空地或者目的地

C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

​就是这么简单,其他方向开始你的拷贝把!

收尾工作:胜负判断

胜负判断:那就很简单的了箱子数目为零就可以了。

C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

​就是这么粗暴

主函数,调用一下即可

C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

完整源码:

代码语言:c
复制
//0:空的 1:▆ 3:☆ 4:★ 5:※ 7:⊙ 8:※
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int  map[2][7][8] =
{
	//0:空的 1:▆ :墙
	//3:☆ 4:★  //目的地和箱子
	//5:※		  //人
	//7:⊙		  //目的(3)和箱子(4)在一起
	//8:※		  //人(5)和目的(3)在一起
	//为让多种情况使用一种算法
	//数学艺术
	{
	1, 1, 1, 1, 1, 1, 1, 1,
	1, 0, 0, 0, 0, 0, 0, 1,
	1, 3, 1, 0, 1, 1, 3, 1,
	1, 4, 0, 0, 4, 0, 3, 1,
	1, 0, 1, 0, 1, 1, 4, 1,
	1, 0, 0, 5, 0, 0, 0, 1,
	1, 1, 1, 1, 1, 1, 1, 1
	},
	{
		1, 1, 1, 1, 1, 1, 1, 1,
		1, 0, 0, 0, 0, 0, 0, 1,
		1, 3, 1, 0, 1, 1, 3, 1,
		1, 3, 4, 5, 4, 0, 3, 1,
		1, 4, 1, 0, 1, 1, 4, 1,
		1, 0, 0, 0, 0, 0, 0, 1,
		1, 1, 1, 1, 1, 1, 1, 1
	}
};
int cas = 0;	//为0表示第一关
//记录每一关的箱子数 或者是项目和目的在一起的总数
int boxSum[2] = {3,4};
//地图绘图
void drawMap()
{
	for (int i = 0; i < 7; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (j == 0)
				printf("\t\t");
			switch (map[cas][i][j])
			{
				//	//0:空的 1:▆ :墙
			case 0:
				printf("  ");
				break;
			case 1:
				printf("▆");
				break;
				//3:☆ 4:★  //目的地和箱子
			case 3:
				printf("☆");
				break;
			case 4:
				printf("★");
				break;
				//5:※		  //人
			case 5:
			case 8:
				printf("※");
				break;
			case 7:
				printf("⊙");
				break;
				//7:⊙		  //目的(3)和箱子(4)在一起
				//8:※		  //人(5)和目的(3)在一起
			}
		}
		printf("\n");
	}
}
//按键处理
void keyDown()
{
	//分析按键过程
	//定位人在哪里
	//人有两种情况:第一个是:人,第二个:人站在目的上
	int i, j;
	for (i = 0; i < 7; i++)
	{
		for (j = 0; j < 8; j++)
		{
			if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
			{
				break;
			}
		}
		if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
		{
			break;
		}
	}

	char ch = _getch();	//看不见的字符输入,+头文件 conio.h
	switch (ch)
	{
		//72 80   75 77
	case 'w':
	case 'W':
	case 72:
		//下一个地方等于空地或者是目的 能走
		if (map[cas][i - 1][j] == 0 || map[cas][i - 1][j] == 3)
		{
			//3+5=8 :表示目的和人在一起
			//新地方(map[i-1][j])人(5)来了
			map[cas][i - 1][j] += 5;
			//老地方(map[i][j])人(5)走了
			map[cas][i][j] -= 5;
		}
		//如果下一个是箱子,要进一步判断能走
		//注意点:箱子两种状态:箱子,箱子和目的在一起
		else if (map[cas][i - 1][j] == 4 || map[cas][i - 1][j] == 7)
		{
			//做箱子的下一个地方判断能不能走
			if (map[cas][i - 2][j] == 0 || map[cas][i - 2][j] == 3)
			{
				//新的地方箱子来了
				map[cas][i - 2][j] += 4;
				//箱子的位置:箱子(-4)走了 人来(+5)
				map[cas][i - 1][j] += 1;
				//原来的地方人走了
				map[cas][i][j] -= 5;
			}

		}

		break;
	case 's':
	case 'S':
	case 80:
		//下一个地方等于空地或者是目的 能走
		if (map[cas][i + 1][j] == 0 || map[cas][i + 1][j] == 3)
		{
			//3+5=8 :表示目的和人在一起
			//新地方(map[i-1][j])人(5)来了
			map[cas][i + 1][j] += 5;
			//老地方(map[i][j])人(5)走了
			map[cas][i][j] -= 5;
		}
		else if (map[cas][i + 1][j] == 4 || map[cas][i + 1][j] == 7)
		{
			//做箱子的下一个地方判断能不能走
			if (map[cas][i + 2][j] == 0 || map[cas][i + 2][j] == 3)
			{
				//新的地方箱子来了
				map[cas][i + 2][j] += 4;
				//箱子的位置:箱子(-4)走了 人来(+5)
				map[cas][i + 1][j] += 1;
				//原来的地方人走了
				map[cas][i][j] -= 5;
			}

		}
		break;

	case 'a':
	case 'A':
	case 75:
		//下一个地方等于空地或者是目的 能走
		if (map[cas][i][j - 1] == 0 || map[cas][i][j - 1] == 3)
		{
			//3+5=8 :表示目的和人在一起
			//新地方(map[i-1][j])人(5)来了
			map[cas][i][j - 1] = map[cas][i][j - 1] + 5;
			//老地方(map[i][j])人(5)走了
			map[cas][i][j] = map[cas][i][j] - 5;
			//j+=5  j=j+5

		}
		else if (map[cas][i][j - 1] == 4 || map[cas][i][j - 1] == 7)
		{
			//做箱子的下一个地方判断能不能走
			if (map[cas][i][j - 2] == 0 || map[cas][i][j - 2] == 3)
			{
				//新的地方箱子来了
				map[cas][i][j - 2] += 4;
				//箱子的位置:箱子(-4)走了 人来(+5)
				map[cas][i][j - 1] += 1;
				//原来的地方人走了
				map[cas][i][j] -= 5;
			}

		}

		break;
	case 'D':
	case 'd':
	case 77:
		//下一个地方等于空地或者是目的 能走
		if (map[cas][i][j + 1] == 0 || map[cas][i][j + 1] == 3)
		{
			//3+5=8 :表示目的和人在一起
			//新地方(map[i-1][j])人(5)来了
			map[cas][i][j + 1] += 5;
			//老地方(map[i][j])人(5)走了
			map[cas][i][j] -= 5;
		}
		
		//下一个地方是箱子,判断箱子的下一个地方是不是目的和空地
		else if (map[cas][i][j + 1] == 4 || map[cas][i][j + 1] == 7)
		{
			//做箱子的下一个地方判断能不能走
			if (map[cas][i][j + 2] == 0 || map[cas][i][j + 2] == 3)
			{
				//新的地方箱子来了
				map[cas][i][j + 2] += 4;
				//箱子的位置:箱子(-4)走了 人来(+5)
				map[cas][i][j + 1] += 1;
				//原来的地方人走了
				map[cas][i][j] -= 5;
			}

		}
		break;
	}
}
//胜负判断
//用什么判断胜负: 箱子到达目的的个数
int gameOver()
{
	int count = 0;
	//所有的地方找一遍
	for (int i = 0; i < 7; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (map[cas][i][j] == 7)
				count++;
		}
	}
	return count;
}
//箱子数是零的时候也是胜利
int gameOver2()
{
	int count = 3;
	//所有的地方找一遍
	for (int i = 0; i < 7; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (map[cas][i][j] == 3)
				count--;
		}
	}
	return count;
}

int main()
{
	while (1)
	{
		printf("\n\n\t\t   第【%d】关\n",cas+1);
		drawMap();
		if (gameOver() == boxSum[cas])
		{
			cas++;
			if (cas == 2)
				break;
		}
		keyDown();
		system("cls");
	}
	printf("GameOVer");
	system("pause");
	return 0;
}

更多精彩C/C++学习乐园:747821062

C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
  • 抽象属性:数据设计
  • 资源初始化:绘制地图
  • 用户处理:按键处理
  • 收尾工作:胜负判断
  • 主函数,调用一下即可
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档