Pace 8 (C语言实现扫雷小游戏)

来源:互联网 发布:儿童学唱歌软件 编辑:程序博客网 时间:2024/06/05 21:17

实现功能:

1.若第一次踩到雷,就将雷更换位置。

2若输入坐标周围没有雷,实现向外扩展。

game.h

# ifndef __game_h_# define __game_h_#include <stdio.h>#include <stdlib.h>#include <time.h># define ROW 10 //定义行和列,任意可以更改# define COL 10# define ROWS (ROW + 2)# define COLS  (COL + 2)# define M 10 //定义雷的数目void Init_Bor(int bor[ROWS][COLS], char ch); //初始化棋盘void Printf_Bor(char bor[ROWS][COLS]); //打印棋盘void Setmine(char bor[ROWS][COLS],int count); //设置雷void First_Play(char bor[ROWS][COLS],char bor1[ROWS][COLS]);//保证第一次玩家不会踩到雷int Sum_Around(char arr[ROWS][COLS], int i, int j); //计算周围雷的个数int Play_Mine(char bor[ROWS][COLS],char bor1[ROWS][COLS]);//第二次及以后void Expend_Bor(int arr[ROWS][COLS],char arr1[ROWS][COLS],int i,int j);//周围没有雷的时候向外扩展int Is_Win(char bor[ROWS][COLS], int i, int j, int m);//判断输赢# endif //__game_h_


test.c

//设置两个二维数组,一个用来计算雷的数目,初始化为全0;一个用来玩家操作,初始化为全‘*’

#include "GAME.h"void menu(){printf("*************************\n");printf("*   1:play     0:exit   *\n");printf("*************************\n");}void GAME(){srand((unsigned int)time(NULL));int T = 0;int ret = 0;int ret1 = 0;char mine[ROWS][COLS] = { '0' };char show[ROWS][COLS] = { '0' };Init_Bor(mine, '0');Init_Bor(show, '*');Printf_Bor(show);Setmine(mine,M);while (1){if (T == 0){First_Play(mine, show);T++;}else{ret = Play_Mine(mine, show);if (ret == 1){printf("很遗憾,你踩到雷了!\n");break;}ret1 = Is_Win(show, ROWS, COLS, M);if (ret1 == 1){printf("排雷成功!\n");Printf_Bor(show);break;}}Printf_Bor(show);}}int main(){int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:GAME();break;case 0:printf("游戏结束!");break;default:printf("请重新输入:>\n");break;}} while (input);system("pause");return 0;}


game.c

#include "GAME.h"void Init_Bor(int bor[ROWS][COLS], char ch){memset(bor, ch, ROWS*COLS*sizeof(char));}void Printf_Bor(char bor[ROWS][COLS]) //将棋盘规则打印,并附有横纵坐标{int i = 0;int j = 0;printf("     ");for (j = 0; j < COLS - 2; j++){printf("%2d ", j + 1);}printf("\n");for (i = 1; i < ROWS - 1; i++){printf("  %2d  ", i);for (j = 1; j < COLS - 1; j++){printf("%c  ", bor[i][j]);}printf("\n");}}void Setmine(char bor[ROWS][COLS],int count){int i = 0;int j = 0;int c = count;    while (c){i = rand() % ROW + 1;j = rand() % COL + 1;if ((i > 0) && (j > 0) && (bor[i][j] == '0')){bor[i][j] = '1';c--;}}}void First_Play(char bor[ROWS][COLS], char bor1[ROWS][COLS])//玩家走的第一步,若是踩到雷便将雷移位{int i = 0;int j = 0;int I = 0;int J = 0;char sum = 0;printf("请输入坐标:>");scanf("%d%d", &i, &j);if (bor[i][j] == '1'){while (1){I = rand() % ROW + 1;J = rand() % COL + 1;if (bor[I][J] == '0'){bor[I][J] = '1';break;}}I = i;J = j;bor[I][J] == '0';sum = Sum_Around(bor, I, J);bor1[I][J] = sum;Expend_Bor(bor, bor1, I, J);}else{Expend_Bor(bor, bor1, i, j);}}int Sum_Around(char arr[ROWS][COLS], int i, int j){int sum = 0;sum = (arr[i - 1][j - 1] + arr[i][j - 1] + arr[i + 1][j - 1]+ arr[i + 1][j] + arr[i + 1][j + 1] + arr[i][j + 1]+ arr[i - 1][j + 1] + arr[i - 1][j] - 7 * '0');return sum;}int Play_Mine(char bor[ROWS][COLS], char bor1[ROWS][COLS]){int i = 0;int j = 0;int I = 0;int J = 0;printf("请输入坐标:>");scanf("%d%d", &i, &j);while (1){if (bor1[i][j] == ' '){printf("此处已经排过雷,请重新输入!\n");scanf("%d %d", &i, &j);}else{break;}}if (bor[i][j] == '0'){Expend_Bor(bor, bor1, i, j);return 0;}else{return 1;}return 0;}void Expend_Bor(int arr[ROWS][COLS], char arr1[ROWS][COLS], int i, int j){int sum = 0;sum = Sum_Around(arr, i, j);if (sum == '0'){arr1[i][j] = ' ';}else if (sum > '0'){arr1[i][j] = sum;}if ((sum <= '0') && (i > 0) && (i<ROWS - 1) && (j>0) && (j < COLS - 1)){if ((arr1[i - 1][j - 1] == '*'))//左上{Expend_Bor(arr, arr1, i - 1, j - 1);}if ((arr1[i][j - 1] == '*'))//左方{Expend_Bor(arr, arr1, i, j - 1);}if ((arr1[i + 1][j - 1] == '*'))//左下{Expend_Bor(arr, arr1, i + 1, j - 1);}if ((arr1[i + 1][j] == '*'))//下方{Expend_Bor(arr, arr1, i + 1, j);}if ((arr1[i + 1][j + 1] == '*'))//右下{Expend_Bor(arr, arr1, i + 1, j + 1);}if ((arr1[i][j + 1] == '*'))//右方{Expend_Bor(arr, arr1, i, j + 1);}if ((arr1[i - 1][j + 1] == '*'))//右上{Expend_Bor(arr, arr1, i - 1, j + 1);}if ((arr1[i - 1][j] == '*'))//上方{Expend_Bor(arr, arr1, i - 1, j);}}}int Is_Win(char bor[ROWS][COLS], int i, int j, int m){int count = 0;for (i = 1; i < ROWS - 1; i++){for (j = 1; j < COLS - 1; j++){if (bor[i][j] == '*'){count++;}}}if (count == m){for (i = 1; i < ROWS - 1; i++){for (j = 1; j < COLS - 1; j++){if (bor[i][j] == '*'){bor[i][j] = 'M';//若玩家胜出,则将全部有雷的地方显示为M}}}return 1;}return 0;}




原创粉丝点击