#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
void swap(int *a,int *b); //子函数声明
int i,j,k,n,puzzle[81]={0},parity[81]={0}; //拼图数组和奇偶性数组
char ch; //用来记录拼图数组可以转换成西北矩阵,还是东南矩阵
printf("游戏说明\n");
printf("↑ :数字向上 ↓ :数字向下\n");
printf("← :数字向左 → :数字向右\n");
printf("Esc:退出程序 Space:重置矩阵\n");
printf("\n");
loop1:
printf("难度设置\nn:");
scanf("%d",&n);
loop2:
system("cls"); //清屏
srand((unsigned)time(NULL)); //动态获取数据
for(i=0;i<=n*n-1;i++)
{
loop3:
k=rand()%(n*n); //记录新的数据
for(j=0;j<i;j++) //和旧的数据进行比较,当新的数据
if(puzzle[j]==k) goto loop3; //出现过时,重新获取
if(j==i)
{
puzzle[j]=k; //当新的数据和旧的数据都不同时,将
} //数据放入拼图数组中
}
for(i=0;i<=n*n-1;i++)
{
parity[i]=puzzle[i]; //将拼图数组赋予奇偶性数组
}
for(i=0;i<=n*n-1;i++)
{
if(parity[i]==0) break; //找出奇偶性数组中0(空格)的位置
}
k=i;
for(j=1;j<=i/n;j++) //将0(空格)换到第1行
{
swap(&parity[k],&parity[k-n]);
k=k-n; //更新奇偶性数组中0(空格)的位置
}
for(j=1;j<=i%n;j++) //将0(空格)换到第1列
{
swap(&parity[k],&parity[k-1]);
k=k-1; //更新奇偶性数组中0(空格)的位置
}
k=0;
for(i=0;i<=n*n-1;i++)
for(j=i;j<=n*n-1;j++)
{
if(parity[i]>parity[j]) k++; //求奇偶性数组的“逆序数”
}
if(k%2==0&&n%2!=0) printf("┘┌\n\n"),ch='0'; //“逆序数”为偶数且“主流数”为奇数时,可以形成西北矩阵或东南矩阵
if(k%2==0&&n%2!=1) printf("┘\n\n"),ch='1'; //“逆序数”为偶数且“主流数”为偶数时,可以形成西北矩阵
if(k%2==1&&n%2!=1) printf("┌\n\n"),ch='2'; //“逆序数”为奇数且“主流数”为偶数时,可以形成东南矩阵
if(k%2==1&&n%2!=0) printf("请稍等..."),ch='3'; //“逆序数”为奇数且“主流数”为奇数时,无解矩阵
if(ch!='3')
{
for(i=0;i<=n*n-1;i++) //打印拼图数组
{
if(puzzle[i]==0) printf("%*c",n,' '); //是0(空格)的位置,打印空格
else printf("%-*d",n,puzzle[i]); //是数字的位置,打印对应宽度的数字
if((i+1)%n==0&&i!=n*n-1) printf("\n"); //每打印n个数字,换一行打印
}
}
else
{
system("cls"); //清屏
printf("请稍等...");
goto loop2;
}
while(1)
{
for(i=0;i<=n*n-1;i++)
{
if(puzzle[i]==0) break; //记录拼图数组中0(空格)的位置
}
switch(getch())
{
case 72:if( i<n*(n-1)) swap(&puzzle[i],&puzzle[i+n]);break; //数字向上
case 80:if( i>1*(n-1)) swap(&puzzle[i],&puzzle[i-n]);break; //数字向下
case 75:if((i+1)%n!=0) swap(&puzzle[i],&puzzle[i+1]);break; //数字向左
case 77:if((i+0)%n!=0) swap(&puzzle[i],&puzzle[i-1]);break; //数字向右
case 27:exit(0); //退出程序
case 32:goto loop2; //重置矩阵
}
system("cls"); //清屏
switch(ch)
{
case '0':printf("┘┌\n\n");break; //完成拼图的最终目标
case '1':printf("┘\n\n");break; //完成拼图的最终目标
case '2':printf("┌\n\n");break; //完成拼图的最终目标
}
for(i=0;i<=n*n-1;i++)
{
if(puzzle[i]==0) printf("%*c",n,' '); //是0(空格)的位置,打印空格
else printf("%-*d",n,puzzle[i]); //是数字的位置,打印对应宽度的数字
if((i+1)%n==0&&i!=n*n-1) printf("\n"); //每打印n个数字,换一行打印
}
i=j=0;
for(k=0;k<=n*n-2;k++)
{
if(puzzle[k]==k+0) i++; //判断拼图数组是否为西北矩阵
if(puzzle[k]==k+1) j++; //判断拼图数组是否为东南矩阵
}
if(i==n*n-1||j==n*n-1)
{ //是西北矩阵或是东南矩阵时,完成拼图
if(i==n*n-1) printf("\n\n恭喜你,“┘”拼图完成了!\n"); //打印完成标志
if(j==n*n-1) printf("\n\n恭喜你,“┌”拼图完成了!\n"); //打印完成标志
printf("Continue(y/n)?");
if(getch()=='y')
{
system("cls"); //清屏
goto loop1; //重新开始
}
else
{
exit(0); //退出程序
}
}
}
getch(); //显示运行结果
return(0); //正常运行返回0
}
void swap(int *a,int *b)
{
int c;
c=*a;
*a=*b;
*b=c;
}
数字拼图游戏(C语言)
5星 · 超过95%的资源 需积分: 9 136 浏览量
2011-06-04
03:29:58
上传
评论
收藏 7KB RAR 举报
nizuzhong0219860923
- 粉丝: 12
- 资源: 33
最新资源
- 杨辉三角(Pascal's Triangle)是一个在数学中非常著名的数列,它以一种特定的模式排列数字,内容以5种代码实例实现
- yolov5数据集:CT图像肾脏、结石检测(2类别,包含训练集、验证集)
- 电力102规约请求报文实录
- RTL8723 linux+安卓驱动 2020版本
- ISO 26262 道路车辆-功能安全-系统级产品开发
- 数据挖掘期末题 选择填空简答
- EKF在CTRV模型上的建模推导
- 用于:https://laoshifu.blog.csdn.net/article/details/138191428 多层创建
- 电力102规约(电能累计量的传输规约)培训
- 「常用」E9外部流程接口
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈