手写推箱子源码——C语言(初入代码世界推荐)

一、绘制地图并且打印出来!

这里应用二维数组【如果设置多关卡,可以用三维数组!】

1、用数字描绘出地图。

2、再引用对应的字符或者图片代替数字。

简单两步就可以实现地图绘制啦!

【代码示例】

int map[10][10] = {
	1,1,1,1,1,1,1,1,1,1,
	1,0,1,1,3,0,0,0,1,1,
	1,0,1,1,1,1,0,0,1,1,
	1,0,1,1,1,1,0,0,1,1,
	1,4,0,0,0,0,0,0,1,1,
	1,0,1,0,1,1,0,0,1,1,
	1,0,1,0,0,2,0,0,0,3,
	1,0,1,2,1,1,0,1,1,1,
	1,0,0,0,0,0,0,1,1,1,
	1,1,1,1,1,1,1,1,1,1
};
//0=  ;1=墙;2=■;3=洞;4=人;5=人+洞;6=※==箱子+洞口;
void showmap()
{
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			if (map[i][j] == 1)
			{
				printf("墙");
			}
			else if (map[i][j] == 0)
			{
				printf("  ");
			}
			else if (map[i][j] == 2)
			{
				printf("■");
			}
			else if (map[i][j] == 3)
			{
				printf("洞");
			}
			else if (map[i][j] == 4)
			{
				printf("人");
			}
			else if (map[i][j] == 5)
			{
				printf("人");
			}
			else if (map[i][j] == 6)
			{
				printf("※");
			}
		}
		printf("\n");
	}
};

二、我们玩游戏首先肯定要先找到人的位置!

这里只需要遍历所有的数组内容,确定人的坐标即可!

1、使用 for 循环 + if 条件

2、在找到人的坐标时,使用其他字母(k,l)替换以达到确定人的坐标的目的!

【!!!为下一步人的行为做出铺垫!!!】

【代码示例】

//找到人的位置--4==[5][2]
	int k = 0, l = 0, i, j;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			if (map[i][j] == 4 || map[i][j] == 5)
			{
				k = i;
				l = j;
			}
		}

	}

三、推动箱子函数创建!

1、定义 “ 推” :选择_getch()函数!!!——包含于头文件---<conio.h>!!!

使用 '' _getch() '' :用户按下按键后直接响应!!!

使用 “ getchar () ” :用户按下按键时,需要必须按一下 Enter 键,该代码才会继续运行!!!

2、用 “switch” 函数对按键分析

【代码示例】

//推动起来!!!
	int tui;
	tui = _getch();
	switch (tui)
	{
	case'w':
		if (map[k - 1][l] == 0)//空地自由走
		{
			if (map[k][l] == 5)
			{
				map[k - 1][l] += 4;
				map[k][l] -= 2;
			}
			else if (map[k][l] == 4)
			{
				map[k - 1][l] += 4;
				map[k][l] -= 4;
			}
		}
		else if (map[k - 1][l] == 2)//箱子被推动
		{//箱子前面是空地||洞口
			if (map[k - 2][l] == 0)
			{
				map[k - 2][l] += 2;
				map[k - 1][l] += 2;
				map[k][l] -= 4;
			}
			else if (map[k - 2][l] == 3)
			{
				map[k - 2][l] += 3;
				map[k - 1][l] += 2;
				map[k][l] -= 4;
			}
		}
		else if (map[k - 1][l] == 3)//洞口+人==5
		{
			map[k - 1][l] += 2;
			map[k][l] -= 4;
		}
		break;
	case'a':
		if (map[k][l - 1] == 0)
		{
			if (map[k][l] == 5)
			{
				map[k][l - 1] += 4;
				map[k][l] -= 2;
			}
			else if (map[k][l] == 4)
			{
				map[k][l - 1] += 4;
				map[k][l] -= 4;
			}
		}
		else if (map[k][l - 1] == 2)
		{
			if (map[k][l - 2] == 0)
			{
				map[k][l - 2] += 2;
				map[k][l - 1] += 2;
				map[k][l] -= 4;
			}
			else if (map[k][l - 2] == 3)
			{
				map[k][l - 2] += 3;
				map[k][l - 1] += 2;
				map[k][l] -= 4;
			}
		}
		else if (map[k][l - 1] == 3)//洞口+人==5
		{
			map[k][l - 1] += 2;
			map[k][l] -= 4;
		}

		break;

	case's':
		if (map[k + 1][l] == 0)
		{
			if (map[k][l] == 5)
			{
				map[k + 1][l] += 4;
				map[k][l] -= 2;
			}
			else if (map[k][l] == 4)
			{
				map[k + 1][l] += 4;
				map[k][l] -= 4;
			}
		}
		else if (map[k + 1][l] == 2)
		{
			if (map[k + 2][l] == 0)
			{
				map[k + 2][l] += 2;
				map[k + 1][l] += 2;
				map[k][l] -= 4;
			}
			else if (map[k + 2][l] == 3)
			{
				map[k + 2][l] += 3;
				map[k + 1][l] += 2;
				map[k][l] -= 4;
			}
		}
		else if (map[k + 1][l] == 3)//洞口+人==5
		{
			map[k + 1][l] += 2;
			map[k][l] -= 4;
		}

		break;

	case'd':
		if (map[k][l + 1] == 0)
		{
			if (map[k][l] == 5)
			{
				map[k][l + 1] += 4;
				map[k][l] -= 2;
			}
			else if (map[k][l] == 4)
			{
				map[k][l + 1] += 4;
				map[k][l] -= 4;
			}
		}
		else if (map[k][l + 1] == 2)
		{
			if (map[k][l + 2] == 0)
			{
				map[k][l + 2] += 2;
				map[k][l + 1] += 2;
				map[k][l] -= 4;
			}
			else if (map[k][l + 2] == 3)
			{
				map[k][l + 2] += 3;
				map[k][l + 1] += 2;
				map[k][l] -= 4;

			}
		}
		else if (map[k][l + 1] == 3)//洞口+人==5
		{
			map[k][l + 1] += 2;
			map[k][l] -= 4;
		}

		break;
	default:
		break;
	}

 四、最后的胜利判定放置于主函数中:

1、主函数用系统清屏 “system("cls");”【一键清屏,世界安宁!】每次按键都是一次清屏

2、胜利判定:

        a、遍历数组——寻找箱子,并记录箱子数目;

        b、对箱子书进行判定——若 “ 箱子数==0 ” ,则表示已经胜利!!!

        c、使用 break---跳出 while 死循环,并重新打印胜利界面!!!【可以引用图片或者音乐等等奖励】

【代码示例】

int main()
{
	while (1)
	{

		system("cls");
		system("color 5e");
		showmap();
		playgame();
		int n = 0;
		for (int a = 0; a < 10; a++)
		{
			for (int b = 0; b < 10; b++)
			{
				if (map[a][b] == 2)
				{
					n++;
				}
			}
		}

		if (n == 0)
		{
			system("cls");
			printf("!!!XXXX亲制!!!\n");
			printf("恭喜您获得了胜利!!!\n");
			system("pause\n");
			break;
		}
	}
	return 0;
};

最后——下面就是源码全文分析

加入头文件就可以开始跑起来啦!

希望可以帮助到你!!!

 

 【源码全文分析】

#include <stdio.h>	
#include <stdlib.h>
#include <conio.h>
int map[10][10] = {
	1,1,1,1,1,1,1,1,1,1,
	1,0,1,1,3,0,0,0,1,1,
	1,0,1,1,1,1,0,0,1,1,
	1,0,1,1,1,1,0,0,1,1,
	1,4,0,0,0,0,0,0,1,1,
	1,0,1,0,1,1,0,0,1,1,
	1,0,1,0,0,2,0,0,0,3,
	1,0,1,2,1,1,0,1,1,1,
	1,0,0,0,0,0,0,1,1,1,
	1,1,1,1,1,1,1,1,1,1
};
//0=  ;1=墙;2=■;3=洞;4=人;5=人+洞;6=※==箱子+洞口;
void showmap()
{
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			if (map[i][j] == 1)
			{
				printf("墙");
			}
			else if (map[i][j] == 0)
			{
				printf("  ");
			}
			else if (map[i][j] == 2)
			{
				printf("■");
			}
			else if (map[i][j] == 3)
			{
				printf("洞");
			}
			else if (map[i][j] == 4)
			{
				printf("人");
			}
			else if (map[i][j] == 5)
			{
				printf("人");
			}
			else if (map[i][j] == 6)
			{
				printf("※");
			}
		}
		printf("\n");
	}
};

void playgame()
{
	//找到人的位置--4==[5][2]
	int k = 0, l = 0, i, j;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			if (map[i][j] == 4 || map[i][j] == 5)
			{
				k = i;
				l = j;
			}
		}

	}
	//推动起来!!!

	int tui;
	tui = _getch();
	switch (tui)
	{
	case'w':
		if (map[k - 1][l] == 0)//空地自由走
		{
			if (map[k][l] == 5)
			{
				map[k - 1][l] += 4;
				map[k][l] -= 2;
			}
			else if (map[k][l] == 4)
			{
				map[k - 1][l] += 4;
				map[k][l] -= 4;
			}
		}
		else if (map[k - 1][l] == 2)//箱子被推动
		{//箱子前面是空地||洞口
			if (map[k - 2][l] == 0)
			{
				map[k - 2][l] += 2;
				map[k - 1][l] += 2;
				map[k][l] -= 4;
			}
			else if (map[k - 2][l] == 3)
			{
				map[k - 2][l] += 3;
				map[k - 1][l] += 2;
				map[k][l] -= 4;
			}
		}
		else if (map[k - 1][l] == 3)//洞口+人==5
		{
			map[k - 1][l] += 2;
			map[k][l] -= 4;
		}
		break;
	case'a':
		if (map[k][l - 1] == 0)
		{
			if (map[k][l] == 5)
			{
				map[k][l - 1] += 4;
				map[k][l] -= 2;
			}
			else if (map[k][l] == 4)
			{
				map[k][l - 1] += 4;
				map[k][l] -= 4;
			}
		}
		else if (map[k][l - 1] == 2)
		{
			if (map[k][l - 2] == 0)
			{
				map[k][l - 2] += 2;
				map[k][l - 1] += 2;
				map[k][l] -= 4;
			}
			else if (map[k][l - 2] == 3)
			{
				map[k][l - 2] += 3;
				map[k][l - 1] += 2;
				map[k][l] -= 4;
			}
		}
		else if (map[k][l - 1] == 3)//洞口+人==5
		{
			map[k][l - 1] += 2;
			map[k][l] -= 4;
		}

		break;

	case's':
		if (map[k + 1][l] == 0)
		{
			if (map[k][l] == 5)
			{
				map[k + 1][l] += 4;
				map[k][l] -= 2;
			}
			else if (map[k][l] == 4)
			{
				map[k + 1][l] += 4;
				map[k][l] -= 4;
			}
		}
		else if (map[k + 1][l] == 2)
		{
			if (map[k + 2][l] == 0)
			{
				map[k + 2][l] += 2;
				map[k + 1][l] += 2;
				map[k][l] -= 4;
			}
			else if (map[k + 2][l] == 3)
			{
				map[k + 2][l] += 3;
				map[k + 1][l] += 2;
				map[k][l] -= 4;
			}
		}
		else if (map[k + 1][l] == 3)//洞口+人==5
		{
			map[k + 1][l] += 2;
			map[k][l] -= 4;
		}

		break;

	case'd':
		if (map[k][l + 1] == 0)
		{
			if (map[k][l] == 5)
			{
				map[k][l + 1] += 4;
				map[k][l] -= 2;
			}
			else if (map[k][l] == 4)
			{
				map[k][l + 1] += 4;
				map[k][l] -= 4;
			}
		}
		else if (map[k][l + 1] == 2)
		{
			if (map[k][l + 2] == 0)
			{
				map[k][l + 2] += 2;
				map[k][l + 1] += 2;
				map[k][l] -= 4;
			}
			else if (map[k][l + 2] == 3)
			{
				map[k][l + 2] += 3;
				map[k][l + 1] += 2;
				map[k][l] -= 4;

			}
		}
		else if (map[k][l + 1] == 3)//洞口+人==5
		{
			map[k][l + 1] += 2;
			map[k][l] -= 4;
		}

		break;
	default:
		break;
	}
};

int main()
{
	while (1)
	{

		system("cls");
		system("color 5e");
		showmap();
		playgame();
		int n = 0;
		for (int a = 0; a < 10; a++)
		{
			for (int b = 0; b < 10; b++)
			{
				if (map[a][b] == 2)
				{
					n++;
				}
			}
		}

		if (n == 0)
		{
			system("cls");
			printf("!!!XXX亲制!!!\n");
			printf("恭喜您获得了胜利!!!\n");
			system("pause\n");
			break;
		}
	}
	return 0;
};

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
下面是一个简单的 C 语言程序,用于计算离散傅里叶变换(DFT): ```c #include <stdio.h> #include <math.h> #define PI 3.14159265358979323846 typedef struct { double real; double imag; } complex; complex complex_add(complex a, complex b) { complex c; c.real = a.real + b.real; c.imag = a.imag + b.imag; return c; } complex complex_sub(complex a, complex b) { complex c; c.real = a.real - b.real; c.imag = a.imag - b.imag; return c; } complex complex_mul(complex a, complex b) { complex c; c.real = a.real * b.real - a.imag * b.imag; c.imag = a.real * b.imag + a.imag * b.real; return c; } void dft(complex *x, int N) { complex X[N]; for (int k = 0; k < N; k++) { X[k].real = 0.0; X[k].imag = 0.0; for (int n = 0; n < N; n++) { complex Wnk; Wnk.real = cos(2 * PI * n * k / N); Wnk.imag = -sin(2 * PI * n * k / N); X[k] = complex_add(X[k], complex_mul(x[n], Wnk)); } } for (int k = 0; k < N; k++) { x[k] = X[k]; } } int main() { complex x[] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; int N = sizeof(x) / sizeof(complex); dft(x, N); for (int n = 0; n < N; n++) { printf("%f + %fi\n", x[n].real, x[n].imag); } return 0; } ``` 这个程序使用了一个复数结构体 `complex`,定义了三个复数运算 `complex_add`、`complex_sub` 和 `complex_mul`,以及一个离散傅里叶变换函数 `dft`。 在 `dft` 函数中,我们先定义了一个临时的复数数组 `X`,用于存储变换后的结果。然后,我们对每个频率分量 `k`,计算出对应的旋转因子 `Wnk`,并使用 `X[k]` 累加所有时域信号 `x[n]` 乘上旋转因子的结果。最后,我们再把计算出来的结果赋值回原始的信号数组 `x` 中。 在 `main` 函数中,我们定义了一个长度为 4 的测试信号数组 `x`,并调用 `dft` 函数对它进行了变换。最后,我们输出了变换后的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员-King.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值