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;
	}
}


转载于:https://my.oschina.net/u/257717/blog/414529

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值