欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言實(shí)現(xiàn)數(shù)字連連看

 更新時(shí)間:2021年09月08日 15:29:18   作者:weixin_45662694  
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)數(shù)字連連看游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語言實(shí)現(xiàn)數(shù)字連連看的具體代碼,供大家參考,具體內(nèi)容如下

要求

連連看小游戲開發(fā),使用二維數(shù)組來保存游戲地圖的數(shù)據(jù),實(shí)現(xiàn)連連看的核心功能。歡樂連連看的功能有:主界面、開始游戲、消子、判斷勝負(fù)、提示、重排、計(jì)時(shí)、游戲模式。

主界面

游戲主界面就是進(jìn)行各項(xiàng)操作的入口。

開始游戲

玩家選擇開始游戲模式,進(jìn)入游戲后,選擇開始游戲,系統(tǒng)根據(jù)設(shè)置隨機(jī)生成數(shù)字,以供玩家點(diǎn)擊消除。

消子

對玩家選中的兩張圖片進(jìn)行判斷,判斷是否符合消除規(guī)則。只有符合以下規(guī)則的圖片對才能被消除:

  • 一條直線連通
  • 兩條直線連通
  • 三條直線連通

如果可以消除,兩個(gè)數(shù)字變?yōu)?。如果不能消除,則保持原來的游戲地圖。

判斷勝負(fù)

當(dāng)游戲完成后,需要判斷游戲勝負(fù)。不同模式下判斷勝負(fù)的規(guī)則不同。

  • 基本模式時(shí),如果在五分鐘內(nèi)將游戲地圖的所有圖片都消除,則提示玩家勝利。
  • 休閑模式時(shí),如果游戲地圖中所有圖片都被消除,則提示玩家獲勝。

提示

可以提示界面上能夠消除的一對圖片。

計(jì)時(shí)

設(shè)定一定時(shí)間來輔助游戲是否結(jié)束。

游戲模式

游戲模式有:基本模式、休閑模式和關(guān)卡模式三種,可以根據(jù)是否定時(shí)等規(guī)則進(jìn)行設(shè)置。

代碼

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define WIDTH 10
#define HEIGHT 12
int datas[HEIGHT][WIDTH] = {0};

int Choose_type ();
void Creat_datas (int fol);
bool IsHLinked(int x1,int y1,int x2,int y2);
bool IsVLinked(int x1,int y1,int x2,int y2);
bool IsZeroTurnLinked(int x1,int y1,int x2, int y2);  //一條線 
bool IsOneTurnLinked(int x1, int y1, int x2,int y2);  //二條線  
bool IsTwoTurnLinked(int x1,int y1,int x2,int y2);  //三條線 
bool Judge_Answer (int x1,int y1,int x2,int y2);  //判斷是否可消去 
void Print_datas ();
bool Play_Game (int Flo);
bool Isblank ();
bool Help_ans ();
bool Basic_Play ();//基礎(chǔ) 
bool Relax_Play ();//休閑 
bool Win_Play ();//闖關(guān) 

int main()
{
 int Flo;
 Flo = Choose_type ();  // choose the type
 if (Flo == 0) return 0;
 srand(unsigned(time(NULL)));
 Creat_datas(Flo);  //creat the graph
 Print_datas ();
 bool ov;
 ov = Play_Game (Flo);
 if (ov == true){
  printf ("VICTORY");
 }
 else{
  printf ("FAILED");
 }
 return 0;
 }
 
 bool Basic_Play ()
 {
  long int t1 ,t2 = 0 ;
  int op = 1;
  int x1,y1,x2,y2;
  bool ANS;
  printf ("五分鐘計(jì)時(shí)開始\n");
  t1 = clock();
  while (t2 < 300000 && !Isblank() && op != 0 )
  {
   if (op == 1)
   {
    Print_datas ();
    printf("請輸入兩者的坐標(biāo)[x1 y1 x2 y2]:");   //從上到下,從左到右,先行后列 
    scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
    if (Judge_Answer (x1, y1, x2,y2))
    {
     datas[x1][y1] = datas[x2][y2] = 0;
     Print_datas ();
   }
    else{
    printf("錯誤");
    }
  }
  if (op == 2)
  { 
    ANS = Help_ans ();
    Print_datas ();
    if (ANS == false)  
    {
     printf ("已沒有可以消去的\n");
     return true;
    }
   }
  printf("是否繼續(xù)游戲 1、YES 0、NO 2、HELP:");
  scanf ("%d",&op);
  t2 = clock() - t1;
 }
 if (t2 > 299)
 {
  printf ("超時(shí)\n");
  return false;
 }
 if (Isblank()) return true;
 else return false;
}

bool Help_ans ()
{
 int k;
 for (int i = 1; i < 11;i++)
 {
  for (int j = 1; j < 9;j++)
  {
   if (datas[i][j] != 0)
   {
    k = j+1;
    for (int m = i; m < 11;m++)
    {
     for (int n = k; n < 9;n++)
     {
      if (datas[i][j] == datas[m][n])
      {
       if (Judge_Answer(i,j,m,n))
        {
         printf ("(%d,%d)  (%d,%d)\n",i,j,m,n);
         datas[i][j] = datas[m][n] = 0;
         return true;
        }
      }
     }
     k = 1;
    }
   }
  }
 }
 return false;
}

 
  bool Relax_Play ()
 {
  int op = 1;
  int x1,y1,x2,y2;
  bool ANS;
  while (!Isblank() && op != 0)   //G isn't blank
  {
   if (op == 1)
   {
    Print_datas ();
    printf("請輸入兩者的坐標(biāo)[x1 y1 x2 y2]:");
    scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
    if (Judge_Answer (x1, y1, x2,y2))
    {
     datas[x1][y1] = datas[x2][y2] = 0;
     Print_datas ();
    }
    else{
     printf("錯誤");
    }
   }
   if (op == 2)
   { 
    ANS = Help_ans ();
    Print_datas ();
    if (ANS == false)  
    {
     printf ("已沒有可以消去的\n");
     return true;
    }
   }
   printf("是否繼續(xù)游戲 1、YES 0、NO 2、HELP:");
   scanf ("%d",&op);
  }
  if (!Isblank()) return false;
  else  return true;
 }
 
  bool Win_Play ()
 {
  int op = 1;
  int x1,y1,x2,y2;
  bool ANS;
  while (!Isblank() && op != 0)   //G isn't blank
  {
   if (op == 1)
   {
    Print_datas ();
    printf("請輸入兩者的坐標(biāo)[x1 y1 x2 y2]:");
    scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
    if (Judge_Answer (x1, y1, x2,y2))
    {
     datas[x1][y1] = datas[x2][y2] = 0;
     Print_datas ();
    }
    else{
     printf("錯誤");
    }
   }
   printf("是否繼續(xù)游戲 1、YES 0、NO :");
   scanf ("%d",&op);
  }
  if (!Isblank() && Help_ans) return false;
  else 
   return true ;
 }
 
 bool Isblank ()
 {
  for(int j=1; j < 10 ; j++)
 {
  for (int i= 1; i< 8 ; i++)
  {
   if (datas[j][i] != 0)  return false;
  }
 }
 return true;
 }
 
bool Play_Game (int Flo)
 {
  bool Ans;
  if (Flo == 1)    //the basic type
  {
   printf ("基本模式:\n");
   Ans = Basic_Play ();
   return Ans;
  }
  if (Flo == 2)    //the relax type
  {
   printf ("休閑模式:\n");
   Ans = Relax_Play ();
   return Ans;
  }
  else    //the win type
  {
   printf ("第%d關(guān)游戲:\n",Flo - 2);
   Ans = Win_Play ();
   return Ans;
  }
 }
 
 void Print_datas ()
 {
  for(int j=1; j < 11 ; j++)
 {
  printf("\t\t");
  for (int i= 1; i< 9 ; i++)
  {
   printf("%d\t",datas[j][i]);
  }
  printf("\n");
 }
 }
 
 bool Judge_Answer (int x1,int y1,int x2,int y2)
 {
  if (datas [x1][y1] != datas[x2][y2] || datas [x1][y1] == 0 || datas [x2][y2] == 0 ) return false;
  if (x1 == x2  &&  y1 == y2)   return false;
  if (x1 > 11 || x2 > 11 || y1> 9 || y2 > 9) return false;
  if (x1 == x2 || y1 == y2)
  {
   if (IsZeroTurnLinked(x1,y1,x2,y2) || IsTwoTurnLinked(x1,y1,x2,y2))  return true;
  }
 else{
  if (IsOneTurnLinked(x1,y1,x2,y2) || IsTwoTurnLinked(x1,y1,x2,y2))  return true;
 }
 return false;
 }
 
 int Choose_type ()
 {
  printf("請選擇你要進(jìn)行的操作:1,開始游戲  2,結(jié)束游戲\n");
  int op;
  scanf("%d",&op);
  if (op == 1)
  {
   printf("\n請選擇游戲模式:1、基本模式  2、休閑模式  3、關(guān)卡模式\n");
  int ops;
  scanf ("%d",&ops);
  if (ops == 1) return 1;
  if (ops == 2) return 2;
  if (ops == 3)
  {
   printf("\n請選擇你選擇的關(guān)卡3-16:");
   int opsd;
   scanf ("%d",&opsd);
   return opsd;
  }
  }
  if (op == 2) return 0;
 }
 
void Creat_datas (int fol)
 {
  int tmpDatas[80] = {0}; // 定義一個(gè)臨時(shí)數(shù)組用于存放
  int PicNum[] = {3,4,5,1,2,7,9,6,8,44,78,12,90,33,34};
 int Count = 0,i, j, d = 0,Pic,tem,t;
 Pic = 8 * 10 / (fol + 9 );
 for(j=0; j < 80 ; j++)
 {
  tmpDatas[j] = PicNum[d];
  Count++;
  if (Count == Pic )
  {
   d++; 
   Count = 0; 
  }
 }
 d = 80;
 for(j=1;j < HEIGHT - 1;j++)
  for (i = 1;i < WIDTH - 1; i++)
  {
   t = rand() % d;   //Fisher-Yates Shuffle 
   tem = tmpDatas[t];
   tmpDatas[t] = tmpDatas[d -1];
   tmpDatas[d - 1] = tem;
   datas[j][i] = tmpDatas[d -1];
   d--;
  }
}



bool IsHLinked(int x1,int y1,int x2,int y2) //橫向是否連接
{
 int minY,maxY;
 if (x1 != x2)  return false;
 if (y1 < y2){
  minY = y1;
  maxY = y2;
 }
 else{
  minY = y2;
  maxY = y1;
 } 
 if (maxY - minY == 1) return true;
 for ( int i = minY +1; i < maxY ; i++) //從左到右檢查中間的點(diǎn)是不是空的
 {
  if (datas[x1][i] != 0)  return false;
 }
 return true;
}

bool IsVLinked(int x1,int y1,int x2,int y2) //縱向是否連接
{
 int minX,maxX;
 if (y1 != y2)  return false;
 if (x1 < x2){
  minX = x1;
  maxX = x2;
 }
 else{
  minX = x2;
  maxX = x1;
 }
 if (maxX - minX == 1) return true; 
 for ( int i = minX +1; i < maxX ; i++) 
 {
  if (datas[i][y1] != 0) return false;
 }
 return true;
}



bool IsZeroTurnLinked(int x1,int y1,int x2, int y2)  //不轉(zhuǎn)折時(shí)判斷
{
 if (IsHLinked(x1, y1, x2,y2))
 {
  return true ;
 }
 if (IsVLinked(x1, y1, x2, y2))
 {
  return true ;
 }
 return false;
}



bool IsOneTurnLinked(int x1, int y1, int x2,int y2) //轉(zhuǎn)折一次
{
 int tmpX[2] = { x1, x2 };
 int tmpY[2] = { y2, y1 };
 for (int i = 0; i < 2; i++)
  {
   if (datas[tmpX[i]][tmpY[i]] != 0) continue;
   if (IsZeroTurnLinked( tmpX[i], tmpY[i], x1, y1) && IsZeroTurnLinked( tmpX[i], tmpY[i], x2,y2))
   {
    return true;
   }
  }
 return false;
}


bool IsTwoTurnLinked(int x1,int y1,int x2,int y2)
{
 int j, tmpX1,tmpY1,tmpX2,tmpY2;
 //縱向遍歷所有點(diǎn)
 tmpX1 = x1;
 for ( j = 0; j < WIDTH; j++)
 {
  tmpY1 = j;
  if (j == y1)  continue; 
  if (tmpX1 == x2 && tmpY1 == y2) continue; //重合
  tmpX2 = x2;
  tmpY2 = tmpY1;
  if (datas[tmpX1][tmpY1] != 0 || datas[tmpX2][tmpY2] != 0) continue;
  if (IsZeroTurnLinked(tmpX1, tmpY1, tmpX2, tmpY2) && IsZeroTurnLinked(tmpX1, tmpY1, x1, y1) && IsZeroTurnLinked(tmpX2, tmpY2, x2, y2))
   return true;
 }
 //橫向遍歷所有點(diǎn)
 tmpY1 = y1;
 for ( j = 0; j < HEIGHT; j++)
 {
  tmpX1 = j;
  if (j == x1)  continue; 
  if (tmpY1 == y2 && tmpX1 == x2) continue; //重合
  tmpY2 = y2;
  tmpX2 = tmpX1;
  if (datas[tmpX1][tmpY1] != 0 || datas[tmpX2][tmpY2] != 0) continue;
  if (IsZeroTurnLinked(tmpX1, tmpY1, tmpX2, tmpY2) && IsZeroTurnLinked(tmpX1, tmpY1, x1, y1) && IsZeroTurnLinked(tmpX2, tmpY2, x2, y2))
  {
   return true;
  }
 }
 return false;
 }

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

相關(guān)文章

  • C++之boost::array的用法

    C++之boost::array的用法

    這篇文章主要介紹了C++之boost::array的用法,以實(shí)例的形式簡單講述了靜態(tài)數(shù)組的容器boost::array的使用技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C++ opencv霍夫圓檢測使用案例詳解

    C++ opencv霍夫圓檢測使用案例詳解

    這篇文章主要介紹了C++ opencv霍夫圓檢測使用案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • QT通過C++線程池運(yùn)行Lambda自定義函數(shù)流程詳解

    QT通過C++線程池運(yùn)行Lambda自定義函數(shù)流程詳解

    最近在接觸公司的一個(gè)QT桌面項(xiàng)目,其中里面有一個(gè)模塊是使用線程池去運(yùn)行自定義函數(shù)的,自己潛心研究那個(gè)線程池代碼一天,發(fā)現(xiàn)研究不透,看不懂,里面幾乎都是使用C++11的新特性進(jìn)行編寫
    2022-10-10
  • Clion下vcpkg的使用詳解

    Clion下vcpkg的使用詳解

    這篇文章主要介紹了Clion下vcpkg的使用詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • C++ 模擬實(shí)現(xiàn)list(迭代器)實(shí)現(xiàn)代碼

    C++ 模擬實(shí)現(xiàn)list(迭代器)實(shí)現(xiàn)代碼

    這篇文章主要介紹了C++ 模擬實(shí)現(xiàn)list(迭代器)實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語言實(shí)現(xiàn)教務(wù)管理系統(tǒng)

    C語言實(shí)現(xiàn)教務(wù)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)教務(wù)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Qt QThreadPool線程池的實(shí)現(xiàn)

    Qt QThreadPool線程池的實(shí)現(xiàn)

    QThreadPool管理和重新設(shè)計(jì)單個(gè)QThread對象,以幫助降低使用線程的程序中的線程創(chuàng)建成本,本文主要介紹了Qt QThreadPool線程池的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2007-03-03
  • VS中scanf為何會報(bào)錯詳解

    VS中scanf為何會報(bào)錯詳解

    在我們剛使用vs時(shí),在使用scanf函數(shù)時(shí)常會遇到報(bào)錯提醒,下面這篇文章主要給大家介紹了關(guān)于VS中scanf為何會報(bào)錯的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • VC++實(shí)現(xiàn)通過API來查看程序錯誤信息的方法

    VC++實(shí)現(xiàn)通過API來查看程序錯誤信息的方法

    這篇文章主要介紹了VC++實(shí)現(xiàn)通過API來查看程序錯誤信息的方法,非常實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • C++超詳細(xì)講解引用和指針

    C++超詳細(xì)講解引用和指針

    引用是C++一個(gè)很重要的特性,顧名思義是某一個(gè)變量或?qū)ο蟮膭e名,對引用的操作與對其所綁定的變量或?qū)ο蟮牟僮魍耆葍r(jià),這篇文章主要給大家總結(jié)介紹了C++中引用的相關(guān)知識點(diǎn),需要的朋友可以參考下
    2022-06-06

最新評論