c++實(shí)現(xiàn)俄羅斯方塊游戲代碼
俄羅斯方塊c++
1.創(chuàng)建項(xiàng)目
2.總共需要創(chuàng)建兩個文件,一個main.cpp,一個是elsfk2.h。本人使用的編譯器是vs2019.
3.在項(xiàng)目的源文件夾下創(chuàng)建一個文件夾image

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

elsfk.jpg

elsfk_block.jpg
5.把下列代碼分別復(fù)制到對應(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)動的時間間隔
#define SPEED_QIK 0.05 //加速運(yùn)動的時間間隔
int map[ROW][COL] = { 0 }; //游戲區(qū)域大小
int blocktype; //方塊類型
int Delete=0; //刪除的行數(shù)
float delay = SPEED_NOM; //時間間隔
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--;
}
}
}
//檢查移動合理性
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();
}
}
//左右移動
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)和電腦對戰(zhàn)三子棋實(shí)例
大家好,本篇文章主要講的是C++實(shí)現(xiàn)和電腦對戰(zhàn)三子棋實(shí)例,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01
C++ 基礎(chǔ)教程之虛函數(shù)實(shí)例代碼詳解
虛函數(shù)在 c++ 的繼承體系中是一個非常重要概念,讓我們可以在子類中復(fù)寫父類的方法。這篇文章主要介紹了C++ 基礎(chǔ)教程之虛函數(shù)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2020-02-02
C++鏈表實(shí)現(xiàn)通訊錄設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C++鏈表實(shí)現(xiàn)通訊錄設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06
在std::thread中創(chuàng)建并管理QEventLoop的全面解析
QEventLoop的工作原理可以簡單地理解為一個無限循環(huán),它會不斷地檢查是否有新的事件需要處理,如果有,就將事件從事件隊(duì)列中取出,然后找到相應(yīng)的事件處理器進(jìn)行處理,這篇文章主要介紹了在std::thread中創(chuàng)建并管理QEventLoop的全面指南,需要的朋友可以參考下2023-06-06
C語言指針學(xué)習(xí)經(jīng)驗(yàn)總結(jié)淺談
指針是C語言的難點(diǎn)和重點(diǎn),但指針也是C語言的靈魂 。2013-03-03

