C语言数迷游戏,请大家帮忙,多谢了

C语言数迷游戏,请大家帮忙,谢谢了
纠结了好几天的一个问题,麻烦大神帮帮忙。用C语言做一个数迷游戏。
要求用户输入数字数N,N+1平方根需为自然数。根据用户输入的值生成3x3,4x4,5x5的数迷。
随机生成数迷开始操作
示例用户输入15,生成4x4格。
C语言数迷游戏,请大家帮忙,多谢了
将哪个移动到3

C语言数迷游戏,请大家帮忙,多谢了
将哪个移动到4
如此步骤进行
最后完成输出移动过的次数。

C语言数迷游戏,请大家帮忙,多谢了
6次移动完成游戏
程序会提出警告当用户执行错误的移动。如果用户没有完成游戏并尝试退出,程序会请求保存未完成游戏。当程序再次启动时,将读取以保存游戏或开始一个新游戏,若开始新游戏保存游戏文件将被删除。

请大家帮帮忙,最好有注释,谢谢大家了C语言数迷游戏,请大家帮忙,多谢了

------解决方案--------------------
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<conio.h>
typedef struct
{
int size;
int sqrtSize;
int *numPtr;
}numFantasyStr;

typedef enum
{
KEY_EVENT_UP,
KEY_EVENT_DOWN,
KEY_EVENT_LEFT,
KEY_EVENT_RIGHT
}KeyEventEnum;

static numFantasyStr numFantasy ={0};

static bool checkSquareNum(int size)
{
int sqrtSize;

sqrtSize = (int)sqrt(size);

return (sqrtSize * sqrtSize == size)?true:false;
}

static void swap(int &a, int &b)
{
int tem = a;
a = b;
b = tem;
}

static bool initAndRandNum(int size)
{
int i;
int randNum;

numFantasy.size = size;
numFantasy.sqrtSize = (int)sqrt(size);
numFantasy.numPtr = (int*)malloc(sizeof(int) * numFantasy.size);
if(numFantasy.numPtr == NULL)
return false;

for(i = 0; i<size;i++)
numFantasy.numPtr[i] = i;

for(i = 0; i<size;i++)
{
randNum = rand()%size;
swap(numFantasy.numPtr[i], numFantasy.numPtr[randNum]);
}


return true;
}

static void freeNumPtr(void)
{
if(numFantasy.numPtr)
{
free(numFantasy.numPtr);
numFantasy.numPtr = NULL;
}

}

static void printResult(void)
{
int i;
for(i =0;i<numFantasy.size; i++)
{
if(i % numFantasy.sqrtSize == 0)
printf("\n");
if(numFantasy.numPtr[i] == 0)
printf("       **  ");
else
printf(" %8d  ",numFantasy.numPtr[i]);
}
printf("\n\n");
}

static bool numFantasyInit(int size)
{
if(checkSquareNum(size))
if(initAndRandNum(size))
return true;

return false;
}

static void numFantasyEvent(KeyEventEnum event)
{
int pos;
for(pos = 0; pos<numFantasy.size;pos++)
if(numFantasy.numPtr[pos] == 0)
break;


switch(event)
{
case KEY_EVENT_UP:
if(pos+numFantasy.sqrtSize< numFantasy.size )
swap(numFantasy.numPtr[pos], numFantasy.numPtr[pos+numFantasy.sqrtSize]);
break;

case KEY_EVENT_DOWN:
if(pos-numFantasy.sqrtSize >= 0 )
swap(numFantasy.numPtr[pos], numFantasy.numPtr[pos-numFantasy.sqrtSize]);
break;

case KEY_EVENT_LEFT:
if(pos %numFantasy.sqrtSize +1 < numFantasy.sqrtSize )