最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用C語言實現(xiàn)2048游戲

 更新時間:2021年07月28日 14:45:51   作者:he海ng  
這篇文章主要為大家詳細(xì)介紹了用C語言實現(xiàn)2048游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了用C語言實現(xiàn)2048游戲的具體代碼,供大家參考,具體內(nèi)容如下

我遇到的幾個問題:

問題1:如何顯示?

system("clear");//清屏

每次發(fā)生變化就清屏一次,再把內(nèi)容打印出來

問題2:怎么用鍵盤控制?

w,s,a,d-->上下左右

system("stty -icanon");//關(guān)閉緩沖區(qū),輸入字符無需回車直接接受

問題3:隨機位置?

用srand()與rand()產(chǎn)生隨機數(shù)(x,y),再判斷位置(x,y)是否為空格,不是空格就繼續(xù)產(chǎn)生隨機位置;若該位置為空格,則隨機賦值2或4.

代碼:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
 
int a[4][4];
int i,j,k;
 
int move_up()
{
 int f=0;//有移動過,則f=1,沒移動過則為0
 for(j=0;j<4;j++)
 {
  for(i=1;i<4;i++)
  {
   if(a[i][j]!=0)//找到不是0的數(shù)
   {
    for(k=0;k<i;k++)
    {
     if(a[k][j]==0)//其上的第一個0
     {
      a[k][j]=a[i][j];
      a[i][j]=0;
      f=1;
      break;
     }
    }
   }
  }
 }
 return f;
}
 
int move_down()
{
 int f=0;
 for(j=0;j<4;j++)
 {
  for(i=2;i>=0;i--)
  {
   if(a[i][j]!=0)
   {
    for(k=3;k>i;k--)
    {
     if(a[k][j]==0)
     {
      a[k][j]=a[i][j];
      a[i][j]=0;
      f=1;
      break;
     }
    }
   }
  }
 }
 return f;
}
 
int move_left()
{
 int f=0;
 for(i=0;i<4;i++)
 {
  for(j=1;j<4;j++)
  {
   if(a[i][j]!=0)
   {
    for(k=0;k<j;k++)
    {
     if(a[i][k]==0)
     {
      a[i][k]=a[i][j];
      a[i][j]=0;
      f=1;
      break;
     }
    }
   }
  }
 }
 return f;
}
 
int move_right()
{
 int f=0;
 for(i=0;i<4;i++)
 {
  for(j=2;j>=0;j--)
  {
   if(a[i][j]!=0)
   {
    for(k=3;k>j;k--)
    {
     if(a[i][k]==0)
     {
      a[i][k]=a[i][j];
      a[i][j]=0;
      f=1;
      break;
     }
    }
   }
  }
 }
 return f;
}
 
 
int up()
{
 int f=0;//合并過,f=1,沒和并過則為0
 //移動
 int f1=move_up();//移動過f1=1
 //合并
 for(j=0;j<4;j++)
 {
  for(i=0;i<3;i++)
  {
   if(a[i][j]==a[i+1][j]&&a[i][j]!=0)
   {
    a[i][j]=2*a[i][j];
    a[i+1][j]=0;
    f=1;
   }
  }
 }
 if(f==1)//若合并后可能產(chǎn)生的空位,再移動
  move_up();
 return (f||f1);//移動過或合并過,則返回1;否則返回0
}
 
int down()
{
 int f=0;
 //移動
 int f1=move_down();
 //合并
 for(j=0;j<4;j++)
 {
  for(i=3;i>0;i--)
  {
   if(a[i][j]==a[i-1][j]&&a[i][j]!=0)
   {
    a[i][j]=2*a[i][j];
    a[i-1][j]=0;
    f=1;
   }
  }
 }
 if(f==1)//若合并后產(chǎn)生的空位,
  move_down();
 return (f||f1);
}
 
int left()
{
 int f=0;
 //移動
 int f1=move_left();
 //合并
 for(i=0;i<4;i++)
 {
  for(j=0;j<3;j++)
  {
   if(a[i][j]==a[i][j+1]&&a[i][j]!=0)
   {
    a[i][j]=2*a[i][j];
    a[i][j+1]=0;
    f=1;
   }
  }
 }
 if(f==1)//若合并后產(chǎn)生的空位,
  move_left();
 return (f||f1);
}
 
int right()
{
 int f=0;
 //移動
 int f1=move_right();
 //合并
 for(i=3;i>=0;i--)
 {
  for(j=3;j>0;j--)
  {
   if(a[i][j]==a[i][j-1]&&a[i][j]!=0)
   {
    a[i][j]=2*a[i][j];
    a[i][j-1]=0;
    f=1;
   }
  }
 }
 if(f==1)//若合并后產(chǎn)生的空位,
  move_right();
 return (f||f1);
}
 
 
int ran()//隨機數(shù)
{
 int z[8]={2,2,2,2,2,2,2,4};//出現(xiàn)2的概率比出現(xiàn)4的概率大
 srand(time(NULL));
lb:
 i=rand()%4;
 j=rand()%4;
 //隨機位置的值為0,則隨機賦值2或4;否則繼續(xù)找隨機位置
 if(a[i][j]==0)
  a[i][j]=z[rand()%8];
 else
  goto lb;
}
 
 
int fail()//失敗
{
 int count=0;
 for(i=0;i<4;i++)
 {
  for(j=0;j<3;j++)
  {
   if(a[i][j]==a[i][j+1])//左右相鄰相等--》還沒輸
   {
    return 0;
   }
  }
 }
 for(i=0;i<3;i++)
 {
  for(j=0;j<4;j++)
  {
   if(a[i][j]==a[i+1][j])//上下相鄰相等--》還沒輸
   {
    return 0;
   }
  }
 }
 for(i=0;i<4;i++)
 {
  for(j=0;j<4;j++)
  {
   if(a[i][j]==0)//統(tǒng)計空格的個數(shù)
   {
    count++;
   }
  }
 }
 if(count==0)//沒有空格
 {
  printf("\n很遺憾!你離成功就差一點了!\n");
  return 1;
 }
 return 0;
}
 
 
 
int main()
{
 char n;//w,s,a,d-->上下左右
 system("stty -icanon");//關(guān)閉緩沖區(qū),輸入字符無需回車直接接受
 ran();
 while(1)
 {
  //產(chǎn)生隨機數(shù)
  ran();
  //顯示
  system("clear");//清屏
  printf("\n---------------------------------\n");
  for(i=0;i<4;i++)
  {
   printf("|");
   for(j=0;j<4;j++)
   {
    if(a[i][j]==0)
     printf("       |");
    else
     printf("%5d  |",a[i][j]);
   }
   printf("\n---------------------------------\n");
  }
  printf("\n\nw,s,a,d-->上下左右;ESC退出游戲!\n");
   
lab: 
  n=getchar();
  switch(n)
  {
   case 'w': //上
    if(0==up())//若既不移動又不合并
    {
     if(1==fail())//判斷是不是游戲失敗
      return -1;
     else
      goto lab;
    }
    break;
   case 's': //下
    if(0==down())
    {
     if(1==fail())
      return -1;
     else
      goto lab;
    }
    break;
   case 'a': //左
    if(0==left())
    {
     if(1==fail())
      return -1;
     else
      goto lab;
    }
    break;
   case 'd': //右
    if(0==right())
    {
     if(1==fail())
      return -1;
     else
      goto lab;
    }
    break;
   case 27: //ESC
    printf("\n退出游戲!\n");
    return 0;
   default:
    goto lab;
  }
  //判斷是否勝利
  for(i=0;i<4;i++)
  {
   for(j=0;j<4;j++)
   {
    if(a[i][j]==2048)//數(shù)值為2048,游戲勝利
    {
     printf("\n恭喜你!游戲勝利!\n");
     return 1;//退出
    } 
   }
  }
 }
 
 return 0;
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談C++中虛函數(shù)實現(xiàn)原理揭秘

    淺談C++中虛函數(shù)實現(xiàn)原理揭秘

    下面小編就為大家?guī)硪黄獪\談C++中虛函數(shù)實現(xiàn)原理揭秘。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • QT6安裝圖文教程(兼容QT5、QT4)

    QT6安裝圖文教程(兼容QT5、QT4)

    本文主要介紹了QT6安裝圖文教程(兼容QT5、QT4),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • codeblocks安裝及使用超詳細(xì)圖文教程

    codeblocks安裝及使用超詳細(xì)圖文教程

    這篇文章主要介紹了codeblocks安裝及使用教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • Visual Studio Code上添加小程序自動補全插件的操作方法

    Visual Studio Code上添加小程序自動補全插件的操作方法

    這篇文章主要介紹了Visual Studio Code上添加小程序自動補全插件的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • C++中函數(shù)的用法小結(jié)

    C++中函數(shù)的用法小結(jié)

    這篇文章主要為大家分享下本人在閱讀《C++ Primer》函數(shù)一章時的讀書總結(jié),需要的朋友可以參考下
    2014-02-02
  • C++?Cartographer源碼中關(guān)于傳感器的數(shù)據(jù)傳遞實現(xiàn)

    C++?Cartographer源碼中關(guān)于傳感器的數(shù)據(jù)傳遞實現(xiàn)

    這篇文章主要介紹了C++?Cartographer源碼中關(guān)于傳感器的數(shù)據(jù)傳遞實現(xiàn),前面已經(jīng)談到了Cartographer中添加軌跡的方法和傳感器的數(shù)據(jù)流動走向。發(fā)現(xiàn)在此調(diào)用了LaunchSubscribers這個函數(shù)來訂閱相關(guān)傳感器數(shù)據(jù)
    2023-03-03
  • 深入淺析STL vector用法

    深入淺析STL vector用法

    這篇文章給大家介紹 stl vector用法,主要知識點在如何恰當(dāng)?shù)氖褂盟鼈兊某蓡T函數(shù),涉及到條件函數(shù)和函數(shù)指針在迭代算法中的使用,對stl vector用法感興趣的朋友可以參考下本文
    2015-10-10
  • DevC++如何自定義頭文件并使用

    DevC++如何自定義頭文件并使用

    文章介紹了如何在DevC++中自定義頭文件并使用,首先創(chuàng)建一個項目,然后新建一個頭文件并編寫代碼,保存后創(chuàng)建一個源文件并將其放在項目目錄下
    2024-11-11
  • Vs2022環(huán)境下安裝低版本.net framework的實現(xiàn)步驟

    Vs2022環(huán)境下安裝低版本.net framework的實現(xiàn)步驟

    本文主要介紹了Vs2022環(huán)境下安裝低版本.net framework的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • set_new_handler(0)有什么用

    set_new_handler(0)有什么用

    本文主要介紹了set_new_handler(0)有什么用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評論

白玉县| 城市| 隆德县| 阿勒泰市| 永寿县| 温州市| 故城县| 苍梧县| 木里| 秦安县| 依安县| 聂荣县| 木里| 建德市| 新野县| 高青县| 宣汉县| 健康| 阳信县| 麟游县| 建宁县| 尖扎县| 惠安县| 沁水县| 富锦市| 北辰区| 鄂尔多斯市| 新郑市| 区。| 兴业县| 屯门区| 吕梁市| 台南县| 林州市| 蒲江县| 遂溪县| 余干县| 临沂市| 永州市| 赫章县| 镇原县|