這個竟然不允許發,是在想不通爲什麼,是不是原標題是fifteen遊戲,然後百度認爲是15禁遊戲?如果是這樣,只能呵呵了。
申訴也沒有反應,只能重新改標題,再發一次。
參照上一篇“手動移動的八數碼程序相關(非算法)”而改編的,具體註釋看上一篇的,如果看不懂可以把每個函數單獨運行。
這個是4*4的15數碼,其實基本都差不多,move函數那邊有區別。
這個是公開課視頻上輸入數字移動,而上一篇是上下左右鍵移動。
哦,沒驗證won函數,也就是移動成功後會怎樣,要手動移動比較麻煩。
下面的圖片就是:
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
// 聲明
void clear(void);//清屏
void greet(void);//提示
void init(int array[]);//初始化
void draw(int array[]);//繪製
void move(int tile,int array[]);//移動
bool won(int array[]);//完成
//主函數
int
main()
{
int array[16];
int tile;
init(array);
do
{
clear();
greet();
draw(array);
if(won(array))
{
printf("你贏了!好棒!!\n");
break;
}
printf("\n");
printf("輸入要移動的數字: ");
scanf("%d",&tile);
while(getchar()!='\n');
if(tile<0 || tile>15)
{
printf("retry!\n");
}
//tile = GetInt();
move(tile,array);
}while(tile!=0);
}
//清屏函數
void
clear(void)
{
/*printf("\033[2J");
printf("\033[%d;%dH", 0, 0);
*/
system("cls");
}
//提示函數
void
greet(void)
{
//clear();
printf("類似華容道的數字遊戲,將其排列成1,2,3...15的順序吧!\n");
printf("如果想結束,除了按右上角的x,還可以輸入數字0,試試吧!\n");
printf("\n");
usleep(2000000);
}
//初始化函數
void
init(int array[])
{
// TODO
int i,j,sum;
srand((unsigned int)time(NULL));
do
{
sum=0;
for(i=0;i<16;i++)
array[i]=rand()%16;
for(i=0;i<16;i++)
{
for(j=0;j<i;j++)
{
if(array[j]==array[i])
{
array[i]=array[i]+1;
if(array[i]==16)
array[i]=0;
j=-1;
}
}
}
for(i=0;i<16;i++)
for(j=i+1;j<16;j++)
if(array[i]>array[j])
sum++;
}while(sum%2!=0);
}
//繪製函數
void
draw(int array[])
{
// TODO
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
if(array[i*4+j]==0)
printf("\t");
else
printf("%d\t",array[i*4+j]);
printf("\n");
}
}
//移動函數
void
move(int tile,int array[])
{
// TODO
int i;
for(i=0;i<16;i++)
if(array[i]==0)break;
if((i>=1)&&(tile==array[i-1]))
{
array[i]=array[i-1];
array[i-1]=0;
}
if((i<=14)&&(tile==array[i+1]))
{
array[i]=array[i+1];
array[i+1]=0;
}
if((i>=4)&&(tile==array[i-4]))
{
array[i]=array[i-4];
array[i-4]=0;
}
if((i<=11)&&(tile==array[i+4]))
{
array[i]=array[i+4];
array[i+4]=0;
}
/*
switch(tile)
{
case array[i-1]:j=i-1;break;
case array[i+1]:j=i+1;break;
case array[i-4]:j=i-4;break;
case array[i+4]:j=i+4;break;
}
if(j>=0&&j<=15)
{
array[i]=array[j];
array[j]=0;
}
*/
}
//完成函數
bool
won(int array[])
{
// TODO
int i;
for(i=0;i<14;i++)
if(array[i]!=i+1)
return false;
return true;
}