2048这款游戏好几个月之前就火了,但是一直没有仔细玩过,这两天闲着无事研究了以下玩法,还是蛮有意思的。然后,这两天在学习Linux程序设计,于是就萌生了在Linux下写一个2048的想法,当然是运行在Terminal下的。闲话不多说,Let’s begin.
作为一只菜狗,在Terminal下只能用基础的curses函数库来做界面了,so,在编译的时候不要忘了 -lcurses。功能很简单,现在16个框中选两个分别赋值为2 ,然后按照上下左右的方向向对应方向合并相同的数字,并且在剩余的框中随机找一个赋值为2或4(据说出现的概率是9:1,所以我就按照9:1来设计了)。只做除了简单的功能,计分、失败这些功能还没加,找个时间再改吧。wsad代表上下左右,r代表replay,q是quit。好了,到了贴代码的环节了。如下
#include <unistd.h>
#include <curses.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LEN 4
#define SCR 1
void printGraphics(int arr[LEN][LEN]);
void movePoints(int arr[LEN][LEN],char);
void initilizeGraphics(int arr[LEN][LEN]);
int main(void)
{
int arrayOfGame[LEN][LEN];
char command;
int i,j;
#ifdef SCR
initscr();
move(3,20);
printw("%s","2048");
move(4,4);
printw("--------------------------------------");
move(10,4);
printw("--------------------------------------");
move(11,4);
printw("%s","Press 'q' to quit!");
move(12,4);
printw("%s","Press 'r' to replay!");
#endif
initilizeGraphics(arrayOfGame);
printGraphics(arrayOfGame);
command=getc(stdin);
while(command!='q')
{
if(command=='w'||command=='a'||command=='s'||command=='d')
{
movePoints(arrayOfGame,command);
printGraphics(arrayOfGame);
}
if(command=='r')
{
initilizeGraphics(arrayOfGame);
printGraphics(arrayOfGame);
}
command=getc(stdin);
}
#ifdef SCR
endwin();
#endif
return 0;
}
void initilizeGraphics(int arrGraphics[LEN][LEN])
{
int num,i,j;
for(i=0;i<LEN;i++)
for(j=0;j<LEN;j++)
arrGraphics[i][j]=0;
srand((unsigned)time(NULL));
num=rand()%16;
arrGraphics[num/LEN][num%LEN]=2;
srand((unsigned)time(NULL));
num=rand()%16;
while(arrGraphics[num/LEN][num%LEN]==2)
{
num=rand()%16;
}
arrGraphics[num/LEN][num%LEN]=2;
}
void printGraphics(int arrayGraphics[LEN][LEN])
{
int i=0,j=0;
for(i=0;i<LEN;i++)
{
#ifdef SCR
move(5+i,10);
#endif
for(j=0;j<LEN;j++)
{
#ifdef SCR
printw("%d\t",arrayGraphics[i][j]);
#else
printf("%d\t",arrayGraphics[i][j]);
#endif
}
#ifdef SCR
printw("\n");
#else
printf("\n");
#endif
}
#ifdef SCR
printw("\n");
refresh();
#else
printf("\n");
#endif
}
void movePoints(int arr[LEN][LEN],char comm)
{
int checkZero[16]={-1};
int backup[LEN][LEN]={0};
int i=0,j=0,k=0,num=0;
int changed=0;
int outNum;
for(i=0;i<LEN;i++)
{
for(j=0;j<LEN;j++)
backup[i][j]=arr[i][j];
}
switch(comm)
{
case 'w':
for(j=0;j<LEN;j++)
{
for(i=0;i<LEN;i++)
{
if(arr[i][j]!=0)
{
for(k=i+1;k<LEN;k++)
{
if(arr[k][j]!=0)
{
if(arr[k][j]==arr[i][j])
{
arr[i][j]*=2;
arr[k][j]=0;
break;
}
else break;
}
}
}
}
}
for(j=0;j<LEN;j++)
{
for(i=0;i<LEN;i++)
{
if(arr[i][j]==0)
{
for(k=i+1;k<LEN;k++)
{
if(arr[k][j]!=0)
{
arr[i][j]=arr[k][j];
arr[k][j]=0;
break;
}
}
}
}
}
break;
case 'a':
for(i=0;i<LEN;i++)
{
for(j=0;j<LEN;j++)
{
if(arr[i][j]!=0)
{
for(k=j+1;k<LEN;k++)
{
if(arr[i][k]!=0)
{
if(arr[i][k]==arr[i][j])
{
arr[i][j]*=2;
arr[i][k]=0;
break;
}
else break;
}
}
}
}
}
for(i=0;i<LEN;i++)
{
for(j=0;j<LEN;j++)
{
if(arr[i][j]==0)
{
for(k=j+1;k<LEN;k++)
{
if(arr[i][k]!=0)
{
arr[i][j]=arr[i][k];
arr[i][k]=0;
break;
}
}
}
}
}
break;
case 's':
for(j=0;j<LEN;j++)
{
for(i=LEN-1;i>=0;i--)
{
if(arr[i][j]!=0)
{
for(k=i-1;k>=0;k--)
{
if(arr[k][j]!=0)
{
if(arr[k][j]==arr[i][j])
{
arr[i][j]*=2;
arr[k][j]=0;
break;
}
else break;
}
}
}
}
}
for(j=0;j<LEN;j++)
{
for(i=LEN-1;i>=0;i--)
{
if(arr[i][j]==0)
{
for(k=i-1;k>=0;k--)
{
if(arr[k][j]!=0)
{
arr[i][j]=arr[k][j];
arr[k][j]=0;
break;
}
}
}
}
}
break;
case 'd':
for(i=0;i<LEN;i++)
{
for(j=LEN-1;j>=0;j--)
{
if(arr[i][j]!=0)
{
for(k=j-1;k>=0;k--)
{
if(arr[i][k]!=0)
{
if(arr[i][k]==arr[i][j])
{
arr[i][j]*=2;
arr[i][k]=0;
break;
}
else break;
}
}
}
}
}
for(i=0;i<LEN;i++)
{
for(j=LEN-1;j>=0;j--)
{
if(arr[i][j]==0)
{
for(k=j-1;k>=0;k--)
{
if(arr[i][k]!=0)
{
arr[i][j]=arr[i][k];
arr[i][k]=0;
break;
}
}
}
}
}
break;
}
k=0;
for(i=0;i<LEN;i++)
{
for(j=0;j<LEN;j++)
{
if(arr[i][j]==0)
{
checkZero[k]=i*LEN+j;
k++;
}
if(arr[i][j]!=backup[i][j]) //对比处理过后的数组和原数组,若发生改变则将changed置1
changed=1;
}
}
if((k>0)&&(changed==1)) //
{
srand((unsigned)time(NULL));
num=rand()%k;
outNum=((num%10)<9)?2:4; //
arr[checkZero[num]/LEN][checkZero[num]%LEN]=outNum;
}
}