扫雷完整源代码
單文件完整源碼:
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <time.h>#define ROW 3 #define COL 3 #define ROWS ROW+2 #define COLS COL+2 #define NUM 1//int main() //{ // int a = 1; // if (a == 1) // { // a = 2; // } // printf("%d", a); // return 0; //}//菜單 void menu() {printf("************************************************************************************************************************");printf("******************************************* 掃雷游戲 ********************************************");printf("******************************************* 1.Play 0.Exit ********************************************");printf("************************************************************************************************************************");printf("************************************************************************************************************************"); }//勝利 void Win() {printf("******************************************* 你贏啦 ********************************************");printf("************************************************************************************************************************");printf("************************************************************************************************************************"); }//失敗 void Defeat() {printf("******************************************* 你輸啦 ********************************************");printf("************************************************************************************************************************");printf("************************************************************************************************************************"); }//結(jié)束游戲 void End1() {system("cls");printf("************************************************************************************************************************");printf("************************************************************************************************************************");printf("******************************************* 游戲結(jié)束 ********************************************");printf("************************************************************************************************************************");printf("************************************************************************************************************************");Sleep(1000); }//輸入錯(cuò)誤 void Error() {printf("請(qǐng)根據(jù)菜單正確選擇!\n"); }//游戲開頭 void Head() {printf("************************************************************************************************************************");printf("******************************************* 掃雷游戲 ********************************************");printf("************************************************************************************************************************");printf("\n");printf("\n"); }//游戲結(jié)尾 void End() {printf("\n");printf("************************************************************************************************************************"); }//初始化數(shù)組 void Initializeborad(char borad[ROWS][COLS], int row, int col) {int i = 0;int j = 0;for (i = 1; i <= row; i++){for (j = 1; j <= col; j++){//雙重for循環(huán)所有borad值變?yōu)榭崭馼orad[i][j] = ' ';}} }//打印函數(shù) void Diskplay(char borad[ROWS][COLS], int row, int col) {//清屏system("cls");int i = 0;int j = 0;//打印開頭Head();//雙重for循環(huán)打印游戲面板for (i = 1; i <= row; i++){for (j = 1; j <= col; j++){//每行第一個(gè)元素前打印一堆空格美觀if (j == 1){printf(" ");}//第一列打印j作為列標(biāo)if (i == 1){//行標(biāo)1到9前加一個(gè)空格后加兩個(gè)空格補(bǔ)位if (j < 9){printf(" %d ", j);}//行標(biāo)大于等于9前后加一個(gè)空格補(bǔ)位else{printf(" %d ", j);}}//不是第一列打印“---”else{printf("---");//最后一列不在打印“|”if (j == col){break;}printf("|");}}//換行printf("\n");for (j = 1; j <= col; j++){//每列第一個(gè)元素前打印一堆空格美觀if (j == 1){printf(" ");//1到10打印數(shù)字加空格,10以后只打印數(shù)(空格為了占位,兩位數(shù)本身就2位,不用空格補(bǔ)位)if (i+1 <= 10){printf("%d ", i);}else{printf("%d", i);}}printf(" %c ", borad[i][j]);if (j == col){break;}printf("|");}printf("\n");}//結(jié)尾效果End(); }//判斷是否是雷函數(shù) int Ismine(char mineborad[ROWS][COLS], int x, int y, int row, int col) {if (mineborad[x][y] == '*'){return 1;}return 0; }//數(shù)九宮格雷個(gè)數(shù) void Countmine(char borad[ROWS][COLS], char mineborad[ROWS][COLS], int a, int b, int row, int col) {//定義一個(gè)值表示地雷個(gè)數(shù),初始為0int mine = 0;//依次判定9宮格除自己以外每個(gè)位置是否為雷,因?yàn)镮smine函數(shù)判定是雷返回1,不是返回0,所以直接mine += Ismine進(jìn)行累計(jì)mine += Ismine(mineborad, a, b+1, ROW, COL);mine += Ismine(mineborad, a+1, b, ROW, COL);mine += Ismine(mineborad, a+1, b+1, ROW, COL);mine += Ismine(mineborad, a, b-1, ROW, COL);mine += Ismine(mineborad, a-1, b, ROW, COL);mine += Ismine(mineborad, a-1, b-1, ROW, COL);mine += Ismine(mineborad, a+1, b-1, ROW, COL);mine += Ismine(mineborad, a-1, b+1, ROW, COL);//數(shù)組是字符類型的,把得到的“數(shù)字”轉(zhuǎn)化為“字符”if (mine == 0){mineborad[a][b] = '0';}else if (mine == 1){mineborad[a][b] = '1';}else if (mine == 2){mineborad[a][b] = '2';}else if (mine == 3){mineborad[a][b] = '3';}else if (mine == 4){mineborad[a][b] = '4';}else if (mine == 5){mineborad[a][b] = '5';}else if (mine == 6){mineborad[a][b] = '6';}else if (mine == 7){mineborad[a][b] = '7';}else if (mine == 8){mineborad[a][b] = '8';} }//生成雷函數(shù) void Minerand(char borad[ROWS][COLS], char mineborad[ROWS][COLS], int row, int col) {int x, y, z;z = 0;while (z < NUM){{//隨機(jī)生成坐標(biāo)x = (rand()%row) + 1;y = (rand()%col) + 1;if (mineborad[x][y] == ' '){mineborad[x][y] = '*';z++;}}}//直接算出所有格子的值for (int i = 1; i <= row; i++){for (int j = 0; j <= col; j++){if (mineborad[i][j] != '*'){Countmine(borad, mineborad, i, j, ROW, COL);}}} }//排雷函數(shù) int Demine(char borad[ROWS][COLS], char mineborad[ROWS][COLS], int x, int y, int row, int col) {//坐標(biāo)位置不是空,表示該位置已經(jīng)排查過了if (borad[x][y] != ' '){return 2;}//該位置為*表示該位置是0,把棋盤相應(yīng)位置改為*,返回1表示游戲失敗if (mineborad[x][y] == '*'){borad[x][y] = mineborad[x][y];return 1;}//該位置不為雷,把雷盤上的數(shù)字賦值給棋盤else{borad[x][y] = mineborad[x][y];return 0;} }//標(biāo)記雷函數(shù) int Markmine(char borad[ROWS][COLS], char mineborad[ROWS][COLS], int x, int y) {//定義靜態(tài)局部變量來存儲(chǔ)標(biāo)記對(duì)的個(gè)數(shù)static int count = 0;//如果棋盤該坐標(biāo)位置為空,就把他標(biāo)為*,并且雷盤上該位置如果真的為*,count加1表示正確標(biāo)記了一個(gè)雷的位置if (borad[x][y] == ' '){borad[x][y] = '*';if (mineborad[x][y] == '*'){count++;}//如果某一次標(biāo)記完標(biāo)記對(duì)的個(gè)數(shù)count等于NUM(即雷的個(gè)數(shù)),說明游戲勝利,返回3if (count == NUM){count = 0;return 3;}return 0;}//該位置為*表示已經(jīng)標(biāo)記過else if (borad[x][y] == '*'){return 1;}//不是空也不是*表示該位置是數(shù)字else{return 2;} }//取消標(biāo)記 int Unmark(char borad[ROWS][COLS], int x, int y) {//該位置是玩家標(biāo)記的*,把它變回空格if (borad[x][y] == '*'){borad[x][y] = ' ';return 0;}//該位置不是標(biāo)記位置,返回1else{return 1;} }//游戲函數(shù) void game() {//創(chuàng)建模板char borad[ROWS][COLS] = {0};//創(chuàng)建雷板char mineborad[ROWS][COLS] = {0};//初始化模板Initializeborad(borad, ROW, COL);//初始化雷盤Initializeborad(mineborad, ROW, COL);//打印模板Diskplay(borad, ROW, COL);//隨機(jī)生成雷Minerand(borad, mineborad, ROW, COL);int a;do{//清空緩存(初始菜單選擇時(shí)留下一個(gè)“\n”沒有被讀取)getchar();//選擇菜單printf("請(qǐng)選擇操作:1排雷/2標(biāo)記雷/3取消標(biāo)記\n");a = getchar();switch (a){case '1':{int x, y;printf("請(qǐng)輸入坐標(biāo):\n");//獲取玩家的輸入坐標(biāo)scanf("%d%d", &x, &y);//定義ret1接收有返回值的掃雷函數(shù),并根據(jù)返回值寫結(jié)果int ret1 = Demine(borad, mineborad, x, y, ROW, COL);if (ret1 == 1){//返回值為1,即該位置是雷,打印雷盤并調(diào)用失敗函數(shù)Diskplay(mineborad, ROW, COL);Defeat(); a = 0;}if (ret1 == 2){//返回值為2說明這個(gè)坐標(biāo)已經(jīng)排查過了printf("該作坐標(biāo)已經(jīng)排查過了!\n");}if (ret1 == 0){//返回值為0說明該位置不為0,游戲繼續(xù),打印棋盤Diskplay(borad, ROW, COL);}break;}case '2':{int x, y;printf("請(qǐng)輸入坐標(biāo):\n");//獲取玩家的輸入坐標(biāo)scanf("%d%d", &x, &y);//定義ret2接收有返回值的標(biāo)記函數(shù),并根據(jù)返回值寫結(jié)果int ret2 = Markmine(borad, mineborad, x, y);if(ret2 == 3){//返回值為3表示所有位置雷都已經(jīng)找到,打印棋盤并調(diào)用勝利函數(shù)Diskplay(borad, ROW, COL);Win();a = 0;}else if (ret2 == 1){//返回值為1表示該位置已經(jīng)做過標(biāo)記了Diskplay(borad, ROW, COL);printf("該位置已做過標(biāo)記啦!\n");}else if (ret2 == 2){返回值為2表示該位置已經(jīng)顯示為數(shù)字,不是雷Diskplay(borad, ROW, COL);printf("該位置已確定不是雷啦!\n");}else{//排除以上情況,表示游戲正在進(jìn)行,沒分出輸贏,打印棋盤表示繼續(xù)Diskplay(borad, ROW, COL);}break;}case '3':{int x, y;printf("請(qǐng)輸入要取消的標(biāo)記:\n");//獲取玩家的輸入坐標(biāo)scanf("%d%d", &x, &y);//定義ret3接收有返回值的取消標(biāo)記函數(shù),并根據(jù)返回值寫結(jié)果int ret3 = Unmark(borad, x, y);//返回值為1,表示該位置并沒有被標(biāo)記,無法取消if (ret3 == 1){Diskplay(borad, ROW, COL);printf("該位置不是標(biāo)記位置!\n");}//除上中情況表示游戲應(yīng)該正常繼續(xù),打印棋盤else{Diskplay(borad, ROW, COL);}break;}default:{Error();break;}}//勝利或失敗條件達(dá)成把a(bǔ)置為0跳出循環(huán)} while (a); }//測(cè)試函數(shù) void test() {srand((unsigned int)time(NULL));int a;do{printf("請(qǐng)根據(jù)菜單選擇!1.Play 0.Exit\n");scanf("%d", &a);switch (a){case 1:{game();break;}case 0:{printf("游戲退出!\n");break;}//輸出指令不是菜單中的default:{Error();break;}}} while (a);}//程序入口main函數(shù) int main() {menu();test();return 0; }標(biāo)準(zhǔn)化項(xiàng)目源碼:
test.cpp
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"//菜單 void menu() {printf("************************************************************************************************************************");printf("******************************************* 掃雷游戲 ********************************************");printf("******************************************* 1.Play 0.Exit ********************************************");printf("************************************************************************************************************************");printf("************************************************************************************************************************"); }//勝利 void Win() {printf("******************************************* 你贏啦 ********************************************");printf("************************************************************************************************************************");printf("************************************************************************************************************************"); }//失敗 void Defeat() {printf("******************************************* 你輸啦 ********************************************");printf("************************************************************************************************************************");printf("************************************************************************************************************************"); }//結(jié)束游戲 void End1() {system("cls");printf("************************************************************************************************************************");printf("************************************************************************************************************************");printf("******************************************* 游戲結(jié)束 ********************************************");printf("************************************************************************************************************************");printf("************************************************************************************************************************");Sleep(1000); }//輸入錯(cuò)誤 void Error() {printf("請(qǐng)根據(jù)菜單正確選擇!\n"); }//功能菜單 int Menu() {int a = 0;printf("請(qǐng)選擇掃雷或者標(biāo)記雷:(1掃雷/2標(biāo)記/3取消標(biāo)記)");scanf("%d", &a);return a; }//游戲函數(shù) void game() {//創(chuàng)建模板char borad[ROW][COL] = {0};//創(chuàng)建雷板char mineborad[ROW][COL] = {0};//初始化模板Initializeborad(borad, ROW, COL);//初始化雷盤Initializeborad(mineborad, ROW, COL);//打印模板Diskplay(borad, ROW, COL);//隨機(jī)生成雷Minerand(mineborad, ROW, COL);while (1){int ret1 = 0;int ret2 = 0;//功能菜單int ret = Menu();switch (ret){//掃雷case 1:{printf("請(qǐng)輸入坐標(biāo)掃雷:\n");int x, y;scanf("%d%d", &x, &y);ret1 = Demine(borad, mineborad, x, y, ROW, COL);if (ret1 == 1){Diskplay(mineborad, ROW, COL);Defeat();break;}else if (ret1 == 2){Diskplay(borad, ROW, COL);printf("該位置已確定不是雷啦!\n");}else{Diskplay(borad, ROW, COL);}break;}//標(biāo)記雷case 2:{printf("請(qǐng)輸入坐標(biāo)標(biāo)記雷:\n");int x, y;scanf("%d%d", &x, &y);ret2 = Markmine(borad, mineborad, x, y);if(ret2 == 3){Diskplay(borad, ROW, COL);Win();}else if (ret2 == 1){Diskplay(borad, ROW, COL);printf("該位置已做過標(biāo)記啦!\n");}else if (ret2 == 2){Diskplay(borad, ROW, COL);printf("該位置已確定不是雷啦!\n");}else{Diskplay(borad, ROW, COL);}break;}//取消標(biāo)記case 3:{printf("請(qǐng)輸入要取消的標(biāo)記:\n");int x, y;scanf("%d%d", &x, &y);int ret3 = Unmark(borad, x, y);if (ret3 == 1){Diskplay(borad, ROW, COL);printf("該位置不是標(biāo)記位置!\n");}else{Diskplay(borad, ROW, COL);}break;}default:{Error();break;}}if (ret1 == 1 || ret2 == 3){break;}} }//測(cè)試函數(shù),游戲框架 void test() {int a = 0;srand((unsigned int)time(NULL));do{printf("請(qǐng)根據(jù)菜單選擇(1開始游戲,0退出游戲)\n");scanf("%d", &a);switch (a){case 1:{game();break;}case 0:{End1();break;}default:{Error();break;}}} while (a); }int main() {menu();test();return 0; }game.cpp
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"//游戲開頭 void Head() {printf("************************************************************************************************************************");printf("******************************************* 掃雷游戲 ********************************************");printf("************************************************************************************************************************");printf("\n");printf("\n"); }//游戲結(jié)尾 void End() {printf("\n");printf("************************************************************************************************************************"); }//初始化數(shù)組 void Initializeborad(char borad[ROW][COL], int row, int col) {int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){//雙重for循環(huán)所有borad值變?yōu)榭崭馼orad[i][j] = ' ';}} }//打印函數(shù) void Diskplay(char borad[ROW][COL], int row, int col) {//清屏system("cls");int i = 0;int j = 0;//打印開頭Head();//雙重for循環(huán)打印游戲面板for (i = 0; i < row; i++){for (j = 0; j < col; j++){//每行第一個(gè)元素前打印一堆空格美觀if (j == 0){printf(" ");}if (i == 0){if (j < 9){printf(" %d ", j+1);}else if (j == 9){printf(" %d ", j+1);}else{printf(" %d ", j+1);}}else{printf("---");if (j == col-1){break;}printf("|");}}printf("\n");for (j = 0; j < col; j++){if (j == 0){printf(" ");if (i+1 < 10){printf("%d ", i+1);}else{printf("%d", i+1);}}printf(" %c ", borad[i][j]);if (j == col-1){break;}printf("|");}printf("\n");}End(); } //生成雷函數(shù) void Minerand(char mineborad[ROW][COL], int row, int col) {int x, y, z;z = 0;while (z < 9){{x = rand()%row;y = rand()%col;if (mineborad[x][y] == ' '){mineborad[x][y] = '*';z++;}}} }//排雷函數(shù) int count1 = 0; int Demine(char borad[ROW][COL], char mineborad[ROW][COL], int x, int y, int row, int col) {if (count1 == 0){if (mineborad[x-1][y-1] == '*'){mineborad[x-1][y-1] = ' ';int a, b;while (1){a = rand()%row;b = rand()%col;if (mineborad[a][b] == ' '){mineborad[a][b] = '*';break;}}}count1 = 1;}if (borad[x-1][y-1] != ' '){return 2;}int ret = Ismine(mineborad, x-1, y-1, ROW, COL);if (ret == 1){count1 = 0;return ret;}else{Countmine(borad, mineborad, x-1, y-1, ROW, COL);return 0;} }//判斷函數(shù) int Ismine(char mineborad[ROW][COL], int x, int y, int row, int col) {if (x<0 || x>row-1 || y<0 || y>col-1){return 0;}else if (mineborad[x][y] == '*'){return 1;}return 0; }//數(shù)九宮格雷個(gè)數(shù) void Countmine(char borad[ROW][COL], char mineborad[ROW][COL], int a, int b, int row, int col) {if (borad[a][b] == ' '){int mine = 0;mine += Ismine(mineborad, a, b+1, ROW, COL);mine += Ismine(mineborad, a+1, b, ROW, COL);mine += Ismine(mineborad, a+1, b+1, ROW, COL);mine += Ismine(mineborad, a, b-1, ROW, COL);mine += Ismine(mineborad, a-1, b, ROW, COL);mine += Ismine(mineborad, a-1, b-1, ROW, COL);mine += Ismine(mineborad, a+1, b-1, ROW, COL);mine += Ismine(mineborad, a-1, b+1, ROW, COL);if (mine == 0){borad[a][b] = '0';if (b-1>=0){Countmine(borad, mineborad, a, b-1, ROW, COL);}if (a-1>=0){Countmine(borad, mineborad, a-1, b, ROW, COL);}if (a+1<row){Countmine(borad, mineborad, a+1, b, ROW, COL);}if (b+1<col){Countmine(borad, mineborad, a, b+1, ROW, COL);}}else if (mine == 1){borad[a][b] = '1';}else if (mine == 2){borad[a][b] = '2';}else if (mine == 3){borad[a][b] = '3';}else if (mine == 4){borad[a][b] = '4';}else if (mine == 5){borad[a][b] = '5';}else if (mine == 6){borad[a][b] = '6';}else if (mine == 7){borad[a][b] = '7';}else if (mine == 8){borad[a][b] = '8';}} }//標(biāo)記雷函數(shù) int Markmine(char borad[ROW][COL], char mineborad[ROW][COL], int x, int y) {static int count = 0;if (borad[x-1][y-1] == ' '){borad[x-1][y-1] = '*';if (mineborad[x-1][y-1] == '*'){count++;}if (count == 9){count = 0;count1 = 0;return 3;}return 0;}else if (borad[x-1][y-1] == '*'){return 1;}else{return 2;} }//取消標(biāo)記 int Unmark(char borad[ROW][COL], int x, int y) {if (borad[x-1][y-1] == '*'){borad[x-1][y-1] = ' ';return 0;}else{return 1;} }?game.h
#define ROW 9 #define COL 9#include <stdio.h> #include <Windows.h> #include <time.h>void Initializeborad(char borad[ROW][COL], int row, int col); void Diskplay(char borad[ROW][COL], int row, int col); void Minerand(char mineborad[ROW][COL], int row, int col); int Demine(char borad[ROW][COL], char mineborad[ROW][COL], int x, int y, int row, int col); int Ismine(char mineborad[ROW][COL], int x, int y, int row, int col); void Countmine(char borad[ROW][COL], char mineborad[ROW][COL], int a, int b, int row, int col); int Markmine(char borad[ROW][COL], char mineborad[ROW][COL], int x, int y); int Unmark(char borad[ROW][COL], int x, int y);總結(jié)
- 上一篇: 全国计算机等级考试题库二级C操作题100
- 下一篇: discuz中又拍云在ie8,chrom