Как сделать подсчет очков в игре?

417
23 февраля 2018, 18:27

Как сделать подсчет очков по удаляемым линиям? Допустим убралась линия - плюс 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;
}
READ ALSO
Чем чревато закрытие программы через taskkill?

Чем чревато закрытие программы через taskkill?

Я хочу отловить момент, когда приложение пытаются закрыть и убить процесс своей же программы через taskkillСделать я это хочу, потому что при...

262
Проверить попадает ли точка в заданную область

Проверить попадает ли точка в заданную область

Есть 2 действительных числа, x и y, которые вводятся с клавиатурыНужно проверить попадет ли точка в заданную область, область это рисунок

199
Правый клик на неактивную вкладку

Правый клик на неактивную вкладку

Почему для табов, которые активны (2 и 3), пкм срабатывает, а для 4, который неактивен - не срабатывает? Надо mouseevent'ы включить для него?

236