c++實(shí)現(xiàn)俄羅斯方塊游戲代碼
俄羅斯方塊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; //等待用戶(hù)按下按鍵 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; //方塊類(lèi)型 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)態(tài)加載so/dll庫(kù)的實(shí)現(xiàn)
本文主要介紹了C++動(dòng)態(tài)加載so/dll庫(kù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07C++實(shí)現(xiàn)讀寫(xiě)文件的示例代碼
這篇文章主要介紹了C++實(shí)現(xiàn)讀寫(xiě)文件的示例代碼,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-08-08C++?Boost?MultiArray簡(jiǎn)化使用多維數(shù)組庫(kù)
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)2022-11-11Qt實(shí)現(xiàn)繪制多個(gè)設(shè)備的流量曲線圖詳解
這篇文章主要為大家詳細(xì)介紹了如何使用Qt開(kāi)發(fā)繪制多個(gè)設(shè)備的流量曲線圖,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下2023-01-01C++ 數(shù)據(jù)類(lèi)型強(qiáng)制轉(zhuǎn)化的實(shí)現(xiàn)
這篇文章主要介紹了C++ 數(shù)據(jù)類(lèi)型強(qiáng)制轉(zhuǎn)化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02使用用C++做一顆會(huì)跳動(dòng)的愛(ài)心實(shí)例代碼
大家好,本篇文章主要講的是使用用C++做一顆會(huì)跳動(dòng)的愛(ài)心實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,歡迎借鑒學(xué)習(xí)C++做一顆會(huì)跳動(dòng)的愛(ài)心實(shí)例代碼2021-12-12VSCode 搭建 Arm 遠(yuǎn)程調(diào)試環(huán)境的步驟詳解
這篇文章主要介紹了VSCode 搭建 Arm 遠(yuǎn)程調(diào)試環(huán)境的步驟詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04