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

C語(yǔ)言構(gòu)建連連看游戲(矩陣方式)

 更新時(shí)間:2021年09月10日 10:36:39   作者:晴松-  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言構(gòu)建連連看游戲,采用矩陣方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

C語(yǔ)言構(gòu)建連連看游戲的具體代碼,供大家參考,具體內(nèi)容如下

設(shè)計(jì)要求

用數(shù)字+英文字母,采用文本輸出的方式。每次輸出一個(gè)8*10的矩形,然后等待玩家輸入兩個(gè)數(shù)字或字母的坐標(biāo),如果滿足消除規(guī)則就輸出新的矩形。
注意:考慮類(lèi)似迷宮的處理方式,在8 * 10矩形之外加一層空心圍墻,可以用來(lái)連接。大家體驗(yàn)一下連連看游戲就可以發(fā)現(xiàn)這個(gè)規(guī)則。判斷是否能連,用的是10 *12的數(shù)組,最外層添加的是空格,可用來(lái)輔助連接。

分析

大綱(簡(jiǎn)化):

/**********************************/
 //1生成游戲桌面*
  //1.1選項(xiàng)
 //2生成游戲局*
 //3游戲操作
  //3.1選擇方塊
  //3.2判斷是否有路徑*
  //3.3修改矩陣圖層和迷宮圖層
  //3.4刷新頁(yè)面
 //4游戲勝利條件
  //4.1時(shí)間限制
  //4.2游戲結(jié)束
  //4.3結(jié)算游戲*

/********************************/

本設(shè)計(jì)采用了雙圖層的思路,分別設(shè)計(jì)顯示圖層與連連看內(nèi)部游戲圖層。
顯示圖層方便用戶操作,
內(nèi)部游戲圖層方便進(jìn)行連連看消除處理。

設(shè)計(jì)

生成游戲桌面

#include<Windows.h>    //生成游戲界面
#include<stdio.h>
#define GameWindoHight 16
#define GameWindoWidth 75

void GameInit()  //生成游戲主界面
{
 //界定游戲桌面大小 
 char chCmd[32];
 sprintf(chCmd,"mode con cols=%d lines=%d",GameWindoWidth,GameWindoHight);
 system(chCmd);

 //游戲引導(dǎo) 
 printf("\t\t\t歡迎進(jìn)入矩陣連連看游戲");    printf("\n\n");
 printf("\t\t\t---- 游戲開(kāi)始----\t\t");     printf("\n\n");
 printf("\t\t\t  請(qǐng)選擇游戲模式 \t\t");     printf("\n\n");
 printf("\t\t\t----1基本模式----\t\t");     printf("\n");  //正向計(jì)時(shí) 
 printf("\t\t\t----2休閑模式----\t\t");     printf("\n");  //不計(jì)時(shí) 
 printf("\t\t\t----3關(guān)卡模式----\t\t");     printf("\n\n");  //倒計(jì)時(shí) 
 printf("\t\t\t----4退出游戲----\t\t");     printf("\n");  //退出程序
}

生成游戲局

內(nèi)部(迷宮)圖層:

#define MaxSize 100
int mg[10][12]= {  //迷宮圖層 
 {0,0,0,0,0,0,0,0,0,0,0,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,0,0,0,0,0,0,0,0,0,0,0}
 };
 struct MMP 
{ 
 int i,j;   //位置
 int di;    //下一步可走
} St[MaxSize];

bool mgpath(int xi, int yi, int xe, int ye)   //判斷是否有路徑
{  int i,j, i1,j1,di;
 int mg1[10][12];
 memcpy(mg1,mg,sizeof(mg));
 bool find;
 int top=-1;
 top++;
 St[top].i=xi;
 St[top].j=yi;
 St[top].di=-1;
 mg1[xi][yi]=-1;
 mg1[xe][ye]=0;
 while (top>-1)
 {  i= St[top].i;j= St[top].j;
  di=St[top].di;
  if (i==xe&& j== ye) 
  {
   return true;
  } 
  find= false;
  while (di<4 && !find)
  {
   di++; 
   switch(di)
   { 
    case 0:i1=i-1; j1=j;break;
    case 1:i1=i;j1=j+1; break;
    case 2:i1=i+1; j1=j;break;
    case 3:i1=i;j1=j-1; break;
   }
   if(i1<12&&j1<10)
   {
    if (mg1[i1][j1]==0) find=true;
   }
  }
  if (find)
  { St[top].di=di;
   top++;St[top].i=i1;St[top].j=j1;
   St[top].di= - 1;
   mg1[i1][j1]= -1;
  }
  else
  {
   mg1[i][j]=0;
   top-- ;
  } 
 } 
 return false;
}

用戶(棋局)圖層:

棋子生成階段:

typedef struct pieces
{
 int data_num;
 int data_letter;
} Piece;    //棋子

typedef struct rand_factor
{
 int data;
 int data_times;
} factor;    //隨機(jī)因子屬性——用于隨機(jī)棋子

 void Rand_Num(int a[],int Num_Range,int T)  //生成棋子屬性——作為棋子生成階段的一部分
{
 srand((unsigned)time(NULL));//生成隨機(jī)數(shù)種子
 int n=0;
 int i=0;
 factor b[Num_Range];
 for(int ii=0;ii<Num_Range;ii++)
 {
//  b[ii].data=ii;     
  b[ii].data_times=0;
 }
 while(n<Num_Range*T){
  int m=rand()%Num_Range;
  if(b[m].data_times<T){
   a[i]=m;
   b[m].data_times++;
   m=rand()%Num_Range;
   i++;
   n++;
  }
  else
   continue;
 }
 } 
 
 void ChesspiecesInit(Piece* pieces)  //棋子生成
{
 
 int data_num[80];
 Rand_Num(data_num,10,8);
 int Num_Range=10;
 for(int num=0;num<Num_Range*8;num++)
 {
  pieces[num].data_num=data_num[num];   //數(shù)值 
 }

 for(int i=0;i<Num_Range;i++)
 {
  int letter[8];
  Rand_Num(letter,8,1);
  int k=0;
  int j=0;
  while(k<8)
  {
   if(pieces[j].data_num==i)
   {
    pieces[j].data_letter=letter[k]; //顏色 
    k++;
   }
   j++;
  }
 }
} 

棋盤(pán)生成階段

void CameBordInit(Piece* pieces)
{
 for(int i=0;i<10;i++)
  printf("------%d",i+1);
 printf("\n");
 for(int i=0;i<8;i++)
 {
  printf("[%d]",i+1);
  for(int j=0;j<10;j++)
  {
   if(pieces[j+i*10].data_num!=10&&pieces[j+i*10].data_letter!=10)
    printf(" <%d,%c> ",pieces[j+i*10].data_num,35+pieces[j+i*10].data_letter%4);
   else
    printf(" <*v*> ");   //本來(lái)想打空格的,可是這個(gè)表情太可愛(ài)了!(可以選擇全空格輸出,界面會(huì)清晰一點(diǎn)
  }
  printf("\n");
 }
}

游戲操作

選擇——簡(jiǎn)單粗暴

scanf("%d,%d",&x1,&y1);
scanf("%d,%d",&x2,&y2);

判斷路徑等行為發(fā)生在迷宮圖層:

bool mgpath(int xi, int yi, int xe, int ye)
{  int i,j, i1,j1,di;
 int mg1[10][12];
 memcpy(mg1,mg,sizeof(mg));
 bool find;
 int top=-1;
 top++;
 St[top].i=xi;
 St[top].j=yi;
 St[top].di=-1;
 mg1[xi][yi]=-1;
 mg1[xe][ye]=0;
 while (top>-1)
 {  i= St[top].i;j= St[top].j;
  di=St[top].di;
  if (i==xe&& j== ye) 
  {
   return true;
  } 
  find= false;
  while (di<4 && !find)
  {
   di++; 
   switch(di)
   { 
    case 0:i1=i-1; j1=j;break;
    case 1:i1=i;j1=j+1; break;
    case 2:i1=i+1; j1=j;break;
    case 3:i1=i;j1=j-1; break;
   }
   if(i1<12&&j1<10)
   {
    if (mg1[i1][j1]==0) find=true;
   }
  }
  if (find)
  { St[top].di=di;
   top++;St[top].i=i1;St[top].j=j1;
   St[top].di= - 1;
   mg1[i1][j1]= -1;
  }
  else
  {
   mg1[i][j]=0;
   top-- ;
  } 
 } 
 return false;
}

修改顯示圖層:

void GamePlay(int x1,int y1,int x2,int y2,Piece* pieces)
{
 if(pieces[y1*10+x1].data_num==pieces[y2*10+x2].data_num)
  if(abs(pieces[y1*10+x1].data_letter-pieces[y2*10+x2].data_letter)==4)
  {
   if(mgpath(x1+1, y1+1, x2+1, y2+1))
   {
    pieces[y1*10+x1].data_letter=pieces[y1*10+x1].data_num=pieces[y2*10+x2].data_letter=pieces[y2*10+x2].data_num=10;
    mg[x1+1][y1+1]=mg[x2+1][y2+1]=0;
   } 
  }
}
  //配合上棋盤(pán)生成函數(shù)中的
 else
  printf(" <*v*> "); 

刷新界面用:

system("cls");  //簡(jiǎn)單粗暴

游戲勝利(結(jié)束)

判斷結(jié)束:(暫不解釋,看代碼理解)

1.時(shí)間限制
2.自主退出

時(shí)間限制使用系統(tǒng)計(jì)時(shí)
自動(dòng)退出引導(dǎo)用戶輸入特定符號(hào)

游戲結(jié)算:輸出分?jǐn)?shù)

void Game_Score()
{
 int score=80;
 for(int i=0;i<10;i++)
  for(int j=0;j<12;j++)
   score=score-mg[i][j];
 printf("\t\t\t您現(xiàn)在的得分是:%d \n",score);
}

完整程序

/*******************************************************************/
 //1生成游戲桌面
  //1.1選項(xiàng)
 //2生成游戲局
 //3游戲操作
  //3.1選擇方塊
  //3.2判斷是否有路徑
  //3.3判斷是否消除
  //3.4消除并刷新頁(yè)面
 //4游戲勝利條件
  //4.1時(shí)間限制
  //4.2游戲結(jié)束
  //4.3判斷是否勝利 

/*******************************************************************/ 
#include<Windows.h>    //生成游戲界面
#include<stdio.h>
#define GameWindoHight 16
#define GameWindoWidth 75

#include<stdio.h>  //生成棋局圖層 
#include<time.h>
#include<stdlib.h>

#include"sqstack.cpp"

#include<time.h>

#define MaxSize 100
typedef struct rand_factor
{
 int data;
 int data_times;
} factor;    //隨機(jī)到你了嗎? 

typedef struct pieces
{
 int data_num;
 int data_letter;
} Piece;

int mg[10][12]= {  //路徑圖層 
 {0,0,0,0,0,0,0,0,0,0,0,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,1,1,1,1,1,1,1,1,1,1,0},
 {0,0,0,0,0,0,0,0,0,0,0,0}
 };

struct MMP 
{ 
 int i,j;
 int di;
} St[MaxSize];

double DDL=600;

 //1生成游戲桌面
void GameInit()
{
 //界定游戲桌面大小 
 char chCmd[32];
 sprintf(chCmd,"mode con cols=%d lines=%d",GameWindoWidth,GameWindoHight);
 system(chCmd);

// printf("-----------------李云龍應(yīng)約召喚而來(lái)!---------------");printf("\n");
// printf("-------------你他娘的就是老子的Master嗎?-----------");printf("\n\n");
 //游戲引導(dǎo) 
 printf("\t\t      歡迎進(jìn)入矩陣連連看游戲");    printf("\n\n");
 printf("\t\t\t---- 游戲開(kāi)始----\t\t");     printf("\n\n");
 printf("\t\t\t  請(qǐng)選擇游戲模式 \t\t");     printf("\n\n");
 printf("\t\t\t----1基本模式----\t\t");     printf("\n");  //正向計(jì)時(shí) 
 printf("\t\t\t----2休閑模式----\t\t");     printf("\n");  //不計(jì)時(shí) 
 printf("\t\t\t----3關(guān)卡模式----\t\t");     printf("\n");  //倒計(jì)時(shí) 
// printf("\t\t----4米斯達(dá)罵罵咧咧地退出房間了……"); printf("\n");  //退出程序 
 printf("\t\t\t----4退出游戲----\t\t");     printf("\n");  //退出程序
} 
 //生成棋局 
void Rand_Num(int a[],int Num_Range,int T)
{
 srand((unsigned)time(NULL));//生成隨機(jī)數(shù)的種子
 int n=0;
 int i=0;
 factor b[Num_Range];
 for(int ii=0;ii<Num_Range;ii++)
 {
//  b[ii].data=ii;     
  b[ii].data_times=0;
 }
 while(n<Num_Range*T){
  int m=rand()%Num_Range;
  if(b[m].data_times<T){
   a[i]=m;
   b[m].data_times++;
   m=rand()%Num_Range;
   i++;
   n++;
  }
  else
   continue;
 }
 } 

void ChesspiecesInit(Piece* pieces)
{
 
 int data_num[80];
 Rand_Num(data_num,10,8);
 int Num_Range=10;
 for(int num=0;num<Num_Range*8;num++)
 {
  pieces[num].data_num=data_num[num];   //數(shù)值 
 }

 for(int i=0;i<Num_Range;i++)
 {
  int letter[8];
  Rand_Num(letter,8,1);
  int k=0;
  int j=0;
  while(k<8)
  {
   if(pieces[j].data_num==i)
   {
    pieces[j].data_letter=letter[k]; //顏色 
    k++;
   }
   j++;
  }
 }
} 

void CameBordInit(Piece* pieces)
{
 for(int i=0;i<10;i++)
  printf("------%d",i+1);
 printf("\n");
 for(int i=0;i<8;i++)
 {
  printf("[%d]",i+1);
  for(int j=0;j<10;j++)
  {
   if(pieces[j+i*10].data_num!=10&&pieces[j+i*10].data_letter!=10)
    printf(" <%d,%c> ",pieces[j+i*10].data_num,35+pieces[j+i*10].data_letter%4);
   else
    printf(" <*v*> ");
  }
  printf("\n");
 }
}

bool mgpath(int xi, int yi, int xe, int ye)
{  int i,j, i1,j1,di;
 int mg1[10][12];
 memcpy(mg1,mg,sizeof(mg));
 bool find;
 int top=-1;
 top++;
 St[top].i=xi;
 St[top].j=yi;
 St[top].di=-1;
 mg1[xi][yi]=-1;
 mg1[xe][ye]=0;
 while (top>-1)
 {  i= St[top].i;j= St[top].j;
  di=St[top].di;
  if (i==xe&& j== ye) 
  {
   return true;
  } 
  find= false;
  while (di<4 && !find)
  {
   di++; 
   switch(di)
   { 
    case 0:i1=i-1; j1=j;break;
    case 1:i1=i;j1=j+1; break;
    case 2:i1=i+1; j1=j;break;
    case 3:i1=i;j1=j-1; break;
   }
   if(i1<12&&j1<10)
   {
    if (mg1[i1][j1]==0) find=true;
   }
  }
  if (find)
  { St[top].di=di;
   top++;St[top].i=i1;St[top].j=j1;
   St[top].di= - 1;
   mg1[i1][j1]= -1;
  }
  else
  {
   mg1[i][j]=0;
   top-- ;
  } 
 } 
 return false;
}

void GamePlay(int x1,int y1,int x2,int y2,Piece* pieces)
{
 if(pieces[y1*10+x1].data_num==pieces[y2*10+x2].data_num)
  if(abs(pieces[y1*10+x1].data_letter-pieces[y2*10+x2].data_letter)==4)
  {
   if(mgpath(x1+1, y1+1, x2+1, y2+1))
   {
    pieces[y1*10+x1].data_letter=pieces[y1*10+x1].data_num=pieces[y2*10+x2].data_letter=pieces[y2*10+x2].data_num=10;
    mg[x1+1][y1+1]=mg[x2+1][y2+1]=0;
   } 
  }
}

void Game_Score()
{
 int score=80;
 for(int i=0;i<10;i++)
  for(int j=0;j<12;j++)
   score=score-mg[i][j];
 printf("\t\t\t您現(xiàn)在的得分是:%d \n",score);
}

int main()
{
 //生成游戲桌面 
 GameInit();
 //選擇游戲模式 
 int Gmode;
 int x1,y1,x2,y2;
 double time,end;
 scanf("%d",&Gmode);
 //刷新界面->進(jìn)入游戲 
 clock_t start;
 start=clock();
 Piece pieces[80];
 ChesspiecesInit(pieces);
 while(1)
 {
  end = clock();
  system("cls");
/***************************************************/ 
 switch(Gmode)                           //其他模式配件 
 {
  case 1:
   printf("當(dāng)前游戲時(shí)間:%f s\n\n",(double)(end-start)/CLK_TCK);break;
  case 3:
   time=DDL-(double)(end-start)/CLK_TCK;
   printf("剩余游戲時(shí)間:%f\t\t\t(輸入qqqq結(jié)束游戲\n\n",time);
   if(time<0)
   {
    printf("游戲結(jié)束!交作業(yè)的小伙伴給個(gè)三連吧,要不評(píng)論區(qū)下次一定?<*v*>\n"); 
    Game_Score();
    return 0;
   };break; 
  case 4:
   printf("?!??。浚。縗n");
   printf("  我自閉了!");
   return 0;
 }
 
 
/****************娛樂(lè)模式主體***********************/ 
  Game_Score();
  CameBordInit(pieces);  
  scanf("%d,%d",&x1,&y1);
  scanf("%d,%d",&x2,&y2);
  if(x1=='q')
  {
   Game_Score();
   return 0; 
  }
  x1=x1-1;y1=y1-1;
  x2=x2-1;y2=y2-1;
  GamePlay(x1,y1,x2,y2,pieces);

 }

 return 0;
} 

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

相關(guān)文章

  • 基于QT實(shí)現(xiàn)本地音樂(lè)播放器

    基于QT實(shí)現(xiàn)本地音樂(lè)播放器

    這篇文章主要為大家詳細(xì)介紹了如何基于QT實(shí)現(xiàn)簡(jiǎn)單的本地音樂(lè)播放器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • C++ 類(lèi)和對(duì)象基礎(chǔ)篇

    C++ 類(lèi)和對(duì)象基礎(chǔ)篇

    類(lèi)是創(chuàng)建對(duì)象的模板,一個(gè)類(lèi)可以創(chuàng)建多個(gè)對(duì)象,每個(gè)對(duì)象都是類(lèi)類(lèi)型的一個(gè)變量;創(chuàng)建對(duì)象的過(guò)程也叫類(lèi)的實(shí)例化。每個(gè)對(duì)象都是類(lèi)的一個(gè)具體實(shí)例(Instance),擁有類(lèi)的成員變量和成員函數(shù)
    2020-01-01
  • C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)掃雷小游戲

    C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • 有關(guān)C++中隨機(jī)函數(shù)rand() 和srand() 的用法詳解

    有關(guān)C++中隨機(jī)函數(shù)rand() 和srand() 的用法詳解

    下面小編就為大家?guī)?lái)一篇有關(guān)C++中隨機(jī)函數(shù)rand() 和srand() 的用法詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • C語(yǔ)言統(tǒng)計(jì)一篇英文短文中單詞的個(gè)數(shù)實(shí)例代碼

    C語(yǔ)言統(tǒng)計(jì)一篇英文短文中單詞的個(gè)數(shù)實(shí)例代碼

    本文通過(guò)實(shí)例代碼給大家介紹的C語(yǔ)言統(tǒng)計(jì)一篇英文短文中單詞的個(gè)數(shù),代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-03-03
  • C語(yǔ)言實(shí)現(xiàn)QQ窗口抖動(dòng)功能

    C語(yǔ)言實(shí)現(xiàn)QQ窗口抖動(dòng)功能

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)QQ窗口抖動(dòng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C++的多態(tài)與虛函數(shù)你了解嗎

    C++的多態(tài)與虛函數(shù)你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++多態(tài)與虛函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 詳解C++ 參數(shù)的三種傳遞方式和應(yīng)用場(chǎng)景

    詳解C++ 參數(shù)的三種傳遞方式和應(yīng)用場(chǎng)景

    這篇文章主要介紹C++ 參數(shù)的三種傳遞方式和應(yīng)用場(chǎng)景,C++ 參數(shù)的三種傳遞方式分別是值傳遞、指針傳遞和引用傳遞,感興趣的同學(xué)可以參考閱讀下
    2023-06-06
  • C++中二進(jìn)制數(shù)據(jù)序列化和反序列化詳解

    C++中二進(jìn)制數(shù)據(jù)序列化和反序列化詳解

    這篇文章主要為大家詳細(xì)介紹了C++中二進(jìn)制數(shù)據(jù)序列化和反序列化的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2023-11-11
  • C++實(shí)現(xiàn)快捷店會(huì)員管理系統(tǒng)

    C++實(shí)現(xiàn)快捷店會(huì)員管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)快捷店會(huì)員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論