赞
踩
扫雷是一款十分经典的电脑休闲单机游戏,游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。
当玩家点击游戏区域,该处周围的八个位置有几个雷(如果是角落则是周边三个位置雷的个数,边缘位置同理),就展示数字几.如果该处是雷则直接结束游戏.
简易的图形化界面
玩家通过输入坐标以选择要扫雷的位置。
玩家第一次落子一定不踩雷
显示选择的坐标周围雷的个数,若周围没有雷则自动展开。
创建了两个二维数组,一个用于雷的布置,一个用于图形化的展示.
#define ROW 9
#define COL 9
#define ROWS ROW + 2
#define COLS ROW + 2
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
棋盘的格式为9x9,这里创建11x11的二维数组是为了当玩家选择坐标在棋盘周围时,正确显示所落子处四周雷的个数。
因此,这里将存放雷的数组最外层全部初始化为0(0表示无雷,1表示雷)。
用于展示的数组则全部初始化为“ * ” ,通过伪随机数的生成,来生成初始雷的坐标
Init(mine, ROW, COL, '0'); Init(show, ROW, COL, '*'); void Init(char board[ROWS][COLS], int row, int col, char set) { int i = 0 ; int j = 0 ; for (i = 0; i < row + 2; i++) { for (j = 0; j < col + 2; j++) { board[i][j] = set; } } }Init(mine, ROW, COL, '0'); Init(show, ROW, COL, '*'); void Init(char board[ROWS][COLS], int row, int col, char set) { int i = 0 ; int j = 0 ; for (i = 0; i < row + 2; i++) { for (j = 0; j < col + 2; j++) { board[i][j] = set; } } }
这里雷的布置采用了生成随机数的方法,具体方式为调用rand()函数,并在调用rand()函数之前,先用srand()为伪随机数生成器播撒种子,种子采用系统时钟来生成。
需要引用的头文件和定义:
#include<stdlib.h>
#include<time.h>
#define COUNT 10 //雷的个数
要注意的是srand()一定要在rand()之前使用,否则每次随机种子就是一定的,那么产生出来的随机数就是固定的。这里把srand()放在主函数一开始实现
srand((unsigned int)time(NULL));
Set_Mine(mine, ROW, COL,COUNT);
void Set_Mine(char mine[ROWS][COLS], int row, int col, int count)
{
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
Display(show, ROW, COL); ```handlebars void Display(char board[ROWS][COLS], int row, int col) { int i = 0; int j = 0; printf("******扫雷游戏*******\n"); for (i = 0; i < row + 1; i++) { printf("%d ", i); for (j = 1; j < col + 1; j++) { if (i == 0) printf("%d ", j); else printf("%c ", board[i][j]); } printf("\n"); } }
用于展示的棋盘:(周围的数字为方便玩家输入坐标)**
扫雷
这里将统计落子处四周雷的个数,实现周围无雷时自动展开的功能以及统计已排查的无雷坐标个数以确定玩家赢的条件分别封装为单独的函数,具体实现如下:
Sweep(mine, show, ROW, COL, COUNT); void Sweep(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int count) { int x = 0; int y = 0; int judge = 0; while (judge < row*col - count) { printf("请输入要扫除的坐标: \n"); scanf("%d %d", &x, &y); if (x < 0 || y < 0 || x > row || y > col) printf("坐标非法,请重新输入:\n"); else if (show[x][y] != '*') printf("该坐标已被扫除,请重新输入:\n"); if(judge == 0) No_mine(mine, show, x, y, row, col); if (mine[x][y] != '1') { Spread(x, y, mine, show, row, col); Display(show, row, col); } else { printf("你被炸死了\n"); break; } Stat_judge(show, &judge, row, col); } if (judge == row * col - count) { printf("恭喜你排雷成功\n"); } }
玩家第一次落子时不踩雷
void No_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int i, int j, int row, int col) { if (mine[i][j] == '1') { while (1) { int x = rand() % row + 1; int y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; break; } } mine[i][j] = '0'; }
统计落子处周围雷的个数
int Count_Mine(int x, int y, char mine[ROWS][COLS])
{
return mine[x - 1][y - 1]
+ mine[x - 1][y]
+ mine[x - 1][y + 1]
+ mine[x][y - 1]
+ mine[x][y + 1]
+ mine[x + 1][y - 1]
+ mine[x + 1][y]
+ mine[x + 1][y + 1] - 8 * '0';
}
递归实现周围无雷时自动展开的功能
void Spread(int x, int y, char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { char count = Count_Mine(x, y, mine) + '0'; if (count != '0') show[x][y] = count; else { show[x][y] = ' '; if (x - 1 > 0 && show[x - 1][y] == '*') Spread(x - 1, y, mine, show, row, col); if (y - 1 > 0 && show[x][y - 1] == '*') Spread(x, y - 1, mine, show, row, col); if (y + 1 < col + 1 && show[x][y + 1] == '*') Spread(x, y + 1, mine, show, row, show); if (x + 1 < row + 1 && show[x + 1][y] == '*') Spread(x + 1, y, mine, show, row, col); } }
统计当前棋盘已清扫的空格数,以判断最终扫雷是否成功
void Stat_judge(char show[ROWS][COLS], int* judge, int row, int col)
{
int i = 0;
int j = 0;
for (i = 1; i < row + 1; i++)
{
for (j = 1; j < col + 1; j++)
{
if (show[i][j] != '*')
(*judge)++;
}
如果玩家输入的坐标是合法的我们就统计它周围有多少雷,统计雷的功能我做成了一个内部函数防止重名。
如果全部没有雷的地方都排查完了,我们就停止循环。然后打印下雷的棋盘让玩家知道哪有雷,如果被炸死了,我们也打印下雷的二维数组让玩家死得瞑目。
#pragma once #include <stdio.h> #include <Windows.h> #include <time.h> #include <stdlib.h> #define ROW 9 #define COL 9 #define ROWS ROW + 2 #define COLS COL + 2 #define EASILY 0//雷的数量 //初始化 void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val); //显示棋盘 void Display_board(char mine[ROWS][COLS], int row, int col); //埋雷 void random_mine(char mine[ROWS][COLS], int row, int col); //扫雷 void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
#define _CRT_SECURE_NO_WARNINGS 1 #include "Game.h" int count = 0;//统计还剩多少格子没被扫 void game()//游戏实现 { char mine[ROWS][COLS] = { 0 };//用于埋雷 char show[ROWS][COLS] = { 0 };//用于游戏的画面显示 //初始化 initzeboard(show, ROWS, COLS, '*'); initzeboard(mine, ROWS, COLS, '0'); //显示棋盘 Display_board(show, ROW, COL); //Display_board(mine, ROW, COL); //埋雷 random_mine(mine, ROW, COL); //Display_board(mine, ROW, COL); //扫雷 mine_sweeping(mine, show, ROW, COL); } //初始化 void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val) { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { mine[i][j] = val; } } } //显示棋盘 void Display_board(char mine[ROWS][COLS], int row, int col) { int i = 0; int j = 0; printf(" 扫雷游戏\n"); printf("---------------------------------\n"); for (j = 0; j <= col; j++) { printf("%d ", j); } printf("\n"); for (i = 1; i <= row; i++) { printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", mine[i][j]); } printf("\n"); } } //埋雷 void random_mine(char mine[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int count = EASILY; while (count) { x = rand() % row + 1; y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } //统计周围雷的个数 static int statistics_mine(char mine[ROWS][COLS], int x, int y) { return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0'; } //扫雷 void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; while (count < row * col - EASILY) { system("cls"); Display_board(show, COL, ROW); printf("请输入坐标:>"); scanf("%d %d", &x, &y); if ((1 <= x && x <= row) && (1 <= y && y <= col)) { if (mine[x][y] == '0') { int leng = statistics_mine(mine, x, y); show[x][y] = leng + '0'; count++; } else { printf("很遗憾你被炸死了\n"); Display_board(mine, ROW, COL); break; } } else { printf("请输入有效数字!\n"); } } if (count == row * col - EASILY) { printf("恭喜你扫雷成功!\n"); Display_board(mine, ROW, COL); } }
#define _CRT_SECURE_NO_WARNINGS 1 #include "Game.h" extern void game(); int main() { int input = 0; srand((unsigned int)time(NULL)); do { printf("**************************\n"); printf("*** 1. play 0. exit ***\n"); printf("*** 2. clear ***\n"); printf("**************************\n"); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game();//游戏实现 break; case 2://清屏选项 system("cls"); break; case 0: printf("退出程序!\n"); break; default: printf("输入错误,请重新输入!\n"); Sleep(1000); system("cls"); break; } } while (input); return 0; }
以上就是“怎么用C语言实现扫雷小游戏”的内容了,经过本文的学习后,相信大家对怎么用C语言实现扫雷小游戏这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。