用C语言写一个数字版的3阶魔方

从小学5年级开始,我就比较喜欢玩魔方。今天闲得没事,用了一个下午加一个晚上的时间,写了个电子版的3阶魔方,自己打乱,然后再亲自还原,测试后代码没问题。不同于现实生活中的魔方,我这个电子版的3阶魔方要用键盘来玩。不同的按键代表不同的转法,按一次就转一次。代码思路类似我曾经写的推箱子小游戏,本文就不再做一些详细的代码注释。请参见往期文章:C语言数组+内存编址+推箱子小游戏中的推箱子小游戏,里面有详细的代码注释。


思路描述:一个三阶的魔方总共有6个面,每个面有9个小块。三阶魔方总共有三层。总共有54个小块。由于不能填充颜色,我分别用1,2,3,4,5,6六个数字来填充每个面。每个小块中的数字我保存到一个一维数组中的,当然代码可以更改,因为保存到一个一维数组会使程序设计起来非常的繁琐,所以也可以用多个数组来保存数字。以下是运行的效果图:
在这里插入图片描述
第一行介绍了按键表,一开始玩家可能会因为不熟练感到很麻烦,不过熟悉了这些按键后,拼起来会很迅速。

  • T顶层左转
  • Y顶层右转
  • R左层上转
  • F左层下转
  • U右层上转
  • J右层下转
  • B底层左转
  • N底层右转
  • G后层逆时针
  • H后层顺时针
  • E竖中间层上转
  • D竖中间层下转
  • I横中间层左转
  • K横中间层右转
  • W前层逆时针
  • O前层顺时针
  • V前后中间层逆时针
  • M前后中间层顺时针

左视图:即从左边看的图,作为辅助面
底透视图:从魔方的上面往下看,透视上面的三层直接看底面的数字,作为辅助面
后透视图:从魔方的前面往后看,透视前三层直接看后面,作为拼魔方时的辅助面
竖中间层:最左层和最右层中间的一层
横中间层:最上面一层和最下面一层中间的一层
前后中间层:最前面的一层和最后面的一层中间的一层


代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int a[55]={0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6};
void PRINT();
void Play();
int main()
{
	system("color 70");
	Play();
	return 0;
}
void Play()
{
	char input;
	int t;
	while(1)
	{
		system("cls");
		PRINT();
		input = _getch();
		switch(input)
		{
			case'T':case't':
				t=a[1];a[1]=a[7];a[7]=a[9];a[9]=a[3];a[3]=t;t=a[2];a[2]=a[4];a[4]=a[8];a[8]=a[6];a[6]=t;t=a[37];a[37]=a[10];a[10]=a[19];a[19]=a[30];a[30]=t;
				t=a[38];a[38]=a[11];a[11]=a[20];a[20]=a[29];a[29]=t;t=a[39];a[39]=a[12];a[12]=a[21];a[21]=a[28];a[28]=t;
				break;
			case'Y':case'y':
				t=a[3];a[3]=a[9];a[9]=a[7];a[7]=a[1];a[1]=t;t=a[6];a[6]=a[8];a[8]=a[4];a[4]=a[2];a[2]=t;t=a[30];a[30]=a[19];a[19]=a[10];a[10]=a[37];a[37]=t;
				t=a[29];a[29]=a[20];a[20]=a[11];a[11]=a[38];a[38]=t;t=a[28];a[28]=a[21];a[21]=a[12];a[12]=a[39];a[39]=t;
				break; 
			case'R':case'r':
				t=a[39];a[39]=a[45];a[45]=a[43];a[43]=a[37];a[37]=t;t=a[42];a[42]=a[44];a[44]=a[40];a[40]=a[38];a[38]=t;t=a[10];a[10]=a[52];a[52]=a[34];a[34]=a[1];a[1]=t;
				t=a[4];a[4]=a[13];a[13]=a[49];a[49]=a[31];a[31]=t;t=a[7];a[7]=a[16];a[16]=a[46];a[46]=a[28];a[28]=t;
				break;
			case'F':case'f':
				t=a[37];a[37]=a[43];a[43]=a[45];a[45]=a[39];a[39]=t;t=a[38];a[38]=a[40];a[40]=a[44];a[44]=a[42];a[42]=t;t=a[1];a[1]=a[34];a[34]=a[52];a[52]=a[10];a[10]=t;
				t=a[31];a[31]=a[49];a[49]=a[13];a[13]=a[4];a[4]=t;t=a[28];a[28]=a[46];a[46]=a[16];a[16]=a[7];a[7]=t;
				break;
			case'U':case'u':
				t=a[3];a[3]=a[12];a[12]=a[54];a[54]=a[36];a[36]=t;t=a[9];a[9]=a[18];a[18]=a[48];a[48]=a[30];a[30]=t;t=a[6];a[6]=a[15];a[15]=a[51];a[51]=a[33];a[33]=t;
				t=a[19];a[19]=a[25];a[25]=a[27];a[27]=a[21];a[21]=t;t=a[22];a[22]=a[26];a[26]=a[24];a[24]=a[20];a[20]=t;
				break;
			case'J':case'j':
				t=a[36];a[36]=a[54];a[54]=a[12];a[12]=a[3];a[3]=t;t=a[30];a[30]=a[48];a[48]=a[18];a[18]=a[9];a[9]=t;t=a[33];a[33]=a[51];a[51]=a[15];a[15]=a[6];a[6]=t;
				t=a[21];a[21]=a[27];a[27]=a[25];a[25]=a[19];a[19]=t;t=a[20];a[20]=a[24];a[24]=a[26];a[26]=a[22];a[22]=t;
				break;
			case'B':case'b':
				t=a[46];a[46]=a[52];a[52]=a[54];a[54]=a[48];a[48]=t;t=a[49];a[49]=a[53];a[53]=a[51];a[51]=a[47];a[47]=t;t=a[43];a[43]=a[16];a[16]=a[25];a[25]=a[36];a[36]=t;
				t=a[44];a[44]=a[17];a[17]=a[26];a[26]=a[35];a[35]=t;t=a[45];a[45]=a[18];a[18]=a[27];a[27]=a[34];a[34]=t;
				break;
			case'N':case'n':
				t=a[48];a[48]=a[54];a[54]=a[52];a[52]=a[46];a[46]=t;t=a[47];a[47]=a[51];a[51]=a[53];a[53]=a[49];a[49]=t;t=a[36];a[36]=a[25];a[25]=a[16];a[16]=a[43];a[43]=t;
				t=a[35];a[35]=a[26];a[26]=a[17];a[17]=a[44];a[44]=t;t=a[34];a[34]=a[27];a[27]=a[18];a[18]=a[45];a[45]=t;
				break;
			case'G':case'g':
				t=a[28];a[28]=a[30];a[30]=a[36];a[36]=a[34];a[34]=t;t=a[29];a[29]=a[33];a[33]=a[35];a[35]=a[31];a[31]=t;t=a[1];a[1]=a[21];a[21]=a[48];a[48]=a[43];a[43]=t;
				t=a[2];a[2]=a[24];a[24]=a[47];a[47]=a[40];a[40]=t;t=a[3];a[3]=a[27];a[27]=a[46];a[46]=a[37];a[37]=t;
				break;
			case'H':case'h':
				t=a[34];a[34]=a[36];a[36]=a[30];a[30]=a[28];a[28]=t;t=a[31];a[31]=a[35];a[35]=a[33];a[33]=a[29];a[29]=t;t=a[43];a[43]=a[48];a[48]=a[21];a[21]=a[1];a[1]=t;
				t=a[40];a[40]=a[47];a[47]=a[24];a[24]=a[2];a[2]=t;t=a[37];a[37]=a[46];a[46]=a[27];a[27]=a[3];a[3]=t;
				break;
			case'E':case'e':
				t=a[2];a[2]=a[11];a[11]=a[53];a[53]=a[35];a[35]=t;t=a[5];a[5]=a[14];a[14]=a[50];a[50]=a[32];a[32]=t;t=a[8];a[8]=a[17];a[17]=a[47];a[47]=a[29];a[29]=t;
				break;
			case'D':case'd':
				t=a[35];a[35]=a[53];a[53]=a[11];a[11]=a[2];a[2]=t;t=a[32];a[32]=a[50];a[50]=a[14];a[14]=a[5];a[5]=t;t=a[29];a[29]=a[47];a[47]=a[17];a[17]=a[8];a[8]=t;
				break;
			case'I':case'i':
				t=a[40];a[40]=a[13];a[13]=a[22];a[22]=a[33];a[33]=t;t=a[41];a[41]=a[14];a[14]=a[23];a[23]=a[32];a[32]=t;t=a[42];a[42]=a[15];a[15]=a[24];a[24]=a[31];a[31]=t;
				break;
			case'K':case'k':
				t=a[33];a[33]=a[22];a[22]=a[13];a[13]=a[40];a[40]=t;t=a[32];a[32]=a[23];a[23]=a[14];a[14]=a[41];a[41]=t;t=a[31];a[31]=a[24];a[24]=a[15];a[15]=a[42];a[42]=t;
				break;
			case'W':case'w':
				t=a[10];a[10]=a[12];a[12]=a[18];a[18]=a[16];a[16]=t;t=a[11];a[11]=a[15];a[15]=a[17];a[17]=a[13];a[13]=t;t=a[7];a[7]=a[19];a[19]=a[54];a[54]=a[45];a[45]=t;
				t=a[8];a[8]=a[22];a[22]=a[53];a[53]=a[42];a[42]=t;t=a[9];a[9]=a[25];a[25]=a[52];a[52]=a[39];a[39]=t;
				break;
			case'O':case'o':
				t=a[16];a[16]=a[18];a[18]=a[12];a[12]=a[10];a[10]=t;t=a[13];a[13]=a[17];a[17]=a[15];a[15]=a[11];a[11]=t;t=a[45];a[45]=a[54];a[54]=a[19];a[19]=a[7];a[7]=t;
				t=a[42];a[42]=a[53];a[53]=a[22];a[22]=a[8];a[8]=t;t=a[39];a[39]=a[52];a[52]=a[25];a[25]=a[9];a[9]=t;
				break;
			case'V':case'v':
				t=a[4];a[4]=a[20];a[20]=a[51];a[51]=a[44];a[44]=t;t=a[5];a[5]=a[23];a[23]=a[50];a[50]=a[41];a[41]=t;t=a[6];a[6]=a[26];a[26]=a[49];a[49]=a[38];a[38]=t;
				break;
			case'M':case'm':
				t=a[44];a[44]=a[51];a[51]=a[20];a[20]=a[4];a[4]=t;t=a[41];a[41]=a[50];a[50]=a[23];a[23]=a[5];a[5]=t;t=a[38];a[38]=a[49];a[49]=a[26];a[26]=a[6];a[6]=t;
				break;
		}
	}
}
void PRINT()
{
	printf("按键表:T顶层左转 Y顶层右转 R左层上转 F左层下转 U右层上转 J右层下转 B底层左转 N底层右转 G后层逆时针 H后层顺时针\n");
	printf("        E竖中间层上转 D竖中间层下转 I横中间层左转 K横中间层右转 W前层逆时针 O前层顺时针 V前后中间层逆时针 M前后中间层顺时针\n"); 
	printf("\t\t\t\t\t\t\t\t____________________________________\n");
	printf("\t\t\t\t\t\t\t       /           /           /           /|\n");
	printf("\t\t\t\t\t\t\t      /     %d     /     %d     /     %d     / |\n",a[1],a[2],a[3]);	
	printf("\t\t\t\t\t\t\t     /___________/___________/___________/  |      后透视图:_______________________\n"); 
	printf("\t\t\t\t\t\t\t    /           /           /           /|  |               |       |       |       |\n");
	printf("\t\t\t\t\t前后中间层---------/     %d     /     %d     /     %d     / |%d |               |   %d   |   %d   |   %d   |\n",a[4],a[5],a[6],a[21],a[28],a[29],a[30]);
	printf("\t\t\t\t\t\t\t  /___________/___________/___________/  |  |               |_______|_______|_______|\n"); 
	printf("\t\t\t\t\t\t\t /           /           /           /|  | /|               |       |       |       |\n");
	printf("\t\t\t\t\t\t\t/     %d     /     %d     /     %d     / |%d |/ |               |   %d   |   %d   |   %d   |\n",a[7],a[8],a[9],a[20],a[31],a[32],a[33]);
	printf("\t\t\t\t\t\t       /___________/___________/___________/  |  |  |               |_______|_______|_______|\n");
	printf("\t\t\t\t\t\t       |           |           |           |  | /|%d |               |       |       |       |\n",a[24]);
	printf("\t\t\t\t\t\t       |           |           |           |%d |/ |  |               |   %d   |   %d   |   %d   |\n",a[19],a[34],a[35],a[36]);
	printf("\t左视图:_______________________\t\t       |     %d     |     %d     |     %d     |  |  | /|               |_______|_______|_______|\n",a[10],a[11],a[12]);
	printf("\t       |       |       |       |\t       |           |           |           | /|%d |/ |\n",a[23]);
	printf("\t       |   %d   |   %d   |   %d   |\t       |___________|___________|___________|/ |  |  |\n",a[37],a[38],a[39]);
	printf("\t       |_______|_______|_______|\t       |           |           |           |  | /|%d |\n",a[27]);
	printf("\t       |       |       |       |\t       |           |           |           |%d |/ |  |\n",a[22]);
	printf("\t       |   %d   |   %d   |   %d   |横中间层-------|     %d     |     %d     |     %d     |  |  | /\n",a[40],a[41],a[42],a[13],a[14],a[15]);
	printf("\t       |_______|_______|_______|\t       |           |           |           | /|%d |/\n",a[26]);
	printf("\t       |       |       |       |\t       |___________|___________|___________|/ |  |\n");
	printf("\t       |   %d   |   %d   |   %d   |\t       |           |           |           |  | /\n",a[43],a[44],a[45]);
	printf("\t       |_______|_______|_______|\t       |           |           |           |%d |/\n",a[25]);
	printf("\t\t\t\t\t\t       |     %d     |     %d     |     %d     |  |\n",a[16],a[17],a[18]);
	printf("\t\t\t\t\t\t       |           |           |           | /\n");
	printf("\t\t\t\t\t\t       |___________|___________|___________|/\n");
	printf("\t\t\t\t\t\t\t\t     竖中间层\n\n\n\n");
	printf("\t\t\t\t\t\t      底透视图:_______________________\t\n");
	printf("\t\t\t\t\t\t               |       |       |       |\n");
	printf("\t\t\t\t\t\t               |   %d   |   %d   |   %d   |\n",a[46],a[47],a[48]);
	printf("\t\t\t\t\t\t               |_______|_______|_______|\n");
	printf("\t\t\t\t\t\t               |       |       |       |\n");
	printf("\t\t\t\t\t\t               |   %d   |   %d   |   %d   |\n",a[49],a[50],a[51]);
	printf("\t\t\t\t\t\t               |_______|_______|_______|\n");
	printf("\t\t\t\t\t\t               |       |       |       |\n");
	printf("\t\t\t\t\t\t               |   %d   |   %d   |   %d   |\n",a[52],a[53],a[54]);
	printf("\t\t\t\t\t\t               |_______|_______|_______|\n");
} 

但愿我写的魔方会有人玩 /哭笑/

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jackey_Song_Odd

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

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

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

打赏作者

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

抵扣说明:

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

余额充值