基于C语言实现扫雷
2018-03-11 20:09
549 查看
说起扫雷,大家都应该很熟悉,一个棋盘上分布着几个雷,玩家选择坐标,若不行选中雷,则被炸死,游戏结束,若没有选中雷,则玩家获胜,游戏结束。今天,我基于C语言来实现扫雷游戏,其具备的功能有:能够随机分布几个雷,若选中雷,则会显示失败,若成功避开雷,则会显示游戏成功。
game.h
game.c
text.c
运行之后会显示是否要开始游戏
选择1,开始游戏,需要玩家输入坐标
选中雷之后显示被炸死
game.h
#ifndef __GAME_H__ #define __GAME_H__ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> //定义雷阵的大小 #define ROWS 9 #define COLS 9 //默认雷的个数 #define DEFAULT_COUNT 10 //设置雷阵 void set_mine(char mine[ROWS + 2][COLS + 2], int row, int col); //打印雷阵信息 void display(char board[ROWS + 2][COLS + 2], int row, int col); //统计非雷区周围的雷的个数 int get_mine_count(char board[ROWS + 2][COLS + 2], int row, int col); //游戏的主逻辑 void play_game(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2]); #endif //__GAME_H__
game.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" //产生随机数 int get_random_num(int m, int n) { return rand() % (n - m + 1) + m; } //设置雷阵 void set_mine(char mine[ROWS + 2][COLS + 2], int row, int col) { int count = DEFAULT_COUNT; while (count)//雷的个数 { int x = get_random_num(1, 10); int y = get_random_num(1, 10); if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } //打印雷阵(排雷结果)信息 void display(char board[ROWS + 2][COLS + 2], int row, int col) { int i = 0; int j = 0; printf(" "); for (i = 1; i <= ROWS; i++) { printf(" %d", i); } printf("\n"); for (i = 1; i <= COLS; i++) { printf("---"); } printf("\n"); for (i = 1; i<row - 1; i++) { printf("%2d| ", i); for (j = 1; j<col - 1; j++) { printf("%c ", board[i][j]); } printf("\n"); } } //统计非雷区周围的雷的个数 int get_mine_count(char board[ROWS + 2][COLS + 2], int x, int y) { return (board[x - 1][y - 1] - '0') + (board[x][y - 1] - '0') + (board[x + 1][y - 1] - '0') + (board[x + 1][y] - '0') + (board[x + 1][y + 1] - '0') + (board[x][y + 1] - '0') + (board[x - 1][y + 1] - '0') + (board[x - 1][y - 1] - '0'); } //游戏的主逻辑 void play_game(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2]) { while (1) { int x = 0; int y = 0; int win = 0; printf("请输入坐标>:"); scanf("%d%d", &x, &y); if (((x >= 1) && (x <= 10)) && ((y >= 1) && (y <= 10))) { if (mine[x][y] == '1') { printf("被炸死\n"); display(mine, ROWS + 2, COLS + 2); break; } else { int ret = 0; win++; ret = get_mine_count(mine, x, y); show[x][y] = ret + '0'; display(show, ROWS + 2, COLS + 2); if (win == COLS*ROWS - DEFAULT_COUNT) { printf("雷排完了\n"); display(mine, ROWS + 2, COLS + 2); break; } } } else { printf("坐标输入有误\n"); } } }
text.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void game() { char mine[ROWS + 2][COLS + 2]; char show[ROWS + 2][COLS + 2]; srand((unsigned int)time(NULL)); memset(mine, '0', (ROWS + 2)*(COLS + 2)*sizeof(char)); memset(show, '*', (ROWS + 2)*(COLS + 2)*sizeof(char)); set_mine(mine, ROWS + 2, COLS + 2); display(mine, ROWS + 2, COLS + 2); display(show, ROWS + 2, COLS + 2); play_game(mine, show); } void menu() { printf("********************************************\n"); printf("************1.play********0.exit************\n"); printf("********************************************\n"); } int main() { int input = 0; do { menu(); printf("请选择>:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: break; default: printf("选择错误\n"); break; } } while (input); return 0; }
运行之后会显示是否要开始游戏
选择1,开始游戏,需要玩家输入坐标
选中雷之后显示被炸死
相关文章推荐