Código fuente de Jiugongge puzzle C ++ (implementado con pensamiento orientado a objetos, puede ingresar cualquier número de filas y columnas por debajo de 8 y 8 para el juego de puzzle Jiugongge)

¡Déjame hablar primero de los aspectos más destacados de este programa!
① No solo la cuadrícula de nueve cuadrados, sino también la cuadrícula de cuatro cuadrados o la cuadrícula de 16 cuadrados. Los amigos interesantes pueden encontrar fácilmente que la matriz de fechas es una matriz que contiene 64 tipos int, por lo que puede lograr un mapa de 8 * 8 en la mayoría;
② Este programa usa una matriz unidimensional para imprimir el mapa;
③ El método de tomar números aleatorios del 1 al 8 es inteligente; (este es un método relativamente simple e inteligente que se aprende al navegar por otros blogs)
④Contiene código para juzgar el situación que no es verdadera, por lo que las condiciones generadas son todas verdaderas (esta es una condición de juicio que usa el número ordinal inverso, es decir, se considera como un conjunto de números de adelante hacia atrás, y el número ordinal inverso es impar, y el número ordinal inverso es par.) No hay
muchas palabras Diga, primero echemos un vistazo al código fuente, ¡jaja! !

// An highlighted block
#include<iostream>
#include<ctime>
#include<iomanip>
#include<conio.h>
using namespace std;
class Game {
    
    
private:
	int m_N;
	int date[64];
public:
	friend int ifhave(const Game& a);//判断情况是否有解
	void setdate(int N);//设置初始地图
	void showdate();//打印地图
	void OnKeyboard();//通过w,s,a,d移动拼图;
	bool gameover();//判断游戏是否达到结束条件
};
void Game::setdate(int N) {
    
    
	m_N = N;
	for (int i = 0; i < m_N*m_N; i++) {
    
    
		date[i] = 0;
	}//将所有数据设置为0;
	int number;
	srand(time(0));
	for (int i = 1; i < N * N; i++) 
	{
    
    
		number = rand() % (N * N-1);
		if (date[number] == 0)
		{
    
    
			date[number] = i;
		}
		else
		{
    
    
			for (int j = number+1;; j++)
			{
    
    
				if (j == N * N-1)
				{
    
    
					j = 0;
				}
				if (date[j] == 0)
				{
    
    
					date[j] = i;
					break;
				}
			}
		}
	}
}

void Game::showdate() {
    
    
	for (int j = 0; j < m_N; j++) {
    
    
		cout << "----";
	}
	cout << endl;
	cout << "|";
	for (int i = 1; i <= m_N*m_N; i++) {
    
    
		if (date[i-1] == 0) {
    
    
			cout << setw(3) << " " << "|";
		}
		else {
    
    
			
			cout << setw(3) << date[i-1] << "|";
		}
		if (i % m_N == 0) {
    
    
			cout << endl;
			for (int j = 0; j < m_N; j++) {
    
    
				cout << "----";
			}
			cout << endl;
			if (i <= m_N * m_N - 1)
				cout << "|";
		}
	}
}
void Game::OnKeyboard() {
    
    
	char c;
	int i, j;
	c = _getch();
	switch (c)
	{
    
    
	case 'a':	//左 
	case 'A':
		for (i = 0; i < m_N*m_N; i++)
		{
    
    
			if (date[i] == 0 && i % m_N != m_N - 1)
			{
    
    
				date[i] = date[i + 1];
				date[i + 1] = 0;
				break;
			}
		}
		break;
	case 'w':	//上 
	case 'W':
		for (i = 0; i < m_N*m_N - m_N; i++)
		{
    
    
			if (date[i] == 0)
			{
    
    
				date[i] = date[i + m_N];
				date[i + m_N] = 0;
				break;
			}
		}
		break;
	case 's':	//下 
	case 'S':
		for (i = m_N; i < m_N*m_N; i++)
		{
    
    
			if (date[i] == 0)
			{
    
    
				date[i] = date[i - m_N];
				date[i - m_N] = 0;
				break;
			}
		}
		break;
	case 'd':	//右 
	case 'D':
		for (i = 0; i < m_N*m_N; i++)
		{
    
    
			if (date[i] == 0 && i % m_N != 0)
			{
    
    
				date[i] = date[i - 1];
				date[i - 1] = 0;
				break;
			}
		}
		break;
	}
}
int ifhave(const Game& a)				//判断随机生成的地图是否有解 
{
    
    
	int reverse = 0;				//逆序数为奇数时无解,为偶数时有解 
	int i, j;
	for (i = 0; i < a.m_N * a.m_N - 1; i++) 
	{
    
    
		if (a.date[i] == 0)
			continue;
		for (j = i + 1; j < a.m_N * a.m_N; j++)
		{
    
    
			if (a.date[j] == 0)
				continue;
			if (a.date[i] != 0 && a.date[i] > a.date[j])//不是最大的数且又比后面的数字大,逆序数加1 
			{
    
    
				reverse++;
			}
		}
	}
	if (reverse % 2 == 0)  //逆序数为偶数,拼图有解 
	{
    
    
		return 1;
	}
	else
	{
    
    
		return 0;
	}
}

bool Game::gameover() {
    
    
	int i;
	for (i = 0; i < m_N*m_N - 2; i++)
	{
    
    
		if (date[i] > date[i + 1])
		{
    
    
			return 0;
		}
		if (date[m_N * m_N - 1] != 0) {
    
    
			return 0;
		}
	}
	return 1;
}
int main() {
    
    
	Game play;
	cout << "请输入您要玩的九宫格拼图长度:";
	int N;
	cin >> N;
	while (1) {
    
    
		play.setdate(N);
		if (ifhave(play)) {
    
    
			break;
		}
	}
	play.showdate();
	while (1) {
    
    
		play.OnKeyboard();
		system("CLS");
		play.showdate();
		if (play.gameover()) {
    
    
			cout << "恭喜您,您成功了" << endl;
			break;
		}
	}
	system("pause");
	return 0;
}

Puede copiar el código y ejecutarlo primero para ver los resultados, y luego observar el proceso de implementación en detalle para aclararlo.

Eso es todo, si es útil, por favor deje un pulgar hacia arriba, ¡jaja!

Supongo que te gusta

Origin blog.csdn.net/myf_666/article/details/113703969
Recomendado
Clasificación