Как сделать подсчет очков по удаляемым линиям? Допустим убралась линия - плюс 40 очков. Пишу в Visual Studio 2017. Вот мой код:
#include <SFML/Graphics.hpp>
#include <time.h>
#include <iostream>
using namespace std;
using namespace sf;
const int M = 20;
const int N = 10;
int field[M][N] = { 0 };
struct Point
{
int x, y;
} a[4], b[4];
int figures[7][4] =
{
1,3,5,7, // I
2,4,5,7, // Z
3,5,4,6, // S
3,5,4,7, // T
2,3,5,7, // L
3,5,7,6, // J
2,3,4,5, // O
};
bool check()
{
for (int i = 0; i<4; i++)
if (a[i].x<0 || a[i].x >= N || a[i].y >= M) return 0;
else if (field[a[i].y][a[i].x]) return 0;
return 1;
};
void menu(RenderWindow&window)
{
Texture menuTexture1, menuTexture3;
menuTexture1.loadFromFile("images/111.png");
menuTexture3.loadFromFile("images/333.png");
Sprite menu1(menuTexture1), menu3(menuTexture3);
bool isMenu = 1;
int menuNum = 0;
menu1.setPosition(75, 50);
menu3.setPosition(73, 150);
while (isMenu)
{
menu1.setColor(Color::White);
menu3.setColor(Color::White);
menuNum = 0;
window.clear(Color(129, 181, 221));
if (IntRect(100, 30, 300, 50).contains(Mouse::getPosition(window))) { menu1.setColor(Color::Blue); menuNum = 1; }
if (IntRect(100, 150, 300, 50).contains(Mouse::getPosition(window))) { menu3.setColor(Color::Blue); menuNum = 3; }
if (Mouse::isButtonPressed(Mouse::Left))
{
if (menuNum == 1) isMenu = false;
if (menuNum == 3) { window.close(); isMenu = false; }
}
window.draw(menu1);
window.draw(menu3);
window.display();
}
}
int main()
{
srand(time(0));
RenderWindow window(VideoMode(310, 405), "Tetris");
menu(window);//вызов меню
Texture t1, t2,t3;
t1.loadFromFile("images/tiles.png");
t2.loadFromFile("images/background.png");
t3.loadFromFile("images/frame.png");
Font font;
font.loadFromFile("shrift/CyrilicOld.ttf");
Text text("", font, 20);
//text.setColor(Color::Green);
text.setStyle(sf::Text::Bold | sf::Text::Underlined);
text.setString("Ваши Очки:");
text.setPosition(0,0);
window.draw(text);
Sprite s(t1), background(t2),frame(t3);;
int dx = 0; bool rotate = 0; int colorNum = 1;
float timer = 0, delay = 0.3;
Clock clock;
while (window.isOpen())
{
float time = clock.getElapsedTime().asSeconds();
clock.restart();
timer += time;
Event e;
while (window.pollEvent(e))
{
if (e.type == Event::Closed)
window.close();
if (Keyboard::isKeyPressed(Keyboard::Escape)) { menu(window);}
if (e.type == Event::KeyPressed)
if (e.key.code == Keyboard::Up) rotate = true;
else if (e.key.code == Keyboard::Left) dx = -1;
else if (e.key.code == Keyboard::Right) dx = 1;
}
if (Keyboard::isKeyPressed(Keyboard::Down)) delay = 0.05;
//// <- Move -> ///
for (int i = 0; i<4; i++) { b[i] = a[i]; a[i].x += dx; }
if (!check()) for (int i = 0; i<4; i++) a[i] = b[i];
//////Rotate//////
if (rotate)
{
Point p = a[1]; //center of rotation
for (int i = 0; i<4; i++)
{
int x = a[i].y - p.y;
int y = a[i].x - p.x;
a[i].x = p.x - x;
a[i].y = p.y + y;
}
if (!check()) for (int i = 0; i<4; i++) a[i] = b[i];
}
///////Tick//////
if (timer>delay)
{
for (int i = 0; i<4; i++) { b[i] = a[i]; a[i].y += 1; }
if (!check())
{
for (int i = 0; i<4; i++) field[b[i].y][b[i].x] = colorNum;
colorNum = 1 + rand() % 7;
int n = rand() % 7;
for (int i = 0; i<4; i++)
{
a[i].x = figures[n][i] % 2;
a[i].y = figures[n][i] / 2;
}
}
timer = 0;
}
///////check lines//////////
int k = M - 1;
for (int i = M - 1; i>0; i--)
{
int count = 0;
for (int j = 0; j<N; j++)
{
if (field[i][j]) count++;
field[k][j] = field[i][j];
}
if (count<N) k--;
}
dx = 0; rotate = 0; delay = 0.3;
/////////draw//////////
window.clear(Color::White);
window.draw(background);
for (int i = 0; i<M; i++)
for (int j = 0; j<N; j++)
{
if (field[i][j] == 0) continue;
s.setTextureRect(IntRect(field[i][j] * 18, 0, 18, 18));
s.setPosition(j * 18, i * 18);
s.move(28, 31); //offset
window.draw(s);
}
for (int i = 0; i<4; i++)
{
s.setTextureRect(IntRect(colorNum * 18, 0, 18, 18));
s.setPosition(a[i].x * 18, a[i].y * 18);
s.move(28, 31); //offset
window.draw(s);
}
window.display();
}
return 0;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Я хочу отловить момент, когда приложение пытаются закрыть и убить процесс своей же программы через taskkillСделать я это хочу, потому что при...
Есть 2 действительных числа, x и y, которые вводятся с клавиатурыНужно проверить попадет ли точка в заданную область, область это рисунок
Почему для табов, которые активны (2 и 3), пкм срабатывает, а для 4, который неактивен - не срабатывает? Надо mouseevent'ы включить для него?