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