C語言構(gòu)建連連看游戲(矩陣方式)
C語言構(gòu)建連連看游戲的具體代碼,供大家參考,具體內(nèi)容如下
設(shè)計(jì)要求
用數(shù)字+英文字母,采用文本輸出的方式。每次輸出一個(gè)8*10的矩形,然后等待玩家輸入兩個(gè)數(shù)字或字母的坐標(biāo),如果滿足消除規(guī)則就輸出新的矩形。
注意:考慮類似迷宮的處理方式,在8 * 10矩形之外加一層空心圍墻,可以用來連接。大家體驗(yàn)一下連連看游戲就可以發(fā)現(xiàn)這個(gè)規(guī)則。判斷是否能連,用的是10 *12的數(shù)組,最外層添加的是空格,可用來輔助連接。
分析
大綱(簡(jiǎn)化):
/**********************************/
//1生成游戲桌面*
//1.1選項(xiàng)
//2生成游戲局*
//3游戲操作
//3.1選擇方塊
//3.2判斷是否有路徑*
//3.3修改矩陣圖層和迷宮圖層
//3.4刷新頁面
//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---- 游戲開始----\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++;
}
}
}
棋盤生成階段
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*> "); //本來想打空格的,可是這個(gè)表情太可愛了!(可以選擇全空格輸出,界面會(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;
}
}
}
//配合上棋盤生成函數(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消除并刷新頁面
//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)約召喚而來!---------------");printf("\n");
// printf("-------------你他娘的就是老子的Master嗎?-----------");printf("\n\n");
//游戲引導(dǎo)
printf("\t\t 歡迎進(jìn)入矩陣連連看游戲"); printf("\n\n");
printf("\t\t\t---- 游戲開始----\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;
}
/****************娛樂模式主體***********************/
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;
}
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
有關(guān)C++中隨機(jī)函數(shù)rand() 和srand() 的用法詳解
下面小編就為大家?guī)硪黄嘘P(guān)C++中隨機(jī)函數(shù)rand() 和srand() 的用法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
C語言統(tǒng)計(jì)一篇英文短文中單詞的個(gè)數(shù)實(shí)例代碼
本文通過實(shí)例代碼給大家介紹的C語言統(tǒng)計(jì)一篇英文短文中單詞的個(gè)數(shù),代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-03-03
C語言實(shí)現(xiàn)QQ窗口抖動(dòng)功能
這篇文章主要為大家詳細(xì)介紹了C語言實(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-06
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)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)快捷店會(huì)員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

