写了一个简单的扫雷游戏,可以控制棋盘大小和雷的数量。
1. 头文件 game.h
#ifndef _GAME_H_
#define _GAME_H_
#include <stdio.h>
#include<windows.h>
#pragma warning(disable:4996)
#include <time.h>
#include <string.h>
#define COL 12
#define ROW 12 //扫雷棋盘大小(ROW-2)X(COL-2) 这里为 10X10大小
#define NUMS 20 //雷的总数为NUMS
void Menu();
void Game();
#endif
2.主函数 main.c
#include "game.h"
int main1() { //扫雷
int quit = 0;
int select = 0;
while (!quit) {
Menu();
scanf("%d", &select);
switch (select) {
case 1:
Game();
break;
case 2:
break;
default:
printf("输入错误,重输\n");
break;
}
}
printf("游戏结束 , 拜拜!\n");
system("pause");
return 0;
}
3.具体游戏设计 game.c
#include "game.h"
void Menu() {
printf("###################################\n");
printf("### 1.开始游戏 2. 退出 #####\n");
printf("###################################\n");
printf("请输入:");
}
void SetMines(char board[][COL],int row,int col){
int num = NUMS;
while (num) {
int x = rand() % 10 + 1;
int y = rand() % 10 + 1;
if (board[x][y] == '0') {
board[x][y] = '1';
num--;
}
}
}
void ShowBoard(char board[][COL], int row, int col) {
printf(" | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10 |");
printf("\n-------------------------------------------\n");
for (int i = 1; i < ROW - 1; i++) {
printf("%d |", i);
for (int j = 1; j < COL - 1; j++) {
printf("%2c |",board[i][j]);
}
printf("\n-------------------------------------------\n");
}
}
int GetNums(char board[][COL], int row, int col,int x,int y) {
int num = 0;
num = board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1]\
+ board[x][y - 1] + board[x][y + 1] \
+ board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1] - 8 * 48;
return num;
}
void Game() {
srand((unsigned long)time(NULL));
char show_board[ROW][COL];
char mine_board[ROW][COL];
memset(show_board, '*', sizeof(show_board));
memset(mine_board, '0', sizeof(mine_board));
SetMines(mine_board, ROW, COL);
int count = (ROW - 2) * (COL - 2) - NUMS;
int x = 0;
int y = 0;
do{
system("cls");
ShowBoard(show_board, ROW, COL);
printf("请输入坐标#\n");
scanf("%d %d", &x, &y);
if (x < 1 || x>ROW-2 || y < 1 || y>COL-2) {
printf("坐标越界,重新输入\n");
Sleep(1000);
continue;
}
if (show_board[x][y]!='*') {
printf("该位置已经探测过,无雷,重新输入\n");
Sleep(1000);
continue;
}
if (mine_board[x][y] == '0') {
show_board[x][y] = GetNums(mine_board, ROW, COL, x, y) + 48;
continue;
}
if (mine_board[x][y] == '1') {
printf("踩雷!游戏结束!\n");
ShowBoard(mine_board, ROW, COL);
break;
}
count--;
} while (count);
if (count == 0) {
system("cls");
ShowBoard(show_board, ROW, COL);
printf("厉害了,通关!\n");
}
}