C語言實現(xiàn)數(shù)字連連看
本文實例為大家分享了C語言實現(xiàn)數(shù)字連連看的具體代碼,供大家參考,具體內(nèi)容如下
要求
連連看小游戲開發(fā),使用二維數(shù)組來保存游戲地圖的數(shù)據(jù),實現(xiàn)連連看的核心功能。歡樂連連看的功能有:主界面、開始游戲、消子、判斷勝負、提示、重排、計時、游戲模式。
主界面
游戲主界面就是進行各項操作的入口。
開始游戲
玩家選擇開始游戲模式,進入游戲后,選擇開始游戲,系統(tǒng)根據(jù)設(shè)置隨機生成數(shù)字,以供玩家點擊消除。
消子
對玩家選中的兩張圖片進行判斷,判斷是否符合消除規(guī)則。只有符合以下規(guī)則的圖片對才能被消除:
- 一條直線連通
- 兩條直線連通
- 三條直線連通
如果可以消除,兩個數(shù)字變?yōu)?。如果不能消除,則保持原來的游戲地圖。
判斷勝負
當游戲完成后,需要判斷游戲勝負。不同模式下判斷勝負的規(guī)則不同。
- 基本模式時,如果在五分鐘內(nèi)將游戲地圖的所有圖片都消除,則提示玩家勝利。
- 休閑模式時,如果游戲地圖中所有圖片都被消除,則提示玩家獲勝。
提示
可以提示界面上能夠消除的一對圖片。
計時
設(shè)定一定時間來輔助游戲是否結(jié)束。
游戲模式
游戲模式有:基本模式、休閑模式和關(guān)卡模式三種,可以根據(jù)是否定時等規(guī)則進行設(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 ("五分鐘計時開始\n");
t1 = clock();
while (t2 < 300000 && !Isblank() && op != 0 )
{
if (op == 1)
{
Print_datas ();
printf("請輸入兩者的坐標[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 ("超時\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("請輸入兩者的坐標[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("請輸入兩者的坐標[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("請選擇你要進行的操作: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}; // 定義一個臨時數(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++) //從左到右檢查中間的點是不是空的
{
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)折時判斷
{
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;
//縱向遍歷所有點
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;
}
//橫向遍歷所有點
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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
QT通過C++線程池運行Lambda自定義函數(shù)流程詳解
最近在接觸公司的一個QT桌面項目,其中里面有一個模塊是使用線程池去運行自定義函數(shù)的,自己潛心研究那個線程池代碼一天,發(fā)現(xiàn)研究不透,看不懂,里面幾乎都是使用C++11的新特性進行編寫2022-10-10
C++ 模擬實現(xiàn)list(迭代器)實現(xiàn)代碼
這篇文章主要介紹了C++ 模擬實現(xiàn)list(迭代器)實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05

