Bringen Sie Sie zum ersten Minensuchspiel – [C-Sprache]

 Inhaltsverzeichnis

1. Die Idee der Realisierung des Minesweeper-Spiels

Anmerkung 1 

Anmerkung 2 

2. Die Funktion realisiert die Minensuchfunktion

2.1 Initialisieren Sie das Schachbrett

2.2 Zeigen Sie das Schachbrett an

2.3 Donner einstellen

2.4 Minenerkennung

2.5 Gibt die Anzahl der Minen in der Nähe zurück

3. Quellcode

3.1 Spiel.h

3.2 Spiel.c 

3.3 test.c


1. Die Idee der Realisierung des Minesweeper-Spiels



Anmerkung 1 

Hier nehmen wir ein 9*9-Schachbrett (das 10 Minen enthält), um dies zu erreichen (hier können Sie auch die Größe des Schachbretts und die Anzahl der Minen anpassen).

„Wir verwenden hier „0“, um anzuzeigen, dass es nicht von mir ist, und „1“, um anzugeben, dass es mir gehört.“

! ! ! ——>Diese Einstellung ist tatsächlich von Vorteil und spiegelt sich in 2,5 wider (spiegelt sich in der Funktion wider, die Anzahl der Minen zurückzugeben).


Hinweis 1: Wenn wir spielen, klicken wir zufällig auf einen Sitzplatz und es wird angezeigt, wie viele der 8 Positionen in der Nähe dieser Position Minen sind. Wenn das zweidimensionale Array zu diesem Zeitpunkt implementiert wird, treten die folgenden Probleme auf:

1. Wenn es sich bei dem von uns angeklickten Ort nicht um eine Mine handelt und nur einer der 8 nahe gelegenen Standorte eine Mine ist, möchten wir angeben, dass sich in der Nähe dieses Standorts nur eine Mine befindet, und müssen diesen Standort der Nummer 1 zuweisen

2. Derzeit gibt es jedoch ein solches Problem: Wenn wir das Schachbrett nach dem einmaligen Fegen von Minen anzeigen, kann der Spieler nicht beurteilen, ob es sich bei dieser Position um eine Mine handelt oder wie viele Minen es gibt, da dieser Position der Wert 1 zugewiesen ist.


Zu diesem Zeitpunkt verwenden wir die folgende Methode, um ✌ zu lösen: Verwenden Sie zwei zweidimensionale Arrays, um dies zu erreichen

Ein zweidimensionales Array speichert Minen und das andere zweidimensionale Array speichert die überprüften Informationen


Anmerkung 2 

Hier verwenden wir ein zweidimensionales 9 * 9-Array, um das Array anzuzeigen. Wenn wir jedoch zu diesem Zeitpunkt die beiden Zeilen und zwei Spalten am Rand des zweidimensionalen Arrays überprüfen und darauf zugreifen, wird der Array-Index angezeigt außerhalb der Grenzen erscheinen


✌> Zu diesem Zeitpunkt können wir das zweidimensionale Array von 11 * 11 direkt definieren, um es sehr gut zu lösen



2. Die Funktion realisiert die Minensuchfunktion

2.1 Initialisieren Sie das Schachbrett

Hinweis: Hier sollen zwei Arrays initialisiert werden

           》Wir initialisieren das Minen-Array – speichern Minen – alle auf „0“

           „Wir haben das Show-Array – Speichern der Informationen zum Erkennen von Minen – alle auf „✳“ initialisiert, um das Schachbrett geheimnisvoll zu halten

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)//这里的set可以自定义
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

2.2 Zeigen Sie das Schachbrett an

Schachbrettdarstellung optimieren:

Die obere Reihe des Schachbretts —> die Spaltennummer ausdrucken

Die vordere Reihe des Schachbretts —> die Reihennummer drucken

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int  i = 0;
	printf("--------扫雷游戏-------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}


2.3 Donner einstellen

Generieren Sie zufällige zweidimensionale Array-Indizes und ordnen Sie 10 Minen an

Hier müssen wir drei Funktionen verwenden, um Zufallszahlen zu generieren – Rand, Srand, Zeit

void SetMine(char board[ROWS][COLS], int row, int col)
{
	//布置10个雷
	//生成随机的坐标,布置雷
	int count = EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

2.4 Minenerkennung

In der Funktion zum Überprüfen von Minen müssen wir eine Funktion implementieren, die zurückgibt, wie viele Minen sich an dieser Position befindenGetMineCount

Nachdem Sie den Wert zurückgegeben und die Minen überprüft haben, wird die Anzahl der Minen in der Nähe dieser Position angezeigt

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("很遗憾,你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				//该位置不是雷,就统计这个坐标周围有几个雷
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

2.5 Gibt die Anzahl der Minen in der Nähe zurück

Wissen hinzufügen: Zeichen werden im ASCII-Wert im Speicher gespeichert


„0“, „1“, „2“ entsprechen ASCII bzw. 48, 49, 50 „

Derzeit gibt es gegenseitige Konvertierungen zwischen Zahlen und Zeichen

1. > Zahl 2 + „0“ = 2+48=50 ——> „2“ Zahl zu Zeichen

2. > „2“ – „0“ = 2 Zeichen zu Zahlen

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');
}


3. Quellcode

3.1 Spiel.h

#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

//初始化棋盘
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 board[ROWS][COLS], int row, int col);

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

3.2 Spiel.c 

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int  i = 0;
	printf("--------扫雷游戏-------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

void SetMine(char board[ROWS][COLS], int row, int col)
{
	//布置10个雷
	//生成随机的坐标,布置雷
	int count = EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		if (board[x][y] == '0')
		{
			board[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("很遗憾,你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				//该位置不是雷,就统计这个坐标周围有几个雷
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

3.3 test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void menu()
{
	printf("***********************\n");
	printf("*****   1. play   *****\n");
	printf("*****   0. exit   *****\n");
	printf("***********************\n");
}

void game()
{
	char mine[ROWS][COLS];//存放布置好的雷
	char show[ROWS][COLS];//存放排查出的雷的信息
	//初始化棋盘
	//1. mine数组最开始是全'0'
	//2. show数组最开始是全'*'
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	//打印棋盘
	//DisplayBoard(mine, ROW, COL);
	DisplayBoard(show, ROW, COL);
	//1. 布置雷
	SetMine(mine, ROW, COL);
	//DisplayBoard(mine, ROW, COL);
	//2. 排查雷
	FindMine(mine, show, ROW, COL);
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);

	return 0;
}

Was Xiaoyu hier implementiert hat, ist eine einfache Version des Minensuchens ohne die rekursive Funktion, und Xiaoyu wird es verbessern, nachdem er es gelernt hat!

Wenn Sie der Meinung sind, dass der Artikel gut ist, freue ich mich über Ihren One-Click-Triple-Link. Ihre Ermutigung ist die Quelle der Motivation für meine Kreation. Lassen Sie uns zusammenarbeiten und wir sehen uns an der Spitze! ! !

おすすめ

転載: blog.csdn.net/qq_58286439/article/details/130707564