c语言-2048

/*2048*/
#include<stdio.h>  
#include<conio.h>  
#include<stdlib.h> 
#include<time.h>   
 
 
//全局变量
int x[4][4]={0};
int score=0; 
int can_move;
 
int empty()  
{  
    int i,j;
	int n=0;
    for(i=0;i<4;i++) 
	{
		for(j=0;j<4;j++)
		{  
			if(x[i][j]==0)
			n++; 
		} 
	}
	return n;
} 

int check()
{
	int i,j;
	int a,b;
	if(empty() == 0)
	{
		a=b=0;
		for(i=0;i<4;i++) 
		{
			for(j=0;j<3;j++)
			{  
				if(x[i][j]==x[i][j+1])
				a=1;
			} 
		}
		for(j=0;j<4;j++) 
		{
			for(i=0;i<3;i++)
			{  
				if(x[i][j]==x[i+1][j])
				b=1;
			} 
		}
		if(a==0 && b==0)
			return 0;
		else
			return 1;	
	}
	else
		return 1;  
} 

int win()
{
	int i,j;
	int a=0;
	if(check())
	{
		for(i=0;i<4;i++) 
		{
			for(j=0;j<4;j++)
			{  
				if(x[i][j]==2048)
				a=1; 
			} 
		}
	}
	return a;
}

void add()  
{  
	int i,j;
	int n=0;
	if(empty() > 0)
	{
		while(n<16)
		{
			i=rand()%4;
			j=rand()%4;
			if(x[i][j] == 0)
			{
				if(rand()%100 < 80)
				{
					x[i][j]=2;
				}
				else
				{
					x[i][j]=4;	
				}
				break;
			}
			n++;
		}
	}     
} 


void move_up()
{
	int i,j,k;
	can_move=0;
	for(j=0;j<4;j++)
	{
		for(i=0;i<4;i++)
		{
			if(x[i][j] == 0)
			{
				for(k=i+1;k<4;k++)
				{
					if(x[k][j] != 0)
					{
						x[i][j]=x[k][j];
						x[k][j]=0;
						can_move=1;
						break;
					}
				}
			}
		}


		for(i=0;i<3;i++)
		{
			if(x[i][j] == x[i+1][j] && x[i][j] != 0)
			{
				x[i][j] *= 2;
				x[i+1][j]=0;
				can_move=1;
				score += x[i][j];
			}
		}

		for(i=0;i<4;i++)
		{
			if(x[i][j] == 0)
			{
				for(k=i+1;k<4;k++)
				{
					if(x[k][j] != 0)
					{
						x[i][j]=x[k][j];
						x[k][j]=0;
						break;
					}
				}
			}
		}
	}
	if(can_move == 1)
	{
		add();
	}
} 



void move_down()
{
	int i,j,k;
	can_move=0;
	for(j=0;j<4;j++)
	{
		for(i=3;i>=0;i--)
		{
			if(x[i][j] == 0)
			{
				for(k=i-1;k>=0;k--)
				{
					if(x[k][j] != 0)
					{
						x[i][j]=x[k][j];
						x[k][j]=0;
						can_move=1;
						break;
					}
				}
			}
		}


		for(i=3;i>0;i--)
		{
			if(x[i][j] == x[i-1][j] && x[i][j] != 0)
			{
				x[i][j] *= 2;
				x[i-1][j]=0;
				can_move=1;
				score += x[i][j];
			}
		}

		for(i=3;i>=0;i--)
		{
			if(x[i][j] == 0)
			{
				for(k=i-1;k>=0;k--)
				{
					if(x[k][j] != 0)
					{
						x[i][j]=x[k][j];
						x[k][j]=0;
						break;
					}
				}
			}
		}
	}
	if(can_move == 1)
	{
		add();
	}

} 


void move_left()
{
	int i,j,k;
	can_move=0;
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			if(x[i][j] == 0)
			{
				for(k=j+1;k<4;k++)
				{
					if(x[i][k] != 0)
					{
						x[i][j]=x[i][k];
						x[i][k]=0;
						can_move=1;
						break;
					}
				}
			}
		}


		for(j=0;j<3;j++)
		{
			if(x[i][j] == x[i][j+1] && x[i][j] != 0)
			{
				x[i][j] *= 2;
				x[i][j+1]=0;
				can_move=1;
				score += x[i][j];
			}
		}

		for(j=0;j<3;j++)
		{
			if(x[i][j] == 0)
			{
				for(k=j+1;k<4;k++)
				{
					if(x[i][k] != 0)
					{
						x[i][j]=x[i][k];
						x[i][k]=0;
						break;
					}
				}
			}
		}
	}
	if(can_move == 1)
	{
		add();
	}
} 


void move_right()
{
	int i,j,k;
	can_move=0;
	for(i=0;i<4;i++)
	{
		for(j=3;j>=0;j--)
		{
			if(x[i][j] == 0)
			{
				for(k=j-1;k>=0;k--)
				{
					if(x[i][k] != 0)
					{
						x[i][j]=x[i][k];
						x[i][k]=0;
						can_move=1;
						break;
					}
				}
			}
		}


		for(j=3;j>0;j--)
		{
			if(x[i][j] == x[i][j-1] && x[i][j] != 0)
			{
				x[i][j] *= 2;
				x[i][j-1]=0;
				can_move=1;
				score += x[i][j];
			}
		}

		for(j=3;j>=0;j--)
		{
			if(x[i][j] == 0)
			{
				for(k=j-1;k>=0;k--)
				{
					if(x[i][k] != 0)
					{
						x[i][j]=x[i][k];
						x[i][k]=0;
						break;
					}
				}
			}
		}
	}
	if(can_move == 1)
	{
		add();
	}
} 
 

  
void out()  
{  
	int i,j;
    system("cls");  
    for(i=0;i<10;i++)  
    {  
        if(i==0)printf("┏━━┳━━┳━━┳━━┓\n┃    ┃    ┃    ┃    ┃\n┃");  
        else if(i==8)printf("┗━━┻━━┻━━┻━━┛\n");  
        else if(i==9)printf(" SCORE:%d\n",score);  
        else if(i%2==0)printf("┣━━╋━━╋━━╋━━┫\n┃    ┃    ┃    ┃    ┃\n┃");  
        else  
        {  
            for(j=0;j<4;j++)  
            {  
                if(x[i/2][j]!=0)printf("%4d",x[i/2][j]); else printf("    ");  
                printf("┃");  
            }  
            printf("\n");  
        }  
          
    }
	if(win())
	{printf("You are win!");}
	if(!check())
	{printf("Game over!");}
}  
  

int main()  
{  
      
    unsigned char key;  
    add();
	add();
	out();       
    while(1)  
    {  
        key = getch();            	
		switch(key)  
        {  
            case 'w': move_up();       break;  
            case 'a': move_left();     break;  
            case 's': move_down();     break;  
            case 'd': move_right();    break;  
        } 
		out(); 
    }  
    return 0;  
}  

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值