本人初学者一枚,反复尝试写扫雷游戏,终于勉强成功,就不做过多讲解了,直接上代码,希望对同为初学者的你起到借鉴作用。
头文件内容,我的头文件名“saolei.h ”。 #include <stdio.h> #include <time.h> #include <stdlib.h> #include <Windows.h>
#define X 9//设置棋盘行数 #define Y 9//设置棋盘列数 #define Xx X+2 #define Yy Y+2 #define LEI 10//设置雷数 void print1(); void test(); void panduan(char arr1[Xx][Yy], char arr2[Xx][Yy], int a, int b,int* leishu); void doplay(char arr1[Xx][Yy], char arr2[Xx][Yy], int x, int y); void fuzhi(char arr[Xx][Yy], int x, int y, char vil); void bulei(char arr1[Xx][Yy], int x, int y);
下为完整代码
#include"saolei.h"
void print2(char arr2[Xx][Yy], int x, int y)//打印棋盘 { ?? ?int i, j; ?? ?for (i = 0;i <= x;i++) ?? ?{ ?? ??? ?printf("%-4d", i); ?? ?} ?? ?printf("\n"); ?? ?for (i = 1;i <= x;i++) ?? ?{ ?? ??? ?printf(" ?"); ?? ??? ??? ?for (j = 1;j <= y;j++) ?? ??? ??? ?{ ?? ??? ??? ??? ?printf("|---"); ?? ??? ??? ?} ?? ??? ?printf("|\n"); ?? ??? ?printf("%d ",i); ?? ??? ??? ?for (j = 1;j <= y;j++) ?? ??? ??? ?{ ?? ??? ??? ??? ?printf("| %c ", arr2[i][j]); ?? ??? ??? ?} ?? ??? ?printf("|\n"); ?? ?} ?? ?printf(" ?"); ?? ??? ?for (i = 1;i <= x;i++) ?? ??? ?{ ?? ??? ??? ?printf("|---"); ?? ??? ?} ?? ?printf("|\n"); }
int main() //主函数 { ?? ?srand((unsigned int)time(NULL)); ?? ?int input=0; ?? ?do ?? ?{ ?? ??? ?print1(); ?? ??? ?scanf("%d",&input); ?? ??? ?switch (input) ?? ??? ?{ ?? ??? ?case 0: ?? ??? ??? ?printf("古德白\n"); ?? ??? ??? ?break; ?? ??? ?case 1: ?? ??? ??? ?// system(“cls”); ?? ??? ??? ?test(); ?? ??? ??? ?break; ?? ??? ?default: ?? ??? ??? ?printf("输入错误,重新收入\n"); ?? ??? ?} ?? ?} while (input); ?? ?return 0; } void print1()//打印菜单,简单了点,可以用 { ?? ?printf("0.退出游戏\n1.开始游戏\n"); } void test() { ?? ?char arr1[Xx][Yy] = { 0 }; ?? ?char arr2[Xx][Yy] = { 0 };
//初始化雷区 ?? ?fuzhi(arr1, Xx, Yy,0);
//初始化棋盘 ?? ?fuzhi(arr2, Xx, Yy,'*');
//布雷 ?? ?bulei(arr1, X, Y); ?? ?print2(arr2, X, Y); //?? ?print2(arr1, X, Y);
?? ?//玩游戏 ?? ?doplay(arr1,arr2, X, Y);
} void bulei(char arr1[Xx][Yy], int x, int y) { ?? ?int count = LEI; ?? ?while (count) ?? ?{ ?? ??? ?int q = rand() % X + 1; ?? ??? ?int w = rand() % Y + 1; ?? ??? ?if (arr1[q][w] == 0) ?? ??? ?{ ?? ??? ??? ?arr1[q][w] = 1; ?? ??? ??? ?count--; ?? ??? ?} ?? ?} } void fuzhi(char arr[Xx][Yy], int x, int y, char vil) { ?? ?for (int i = 0;i <x;i++) ?? ?{ ?? ??? ?for (int j = 0;j<y;j++) ?? ??? ?{ ?? ??? ??? ?arr[i][j] = vil; ?? ??? ?} ?? ?} } void doplay(char arr1[Xx][Yy], char arr2[Xx][Yy], int x, int y) {
//给出除雷数之外为点开的棋盘个数 ?? ?int leishu = X * Y - LEI; ?? ?int a, b; ?? ?printf("请选择要下的位置->\n"); ?? ?To1: ?? ?scanf("%d", &a); ?? ?scanf("%d", &b); ?? ?if (a<1 || a>x || b<1 || b>y) ?? ?{ ?? ??? ?printf("坐标错误,请重新选择->\n"); ?? ??? ?goto To1; ?? ?} ?? ? if (arr1[a][b] == 1) ?? ?{ ?? ??? ?arr1[a][b] = 0; ?? ??? ?while (1) ?? ??? ?{ ?? ??? ??? ?int q = rand() % X + 1; ?? ??? ??? ?int w = rand() % Y + 1; ?? ??? ??? ?if (arr1[q][w] == 0 && (q != a || w != b)) ?? ??? ??? ?{ ?? ??? ??? ??? ?arr1[q][w] = 1; ?? ??? ??? ??? ?break; ?? ??? ??? ?} ?? ??? ?} ?? ?}
//把未点开数进行传参,没进入一次判断未點开数减1 ?? ?panduan(arr1, arr2, a,b,&leishu);?? ? ?? ?while (leishu) ?? ?{ ?? ??? ?system("CLS"); ?? ??? ?//print2(arr1, X, Y); ?? ??? ?print2(arr2, X, Y); ?? ??? ?printf("请选择要下的位置->\n"); ?? ??? ?scanf("%d%d", &a, &b); ?? ??? ?if (arr2[a][b] != '*') ?? ??? ?{ ?? ??? ??? ?continue; ?? ??? ?} ?? ??? ?if (arr1[a][b] == 1) ?? ??? ?{ ?? ??? ??? ?system("CLS"); ?? ??? ??? ?printf("此处埋雷,游戏结束\n"); ?? ??? ??? ?print2(arr1, X, Y); ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?panduan(arr1, arr2, a, b,&leishu); ?? ??? ?}?? ??? ? ?? ?}?
//如果可未点开数为0,过关 ?? ?if (leishu == 0) ?? ?{ ?? ??? ?system("CLS"); ?? ??? ?print2(arr1, X, Y); ?? ??? ?printf("恭喜过关\n"); ?? ?} }
//判断坐标,如果该坐标周围八个坐标相加等于0,输入空格并递归判断周围坐标,如果大于0输入字符数值 void panduan(char arr1[Xx][Yy], char arr2[Xx][Yy], int a, int b,int* leishu) {
//可點开数减1 ?? ? * leishu-=1; ?? ?int mmx =0; ?? ?for (int i = a - 1;i <= a + 1;i++) ?? ?{ ?? ??? ?for (int j = b - 1;j <= b + 1;j++) ?? ??? ?{ ?? ??? ??? ?if (arr1[i][j] == 1) ?? ??? ??? ?{ ?? ??? ??? ??? ?mmx++; ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?if (mmx == 0) ?? ?{ ?? ??? ?arr2[a][b] = ' ';
? ? ?//分别判断周围(八个坐标是否合法,并且未判断过)进行递归判断 ?? ??? ?if (a - 1 > 0 && b - 1 > 0&&arr2[a-1][b-1]=='*') ?? ??? ?{ ?? ??? ??? ?panduan(arr1, arr2, a - 1, b - 1,leishu); ?? ??? ?}?? ??? ? ?? ??? ?if (a - 1 > 0 && arr2[a - 1][b] == '*') ?? ??? ?{ ?? ??? ??? ?panduan(arr1, arr2, a - 1, b, leishu); ?? ??? ?} ?? ??? ?if (a - 1 > 0 && b + 1 <= Y && arr2[a-1][b+1] == '*') ?? ??? ?{ ?? ??? ??? ?panduan(arr1, arr2, a - 1, b + 1, leishu); ?? ??? ?} ?? ??? ?if ( b - 1 > 0 && arr2[a][b-1] == '*') ?? ??? ?{ ?? ??? ??? ?panduan(arr1, arr2, a, b - 1, leishu); ?? ??? ?} ?? ??? ?if ( b + 1 <= Y && arr2[a][b+1] == '*') ?? ??? ?{ ?? ??? ??? ?panduan(arr1, arr2, a, b + 1, leishu); ?? ??? ?} ?? ??? ?if ( a + 1 <= X && b - 1 > 0 && arr2[a+1][b - 1] == '*') ?? ??? ?{ ?? ??? ??? ?panduan(arr1, arr2, a + 1, b - 1, leishu); ?? ??? ?} ?? ??? ?if ( a + 1 <= X && arr2[a +1][b] == '*') ?? ??? ?{ ?? ??? ??? ?panduan(arr1, arr2, a + 1, b, leishu); ?? ??? ?} ?? ??? ?if (a+1<=X&&b+1<=Y&& arr2[a +1][b+1] == '*') ?? ??? ?{ ?? ??? ??? ?panduan(arr1, arr2, a + 1, b + 1, leishu); ?? ??? ?} ?? ?} ?? ?else ?? ?{ ?? ??? ?arr2[a][b] = mmx + '0'; ?? ?}?? ??? ? }
|