C語言構建連連看游戲(矩陣方式)
C語言構建連連看游戲的具體代碼,供大家參考,具體內容如下
設計要求
用數字+英文字母,采用文本輸出的方式。每次輸出一個8*10的矩形,然后等待玩家輸入兩個數字或字母的坐標,如果滿足消除規(guī)則就輸出新的矩形。
注意:考慮類似迷宮的處理方式,在8 * 10矩形之外加一層空心圍墻,可以用來連接。大家體驗一下連連看游戲就可以發(fā)現(xiàn)這個規(guī)則。判斷是否能連,用的是10 *12的數組,最外層添加的是空格,可用來輔助連接。
分析
大綱(簡化):
/**********************************/
//1生成游戲桌面*
//1.1選項
//2生成游戲局*
//3游戲操作
//3.1選擇方塊
//3.2判斷是否有路徑*
//3.3修改矩陣圖層和迷宮圖層
//3.4刷新頁面
//4游戲勝利條件
//4.1時間限制
//4.2游戲結束
//4.3結算游戲*/********************************/
本設計采用了雙圖層的思路,分別設計顯示圖層與連連看內部游戲圖層。
顯示圖層方便用戶操作,
內部游戲圖層方便進行連連看消除處理。
設計
生成游戲桌面
#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);
//游戲引導
printf("\t\t\t歡迎進入矩陣連連看游戲"); printf("\n\n");
printf("\t\t\t---- 游戲開始----\t\t"); printf("\n\n");
printf("\t\t\t 請選擇游戲模式 \t\t"); printf("\n\n");
printf("\t\t\t----1基本模式----\t\t"); printf("\n"); //正向計時
printf("\t\t\t----2休閑模式----\t\t"); printf("\n"); //不計時
printf("\t\t\t----3關卡模式----\t\t"); printf("\n\n"); //倒計時
printf("\t\t\t----4退出游戲----\t\t"); printf("\n"); //退出程序
}
生成游戲局
內部(迷宮)圖層:
#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; //隨機因子屬性——用于隨機棋子
void Rand_Num(int a[],int Num_Range,int T) //生成棋子屬性——作為棋子生成階段的一部分
{
srand((unsigned)time(NULL));//生成隨機數種子
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]; //數值
}
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");
}
}
游戲操作
選擇——簡單粗暴
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;
}
}
}
//配合上棋盤生成函數中的
else
printf(" <*v*> ");
刷新界面用:
system("cls"); //簡單粗暴
游戲勝利(結束)
判斷結束:(暫不解釋,看代碼理解)
1.時間限制
2.自主退出
時間限制使用系統(tǒng)計時
自動退出引導用戶輸入特定符號
游戲結算:輸出分數
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選項
//2生成游戲局
//3游戲操作
//3.1選擇方塊
//3.2判斷是否有路徑
//3.3判斷是否消除
//3.4消除并刷新頁面
//4游戲勝利條件
//4.1時間限制
//4.2游戲結束
//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; //隨機到你了嗎?
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("-----------------李云龍應約召喚而來!---------------");printf("\n");
// printf("-------------你他娘的就是老子的Master嗎?-----------");printf("\n\n");
//游戲引導
printf("\t\t 歡迎進入矩陣連連看游戲"); printf("\n\n");
printf("\t\t\t---- 游戲開始----\t\t"); printf("\n\n");
printf("\t\t\t 請選擇游戲模式 \t\t"); printf("\n\n");
printf("\t\t\t----1基本模式----\t\t"); printf("\n"); //正向計時
printf("\t\t\t----2休閑模式----\t\t"); printf("\n"); //不計時
printf("\t\t\t----3關卡模式----\t\t"); printf("\n"); //倒計時
// printf("\t\t----4米斯達罵罵咧咧地退出房間了……"); 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));//生成隨機數的種子
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]; //數值
}
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);
//刷新界面->進入游戲
clock_t start;
start=clock();
Piece pieces[80];
ChesspiecesInit(pieces);
while(1)
{
end = clock();
system("cls");
/***************************************************/
switch(Gmode) //其他模式配件
{
case 1:
printf("當前游戲時間:%f s\n\n",(double)(end-start)/CLK_TCK);break;
case 3:
time=DDL-(double)(end-start)/CLK_TCK;
printf("剩余游戲時間:%f\t\t\t(輸入qqqq結束游戲\n\n",time);
if(time<0)
{
printf("游戲結束!交作業(yè)的小伙伴給個三連吧,要不評論區(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;
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
有關C++中隨機函數rand() 和srand() 的用法詳解
下面小編就為大家?guī)硪黄嘘PC++中隨機函數rand() 和srand() 的用法詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01

