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

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

elsfk.jpg

elsfk_block.jpg
5.把下列代碼分別復制到對應文件中
-----------------------------------------------------------------------------------
以下是main.cpp 文件的內容
#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 //不加速運動的時間間隔
#define SPEED_QIK 0.05 //加速運動的時間間隔
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,
};
//點的結構體
struct point {
int x, y;
};
//當前方塊
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];
}
}
}
//旋轉****************************** 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);
}
}
到此這篇關于c++實現(xiàn)俄羅斯方塊游戲代碼的文章就介紹到這了,更多相關c++俄羅斯方塊內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++?Boost?MultiArray簡化使用多維數(shù)組庫
Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱2022-11-11
C++ 數(shù)據(jù)類型強制轉化的實現(xiàn)
這篇文章主要介紹了C++ 數(shù)據(jù)類型強制轉化的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
VSCode 搭建 Arm 遠程調試環(huán)境的步驟詳解
這篇文章主要介紹了VSCode 搭建 Arm 遠程調試環(huán)境的步驟詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04

