PS:以前曾经用Easyx图形库写了个拼图~不过写得很粗糙~不过用CMD加system("cls");这样更粗糙了~不过感觉可以改进一下不用system("cls");windows.h里面有调整光标位置语句~还可以调整背景颜色~不过我还是当回键盘侠算啦~最近没这么多精力去逐一完善~
[此贴子已经被作者于2017-6-3 11:16编辑过]
程序代码:#include "stdafx.h" //在vs、vc中可用,gcc编译器可注释掉
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
void setLocate(int x,int y)
{//设置字符显示位置
HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
COORD loc={x,y};
SetConsoleCursorPosition(hOut,loc);
}
void drawframe()
{//画外框
int i;
printf("┌─┬─┬─┬─┐ 空格键:产生随机地图 ESC键:退出 方向键:移动空格\n");
for(i=0;i<3;i++)
{
printf("│ │ │ │ │\n");
printf("├─┼─┼─┼─┤\n");
}
printf("│ │ │ │ │\n");
printf("└─┴─┴─┴─┘\n");
}
int testmove(int a[][4],int flg)
{//测试移动是否合法,合法则交换数据
int i,j,x,y,b[4][2]={-1,0,0,-1,0,1,1,0};
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(!a[i][j])
{
x=i;
y=j;
}
}
}
i=x+b[flg][0];
j=y+b[flg][1];
if(i<0||i>3||j<0||j>3)return 0;
a[i][j]^=a[x][y];
a[x][y]^=a[i][j];
a[i][j]^=a[x][y];
return 1;
}
int getkey()
{//获得键值
unsigned char a;
int n=0;
if(!kbhit())return 0;
a=getch();
if(a>127)
{
n=a*256;
a=getch();
}
n=n+a;
return n;
}
void rndmap(int a[][4])
{//随机地图产生
int i,j;
srand(clock());
for(i=0;i<4;i++)
for(j=0;j<4;j++)
a[i][j]=i*4+j+1;
a[3][3]=0;
for(i=0;i<128;i+=testmove(a,rand()%4)); //为减少代码,该语句有死循环的危险
}
void listmap(int a[][4])
{
int i,j,x,y;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
setLocate(j*4+2,i*2+1);
if(a[i][j])printf("%2d",a[i][j]);
else
{
x=j*4+2;
y=i*2+1;
printf(" ");
}
}
}
setLocate(x,y);
}
void main()
{
int a[4][4],key,i;
drawframe();
rndmap(a);
listmap(a);
while((key=getkey())!=27)
{
if(key==32||(key>57415&&key<57425))
{
if(key==32)rndmap(a);
else
{
i=(key-57416)/3+(key>57419);
testmove(a,i);
}
listmap(a);
}
}
}