C語(yǔ)言構(gòu)建連連看游戲(矩陣方式)
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)文章
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ī)?lái)一篇有關(guān)C++中隨機(jī)函數(shù)rand() 和srand() 的用法詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01C語(yǔ)言統(tǒng)計(jì)一篇英文短文中單詞的個(gè)數(shù)實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹的C語(yǔ)言統(tǒng)計(jì)一篇英文短文中單詞的個(gè)數(shù),代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-03-03C語(yǔ)言實(shí)現(xiàn)QQ窗口抖動(dòng)功能
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)QQ窗口抖動(dòng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11詳解C++ 參數(shù)的三種傳遞方式和應(yīng)用場(chǎng)景
這篇文章主要介紹C++ 參數(shù)的三種傳遞方式和應(yīng)用場(chǎng)景,C++ 參數(shù)的三種傳遞方式分別是值傳遞、指針傳遞和引用傳遞,感興趣的同學(xué)可以參考閱讀下2023-06-06C++中二進(jìn)制數(shù)據(jù)序列化和反序列化詳解
這篇文章主要為大家詳細(xì)介紹了C++中二進(jìn)制數(shù)據(jù)序列化和反序列化的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2023-11-11C++實(shí)現(xiàn)快捷店會(huì)員管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)快捷店會(huì)員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03