2048

本文介绍了一个基于C语言的2048游戏实现方案,包括游戏的基本逻辑、地图生成、移动判断等功能,并通过Windows环境下的控制台进行交互。文章详细展示了如何使用随机数生成、数组操作等技术来实现游戏的核心玩法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>

int map[6][6];
int trans[5];
int move_judge;
char line_indentation[]="\t\t\t\t\t  ";
char list_indentation[]="\n\n\n\n\n\n\n\n";
char line_spacing[]="\n\n";

void Creat()
{
  int block_x,block_y;
  srand(time(0));
  do{
    block_x=rand()%4+1;
    block_y=rand()%4+1;
    }while(map[block_x][block_y]!=0);
  map[block_x][block_y]=(rand()%4+1)/4+1;
  return;
}

void Combine_stack(int test)
{
  int head=1;
  int void_judge=0;
  int stack[5]={233};

  for(int i=1;i<=4;i++)
  {
    if(trans[i]!=0)
    {
      stack[head]=trans[i];
      if(stack[head-1]!=0)
      {
        if(stack[head-1]==stack[head])
        {
          move_judge=1;
          stack[head-1]++;
          stack[head]=0;
          head++;
          continue;
        }
        else
        {
          if(void_judge)
            move_judge=1;
          head++;
          continue;
        }
      }
      else
      {
        stack[head-1]=trans[i];
        continue;
      }
    }
    else
      void_judge=1;
  }
  if(!test)
    for(int k=1;k<=4;k++)
      trans[k]=stack[k];
}

int Move(char dir,int test)
{
  move_judge=0;
  switch(dir)
  {
    case 'w':
      for(int j=1;j<=4;j++)
      {
        for(int i=1;i<=4;i++)
          trans[i]=map[i][j];
        Combine_stack(test);
        for(int i=1;i<=4;i++)
          map[i][j]=trans[i];
      }
      break;
    case 's':
      for(int j=1;j<=4;j++)
      {
        for(int i=4;i>=1;i--)
          trans[5-i]=map[i][j];
        Combine_stack(test);
        for(int i=4;i>=1;i--)
          map[i][j]=trans[5-i];
      }
      break;
    case 'a':
      for(int i=1;i<=4;i++)
      {
        for(int j=1;j<=4;j++)
          trans[j]=map[i][j];
        Combine_stack(test);
        for(int j=1;j<=4;j++)
          map[i][j]=trans[j];
      }
      break;
    case 'd':
      for(int i=1;i<=4;i++)
      {
        for(int j=4;j>=1;j--)
          trans[5-j]=map[i][j];
        Combine_stack(test);
        for(int j=4;j>=1;j--)
          map[i][j]=trans[5-j];
      }
      break;
  }
  return move_judge;
}

int Judge()
{
  for(int i=1;i<=4;i++)
    for(int j=1;j<=4;j++)
    {
      if(map[i][j]==11)
        return 0;
      if(map[i][j]==0)
        return 1;
    }
  return 0;
}

void Print()
{
  printf(list_indentation);
  for(int i=0;i<=5;i++)
  {
    printf(line_indentation);
    for(int j=0;j<=5;j++)
    {
      switch(map[i][j])
      {
        case -1: printf("  #  ");break;
        case  0: printf("     ");break;
        case  1: printf("  2  ");break;
        case  2: printf("  4  ");break;
        case  3: printf("  8  ");break;
        case  4: printf(" 16  ");break;
        case  5: printf(" 32  ");break;
        case  6: printf(" 64  ");break;
        case  7: printf(" 128 ");break;
        case  8: printf(" 256 ");break;
        case  9: printf(" 512 ");break;
        case 10: printf("1024 ");break;
        case 11: printf("2048 ");break;
      }
    }
    printf(line_spacing);
  }
  return;
}

int main()
{
  for(int i=0;i<=5;i++)
  {
    map[i][0]=map[i][5]=-1;
    if(i==0||i==5)
      for(int j=1;j<=4;j++)
        map[i][j]=-1;
  }
  Creat();Creat();

  system("cls");
  Print();

  char key;
  int judge;
  while(1)
  {
    key=getch();
    switch(key)
    {
      case 'W': case 'w': judge=Move('w',0);break;
      case 'S': case 's': judge=Move('s',0);break;
      case 'A': case 'a': judge=Move('a',0);break;
      case 'D': case 'd': judge=Move('d',0);break;
      default: continue;
    }
    if(judge)
      Creat();

    system("cls");
    Print();

    if(!Judge())
    {
      if(Move('w',1)||Move('s',1)||Move('a',1)||Move('d',1))
        continue;
      printf(line_indentation);
      printf("Game Over\n");
      printf(line_indentation);
      printf("Press any key to exit\n");
      return 1;
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值