假设有九个格子,其中八个格子为1~8的互不相同的数字,另外一个为空,用0表示,现在我们需要将1~8这些数字排列成1,2,3,4,5,6,7,8,0 就像手机上的拼图游戏一样。
程序设计思想:
1) 定义一个结构体,结构体成员为一个二维数组和“0”(空格)的坐标x,y
2)当我们进行上下左右操作时,程序应该交换0和其他数字的位置,编写上下左右函数实现交换,并应控制好越界问题。
3)另外每次交换数字之前,我们都要获取“0”的位置。 对应 find_xy() 函数。
4)获取上下左右键盘的asccii码。
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
5) 随机生成0~8的互不相同数字。
6)打印图形界面
程序如下:
1
2 3 |
#include
#include #include |
#define N 3
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
typedef struct {
int a[3][3];
int x;
int y;
}node;
void paint(node *p)
{
int row,col;
printf(“0相当于空位,移动数字至这个空位,将数字排列成\n1 2 3\n4 5 6\n7 8 0 就赢了!\t\t\t作者:bcoder.cn\n”);
printf(“┌”);
for (col = 0; col <N-1; col++) //输出一行
printf(“─┬”);
printf(“─┐\n”);
for(row=0;row<N;row++)
{
printf(“│”); //输出行号
for(col=0;col<N;col++)
{
printf(“%2d│”,p->a[row][col]);
}
printf(“\n”);
if (row < N – 1)
{
printf(“├”); //输出交叉线
for (col = 0; col < N – 1; col++) //输出一行
printf(“─┼”);
printf(“─┤\n”);
}
}
printf(“└”);
for (col = 0; col < N – 1; col++) //最后一行的横线
printf(“─┴”);
printf(“─┘\n”);
}
void find_xy(node *p){
int i,j;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(p->a[i][j]==0)
{
p->x=i;
p->y=j;
}
}
void xia(node *p)
{
int t;
find_xy(p);
if(p->x-1>=0)
{
t=p->a[p->x][p->y];
p->a[p->x][p->y]=p->a[p->x-1][p->y];
p->a[p->x-1][p->y]=t;
}
else
;
}
void shang(node *p)
{
int t;
find_xy(p);
if(p->x+1<N)
{
t=p->a[p->x][p->y];
p->a[p->x][p->y]=p->a[p->x+1][p->y];
p->a[p->x+1][p->y]=t;
}
else
;
}
void you(node *p)
{
int t;
find_xy(p);
if((p->y)-1>=0)
{
t=p->a[p->x][p->y];
p->a[p->x][p->y]=p->a[p->x][p->y-1];
p->a[p->x][p->y-1]=t;
}
else
;
}
void zuo(node *p)
{
int t;
find_xy(p);
if(p->y+1<N)
{
t=p->a[p->x][p->y];
p->a[p->x][p->y]=p->a[p->x][p->y+1];
p->a[p->x][p->y+1]=t;
}
else
;
}
void vin(node *p)
{
int i;
for(i=0;i<N*N-1;)
{
if(*(*(p->a)+i)==i+1)
i++;
else
break;
if(i==N*N-1)
printf(“you win !”);
}
}
void srand_num(node *p)
{
int i,index,b[N*N];
for(i=0;i<N*N;i++)
b[i]=i;
srand((unsigned)time(0));
for(i=0;i<N*N;)
{
index=rand()%9; //生成0~8的不重复随机数
if(b[index]!=-1)
{
*(*(p->a)+i)=b[index];
b[index]=-1;
++i;
}
}
}
void play(node *p)
{
int key;
while(1)
{
vin(p);
key=getch();
switch(key){
case UP: shang(p); system(“cls”); paint(p); break;
case DOWN: xia(p); system(“cls”); paint(p); break;
case LEFT: zuo(p); system(“cls”); paint(p); break;
case RIGHT: you(p); system(“cls”); paint(p); break;
default: ; break;
}
}
}
void main()
{
node p;
srand_num(&p);
paint(&p);
printf(“\n”);
play(&p);
}