2048遊戲Terminal實現

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;
	}
}
相關文章
相關標籤/搜索