语言)"/>
经典扫雷游戏(C语言)
今天给大家讲解用C语言写扫雷游戏的过程,希望大家可以多多支持!
目录
今天给大家讲解用C语言写扫雷游戏的过程,希望大家可以多多支持!
1.游戏菜单
2.游戏部分棋盘模拟。
3.打印棋盘
4.布置地雷
5.排雷
1.游戏菜单
写扫雷游戏的过程大致和三子棋游戏差不多。我会把代码放在最后。
第一步先写一个游戏菜单。
2.游戏部分棋盘模拟。
菜单写完后我们就要开始写游戏部分。首先想想扫雷也同样需要一个棋盘。于是我们先初始化一个棋盘。
board
:二维字符数组,用于存储游戏板的数据。rows
:整数,表示二维数组的行数。cols
:整数,表示二维数组的列数。set
:字符,要将数组中的元素设置为的字符。
3.打印棋盘
初始化好后,我们要看看我们的0是否已经在棋盘里的呢。我们于是需要打印棋盘。
4.布置地雷
这样我们的棋盘就打印好啦。棋盘打印好后,就该布置地雷了。
函数内部使用一个循环来随机选择地雷所在的位置,并将对应位置的元素设置为 '1'
,表示有地雷。循环的次数由常量 EASY_COUNT
控制,可以根据难度级别修改具体的值。请注意,在使用 rand()
函数之前,需要包含 <stdlib.h>
头文件还有<time.h>头文件。另外,为了使随机数取值范围正确,生成的行号和列号需要加 1。
这里我们同样用到了rand函数大家可以参考我这一篇文章 里面有对rand函数详细的介绍。
5.排雷
当我们布置好雷后,就要开始排雷了。
mine
:二维字符数组,表示游戏板的数据,存储地雷分布情况。x
:整数,表示要计算地雷数量的位置的行号。y
:整数,表示要计算地雷数量的位置的列号。
函数内部通过将指定位置周围8个格子中的元素相加,并减去 8 * '0'
(即字符 '0'
的ASCII码值乘以8),得到周围地雷的数量。
函数内部使用一个循环进行游戏的主逻辑。在每次循环中,请求用户输入要清除的坐标,并判断输入的坐标是否合法。合法的坐标范围是从 1 到行数和列数之间。如果输入的坐标超出了合法范围,则提示输入错误并重新输入。对于合法的坐标,首先检查该位置是否有地雷。如果有地雷,则游戏结束,输出失败信息,并调用 DisplayBoard
函数显示出地雷的分布情况。如果没有地雷,则根据周围地雷的数量更新显示状态,并调用 DisplayBoard
函数显示更新后的游戏板。游戏的胜利条件是清除除地雷以外的所有格子,当已经清除的格子数等于总格子数减去地雷数时,游戏胜利。
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i;int j;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i;int j;for (i = 0; i <= row; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("------扫雷------\n");
}void SetMine(char mine[ROWS][COLS], int row, int col)
{int count=EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;} }
}int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return mine[x - 1][y] +mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] +mine[x + 1][y] +mine[x + 1][y + 1] +mine[x][y + 1] +mine[x - 1][y + 1] - 8 * '0';
}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS] ,int row, int col)
{int x = 0;int y = 0;int win = 0;while (win<row*col-EASY_COUNT){printf("请输入要清除的坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y>=1 && y <= col){if (mine[x][y] == '1'){printf("抱歉你被炸死了。");DisplayBoard(mine, ROW, COL);break;}else{int c = GetMineCount(mine, x, y);show[x][y] = c + '0';DisplayBoard(show, ROW, COL);win++;}}else{printf("输入错误,请重新输入:");}}
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include "game.h"void meun()
{printf("***************\n");printf("**** 1.play ***\n");printf("**** 0.exit ***\n");printf("***************\n");
}void game()
{char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');/*DisplayBoard(mine, ROW, COL);*/DisplayBoard(show, ROW, COL);SetMine(mine, ROW, COL);/*DisplayBoard(mine, ROW, COL);*/FindMine(mine,show, ROW, COL);/*DisplayBoard(mine, ROW, COL);*/}int main()
{srand((unsigned int)time(NULL));int input = 0;do{meun();printf("请输入选项:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏,");break;default:printf("输入错误,请重新输入。");break;}} while (input);return 0;
}
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define EASY_COUNT 10
#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2#include <stdio.h>void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);void DisplayBoard(char board[ROWS][COLS], int row, int col);void SetMine(char mine[ROWS][COLS], int row, int col);void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS] ,int row, int col);
更多推荐
经典扫雷游戏(C语言)
发布评论