C/C++백 줄 코드 가 인기 게임 소 락 기능 을 실현 하 는 예제 코드

게임 디자인
먼저 우 리 는 제3자 프레임 워 크 를 사용 해 야 한다.여기 서 나 는 sfml 를 사용 하고 sfml 를 사용 하지 않 는 다.나의 지난 몇 편의 글 에서-지뢰 해제(상)상세 한 개발 환경 구축 소개 가 있다.
우선 이미지 자원 을 준비 합 니 다.
배경 사진 한 장,보석 사진 한 장
在这里插入图片描述
창 에서 그림 불 러 오기 초기 화
Texture t1;
t1.loadFromFile(“images/bg2.png”);

마 우 스 를 처음 눌 렀 을 때 위 치 를 기록 하고 두 번 째 클릭 으로 위 치 를 기록 합 니 다.두 개의 작은 사각형 이 인접 하면 위 치 를 교환 합 니 다.그림 c 와 같은 위치 에 인접 하지 않 으 면 변화 가 발생 하지 않 습 니 다.
在这里插入图片描述
줄 이나 열 을 판단 할 때 같은 그림 세 장 이 인접 하면 그림 을 지우 고 새로 고침 합 니 다.
실제로 열거 하 다

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <time.h>

using namespace sf;

#define GAME_ROWS_COUNT 8
#define GAME_COLS_COUNT 8

int ts = 57; //              

bool isMoving = false;
bool isSwap = false;

//           , 2        
int click = 0;

Vector2i pos; //        
Vector2i offset(15, 273);

int posX1, posY1; //        (        )
int posX2, posY2; //        (        )

struct Block {
	int x, y; //    x == col * ts y == row * ts;
	int row, col; //   ,   
	int kind; //        
	bool match; //      
	int alpha; //   

	Block() {
		match = false;
		alpha = 255;
		kind = -1;
	}
} grid[GAME_ROWS_COUNT + 2][GAME_ROWS_COUNT + 2];

void swap(Block p1, Block p2) {
	std::swap(p1.col, p2.col);
	std::swap(p1.row, p2.row);

	grid[p1.row][p1.col] = p1;
	grid[p2.row][p2.col] = p2;
}

void doEvent(RenderWindow* window) {
	Event e;
	while (window->pollEvent(e)) {
		if (e.type == Event::Closed) {
			window->close();
		}

		if (e.type == Event::MouseButtonPressed) {
			if (e.key.code == Mouse::Left) {
				if (!isSwap && !isMoving) click++;
				pos = Mouse::getPosition(*window) - offset;
			}
		}
	}

	if (click == 1) {
		posX1 = pos.x / ts + 1;
		posY1 = pos.y / ts + 1;
	}
	else if (click == 2) {
		posX2 = pos.x / ts + 1;
		posY2 = pos.y / ts + 1;

		//           
		if (abs(posX2 - posX1) + abs(posY2 - posY1) == 1) {
			//           
			//       ,    ?
			swap(grid[posY1][posX1], grid[posY2][posX2]);
			isSwap = 1;
			click = 0;
		}
		else {
			click = 1;
		}
	}
}

void check() {
	for (int i = 1; i <= GAME_ROWS_COUNT; i++) {
		for (int j = 1; j <= GAME_COLS_COUNT; j++) {
			if (grid[i][j].kind == grid[i + 1][j].kind &&
				grid[i][j].kind == grid[i - 1][j].kind) {
				//grid[i - 1][j].match++;
				//grid[i][j].match++;
				//grid[i + 1][j].match++;
				for (int k = -1; k <= 1; k++) grid[i + k][j].match++;
			}

			if (grid[i][j].kind == grid[i][j - 1].kind &&
				grid[i][j].kind == grid[i][j + 1].kind) {
				//grid[i][j - 1].match++;
				//grid[i][j + 1].match++;
				//grid[i][j].match++;
				for (int k = -1; k <= 1; k++) grid[i][j + k].match++;
			}
		}
	}
}

void doMoving() {
	isMoving = false;

	for (int i = 1; i <= GAME_ROWS_COUNT; i++) {
		for (int j = 1; j <= GAME_COLS_COUNT; j++) {
			Block& p = grid[i][j]; //   p,   grid[i][j]   
			int dx, dy;

			for (int k = 0; k < 4; k++) {
				dx = p.x - p.col * ts;
				dy = p.y - p.row * ts;

				if (dx) p.x -= dx / abs(dx);
				if (dy) p.y -= dy / abs(dy);
			}

			if (dx || dy) isMoving = true;
		}
	}
}

void xiaochu() {
	for (int i = 1; i <= GAME_ROWS_COUNT; i++) {
		for (int j = 1; j <= GAME_COLS_COUNT; j++) {
			if (grid[i][j].match && grid[i][j].alpha > 10) {
				grid[i][j].alpha -= 10;
				isMoving = true;
			}
		}
	}
}

void huanYuan() {
	if (isSwap && !isMoving) {
		//             ,    
		int score = 0;
		for (int i = 1; i <= GAME_ROWS_COUNT; i++) {
			for (int j = 1; j <= GAME_COLS_COUNT; j++) {
				score += grid[i][j].match;
			}
		}

		if (score == 0) {
			swap(grid[posY1][posX1], grid[posY2][posX2]);
		}

		isSwap = false;
	}
}

void updateGrid() {
	for (int i = GAME_ROWS_COUNT; i > 0; i--) {
		for (int j = 1; j <= GAME_COLS_COUNT; j++) {
			if (grid[i][j].match) {
				for (int k = i - 1; k > 0; k--) {
					if (grid[k][j].match == 0) {
						swap(grid[k][j], grid[i][j]);
						break;
					}
				}

			}
		}
	}

	for (int j = 1; j <= GAME_COLS_COUNT; j++) {
		int n = 0;
		for (int i = GAME_ROWS_COUNT; i > 0; i--) {
			if (grid[i][j].match) {
				grid[i][j].kind = rand() % 7;
				grid[i][j].y = -ts * n;
				n++;
				grid[i][j].match = false;
				grid[i][j].alpha = 255;
			}
		}
	}
}

void drawBlocks(Sprite* sprite, RenderWindow* window) {
	for (int i = 1; i <= GAME_ROWS_COUNT; i++) {
		for (int j = 1; j <= GAME_COLS_COUNT; j++) {
			Block p = grid[i][j];
			sprite->setTextureRect(
				IntRect(p.kind * 52, 0, 52, 52));
			//      
			sprite->setColor(Color(255, 255, 255, p.alpha));
			sprite->setPosition(p.x, p.y);
			//     gird  Block,   Block   ,    1   ,
			//             x,y  
			//        ,       ,                            
			//           0  0 (      0  0 )
			sprite->move(offset.x - ts, offset.y - ts); // to do
			window->draw(*sprite);
		}
	}
}

void initGrid() {
	for (int i = 1; i <= GAME_ROWS_COUNT; i++) {
		for (int j = 1; j <= GAME_COLS_COUNT; j++) {
			grid[i][j].kind = rand() % 3;
			grid[i][j].col = j;
			grid[i][j].row = i;
			grid[i][j].x = j * ts;
			grid[i][j].y = i * ts;
		}
	}
}

int main(void) {
	srand(time(0));

	RenderWindow window(VideoMode(485, 917), "canxin-xiaoxiaole");
	//          
	window.setFramerateLimit(60);

	Texture t1, t2;
	t1.loadFromFile("images/bg2.png");
	if (!t2.loadFromFile("images/1.png")) {
		return -1;
	}
	Sprite spriteBg(t1);
	Sprite spriteBlock(t2);

	initGrid();

	while (window.isOpen()) {
		//          
		doEvent(&window);

		//       
		check();

		//     
		doMoving();

		//   
		if (!isMoving) {
			xiaochu();
		}

		//     
		huanYuan();

		if (!isMoving) {
			updateGrid();
		}

		//       
		window.draw(spriteBg);
		//          
		drawBlocks(&spriteBlock, &window);
		//   
		window.display();
	}

	return 0;
}
총결산
여기 서 C/C++백 줄 코드 가 인기 게임 소 락 기능 을 실현 하 는 예제 코드 에 관 한 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C+소 락 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기