您的位置:首页 > 编程语言 > C语言/C++

C语言编程实现扫雷游戏

2017-10-23 18:06 791 查看
源码:

1.函数头:

#ifndef __GAME_H__
#define __GAME_H__

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define ROWS 10
#define COLS 10

#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__2.函数体
#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");
}
enum option
{
EXIT,
PLAY
};

int main()
{
int input = 0;
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case PLAY:
game();
break;
case EXIT:
break;
default:
printf("输入错误!请重新输入:\n");
break;
}
} while (input);
return 0;
}
3.游戏函数主体:
#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 <= 10; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= 10; 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");
}
}
}








内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息