最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++實(shí)現(xiàn)俄羅斯方塊游戲代碼

 更新時(shí)間:2022年01月05日 08:51:09   作者:m0_51592169  
大家好,本篇文章主要講的是c++實(shí)現(xiàn)俄羅斯方塊游戲代碼,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下

俄羅斯方塊c++

1.創(chuàng)建項(xiàng)目
2.總共需要?jiǎng)?chuàng)建兩個(gè)文件,一個(gè)main.cpp,一個(gè)是elsfk2.h。本人使用的編譯器是vs2019.

3.在項(xiàng)目的源文件夾下創(chuàng)建一個(gè)文件夾image

在這里插入圖片描述

4.把下面兩張圖片重命名好放進(jìn)剛創(chuàng)建的文件夾

elsfk.jpg

elsfk_block.jpg

5.把下列代碼分別復(fù)制到對(duì)應(yīng)文件中

-----------------------------------------------------------------------------------
以下是main.cpp 文件的內(nèi)容


#include"elsfk2.h"

int main() {


	srand((int)time(0));
	//創(chuàng)建游戲窗口
	RenderWindow window(VideoMode(COL*18/*+100*/, ROW*18-36),"ELSFK");

	//添加游戲背景
	Texture t1,t2;
	t1.loadFromFile("image/elsfk.jpg");
	t2.loadFromFile("image/elsfk_block.jpg");
	Sprite sprite_Bg(t1);
	Sprite sprite_block(t2);

	NewBlock();

	Clock begin;
	float time1 = 0, time2 = 0;

	while (window.isOpen()) {

		time2 = begin.getElapsedTime().asSeconds();
		begin.restart();
		time1 += time2;
		//等待用戶按下按鍵
		keyEvent(&window);

		if (time1 > delay) {

			time1 = 0;
			blockDrop();
			

		}

		delay = SPEED_NOM;

		window.draw(sprite_Bg);

		drawBlock(&sprite_block, &window);

		window.display();
	

	}


}



--------------------------------------------------------------------------------
以下為elsfk2.cpp


#pragma once
#include<SFML/Graphics.hpp>				//圖像處理頭文件
//#include<SFML/Audio.hpp>			
#include<time.h>
using namespace sf;
#define ROW 22							//行
#define COL 10							//列
#define SPEED_NOM 0.5					//不加速運(yùn)動(dòng)的時(shí)間間隔
#define SPEED_QIK 0.05					//加速運(yùn)動(dòng)的時(shí)間間隔


int map[ROW][COL] = { 0 };				//游戲區(qū)域大小
int blocktype;							//方塊類型
int Delete=0;							//刪除的行數(shù)
float delay = SPEED_NOM;				//時(shí)間間隔


void Move_x(int);
void Rotate();
void ClearBlock();
void NewBlock();
void blockDrop();
void keyEvent(RenderWindow*);
void drawBlock(Sprite*, RenderWindow*);
bool check();

//存放7種方塊的二維數(shù)組
int a[7][4] = {
	1,3,5,7,
	2,4,5,7,
	3,5,4,6,
	3,5,4,7,
	2,3,5,7,
	3,5,7,6,
	2,3,4,5,
};

//點(diǎn)的結(jié)構(gòu)體
struct point {

	int x, y;

};

//當(dāng)前方塊
point block[4];
//方塊的備份
point bakblock[4];


//處理按鍵
void keyEvent(RenderWindow *w) {
	Event e;
	bool rotate = 0;
	int x = 0;
	while (w->pollEvent(e)) {

		if (e.type == Event::Closed) {
			w->close();
		}

		if (e.type == Event::KeyPressed) {
			switch (e.key.code) {
			case Keyboard::Up:
				rotate = 1;
				break;
			case Keyboard::Left:
				x = -1;
				break;
			case Keyboard::Right:
				x = 1;
				break;
			default:
				break;
			}
		}
		if (Keyboard::isKeyPressed(Keyboard::Down)) {
			delay = SPEED_QIK;

		}

		if (x) {
			Move_x(x);
		}

		if (rotate) {
			Rotate();
		}

	}

}



//消除完成的行
void ClearBlock() {
	int k = ROW - 1;
	for (int i = ROW - 1; i > 0; i--) {
		int count = 0;
		for (int j = 0; j < COL; j++) {
			if (map[i][j]) {
				count++;
			}
			map[k][j] = map[i][j];

		}
		if (count < COL) {
			k--;
		}
		
	}

}


//檢查移動(dòng)合理性
bool check() {

	for (int i = 0; i < 4; i++){
		if(	  block[i].x<0||block[i].x>=COL||block[i].y>=ROW||
		map[block[i].y][block[i].x]){
			return 0;
		}
	}
	return 1;

}


//方塊降落
void blockDrop() {
	
	for (int i = 0; i < 4; i++) {
		bakblock[i] = block[i];
		block[i].y++;

	}

	if (!check()) {
		for (int j = 0; j < 4; j++){
			map[bakblock[j].y][bakblock[j].x] = blocktype;
		}

		NewBlock();
		ClearBlock();
	}

}


//左右移動(dòng)
void Move_x(int x) {

	for (int  i = 0; i < 4; i++){
		bakblock[i] = block[i];
		block[i].x += x;

	}
	if (!check()) {
		for (int i = 0; i < 4; i++) {
			block[i] = bakblock[i];

		}
	}

}


//旋轉(zhuǎn)******************************    important
void Rotate() {
	if (blocktype == 7) {
		return;
	}
	point p = block[1];
	for (int i = 0; i < 4; i++) {
		bakblock[i] = block[i];
		block[i].x = p.x - bakblock[i].y + p.y;
		block[i].y = bakblock[i].x - p.x + p.y;
	}
	if (!check()) {
		for (int i = 0; i < 4; i++) {
			block[i] = bakblock[i];
		}
	}

}


//生成方塊
void NewBlock() {

	blocktype = 1 + rand() % 7;

	for (int i = 0; i < 4; i++) {
		block[i].x = a[blocktype-1][i] % 2+4;
		block[i].y = a[blocktype-1][i] / 2;
	}


}


//繪制方塊
void drawBlock(Sprite *b, RenderWindow *w) {

	//完成的方塊
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			if (map[i][j] != 0) {
				b->setTextureRect(IntRect(map[i][j]*18,0,18,18));
				b->setPosition(j * 18, i * 18);
				b->move(0, -36);
				w->draw(*b);
			}

		}

	}

	for (int j = 0; j < 4; j++)
	{
		b->setTextureRect(IntRect(blocktype * 18, 0, 18, 18));
		b->setPosition(block[j].x * 18, block[j].y * 18);
		b->move(0, -36);
		w->draw(*b);
	}

}


到此這篇關(guān)于c++實(shí)現(xiàn)俄羅斯方塊游戲代碼的文章就介紹到這了,更多相關(guān)c++俄羅斯方塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言陷阱與缺陷之?dāng)?shù)組越界訪問詳解

    C語言陷阱與缺陷之?dāng)?shù)組越界訪問詳解

    這篇文章主要為大家詳細(xì)介紹了C語言的數(shù)組越界訪問,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語言如何寫類實(shí)現(xiàn)教程示例

    C語言如何寫類實(shí)現(xiàn)教程示例

    這篇文章主要為大家介紹了C語言如何寫類的實(shí)現(xiàn)教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • C語言怎么獲得進(jìn)程的PE文件信息

    C語言怎么獲得進(jìn)程的PE文件信息

    這篇文章主要介紹了C語言怎么獲得進(jìn)程的PE文件信息的相關(guān)代碼,需要的朋友可以參考下
    2016-01-01
  • C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例

    C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例

    大家好,本篇文章主要講的是C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C++ 基礎(chǔ)教程之虛函數(shù)實(shí)例代碼詳解

    C++ 基礎(chǔ)教程之虛函數(shù)實(shí)例代碼詳解

    虛函數(shù)在 c++ 的繼承體系中是一個(gè)非常重要概念,讓我們可以在子類中復(fù)寫父類的方法。這篇文章主要介紹了C++ 基礎(chǔ)教程之虛函數(shù)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2020-02-02
  • C++鏈表實(shí)現(xiàn)通訊錄設(shè)計(jì)

    C++鏈表實(shí)現(xiàn)通訊錄設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C++鏈表實(shí)現(xiàn)通訊錄設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++線程同步實(shí)例分析

    C++線程同步實(shí)例分析

    這篇文章主要介紹了C++線程同步實(shí)例分析,以實(shí)例的形式較為深入的分析了C++的線程同步問題,是一個(gè)較為經(jīng)典的線程同步問題,需要的朋友可以參考下
    2014-10-10
  • 詳解C++中的const和constexpr

    詳解C++中的const和constexpr

    這篇文章主要為大家介紹了C++中的const和constexpr ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 在std::thread中創(chuàng)建并管理QEventLoop的全面解析

    在std::thread中創(chuàng)建并管理QEventLoop的全面解析

    QEventLoop的工作原理可以簡(jiǎn)單地理解為一個(gè)無限循環(huán),它會(huì)不斷地檢查是否有新的事件需要處理,如果有,就將事件從事件隊(duì)列中取出,然后找到相應(yīng)的事件處理器進(jìn)行處理,這篇文章主要介紹了在std::thread中創(chuàng)建并管理QEventLoop的全面指南,需要的朋友可以參考下
    2023-06-06
  • C語言指針學(xué)習(xí)經(jīng)驗(yàn)總結(jié)淺談

    C語言指針學(xué)習(xí)經(jīng)驗(yàn)總結(jié)淺談

    指針是C語言的難點(diǎn)和重點(diǎn),但指針也是C語言的靈魂 。
    2013-03-03

最新評(píng)論

二连浩特市| 德阳市| 镇雄县| 竹溪县| 安国市| 铁岭市| 弥渡县| 麻阳| 桂平市| 贺兰县| 集贤县| 台山市| 靖州| 上犹县| 甘谷县| 昌平区| 阜平县| 长岭县| 文昌市| 阳信县| 锦州市| 崇义县| 齐齐哈尔市| 谢通门县| 屯留县| 香港 | 上杭县| 胶州市| 白银市| 浦东新区| 礼泉县| 安达市| 渭源县| 丹巴县| 永丰县| 永定县| 望谟县| 武功县| 凯里市| 象山县| 越西县|