1 Востаннє редагувалося Valsoray (04.03.2017 10:45:24)

Тема: Шашки С++

Вітаю. Мета моєї курсової робити - шашки.

Трохи помучившись, мені вдалося написати код, який виводить на екран доску і самі шашки. Шашки теж рухаються по досці (поки по всіх клітинках).

Не можу зрозуміти як написати алгоритм зрубання (биття) шашок.

Може хтось підкаже як, або дайте якусь літературу де це можна знайти.

ось код:

#include <iostream>
#include <time.h>
#include <SFML/Graphics.hpp>

using namespace sf;
using namespace std;

int boardSize = 63;

Sprite playerSprites[24];

int board[8][8] =
{-1, 0,-1, 0,-1, 0,-1, 0,
 0,-1, 0,-1, 0,-1, 0,-1,
-1, 0,-1, 0,-1, 0,-1, 0,
 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0,
 0, 1, 0, 1, 0, 1, 0, 1,
 1, 0, 1, 0, 1, 0, 1, 0,
 0, 1, 0, 1, 0, 1, 0, 1 };

void loadPosition()
{
    int k = 0;
    for(int i = 0 ; i < 8 ; i++)
        for (int j = 0; j < 8; j++)
        {
            int n = board[i][j];
            if (!n) continue;
            if (n < 0) playerSprites[k].setTextureRect(IntRect(0,0,62,62));
            else playerSprites[k].setTextureRect(IntRect(62, 0, 62, 62));
            playerSprites[k].setPosition(boardSize*j, boardSize*i);
            k++;
        }
}

int main()
{
    RenderWindow window(VideoMode(500, 500), "Chererboard");

    Texture players, boardTex;

    boardTex.loadFromFile("images/board.jpg");
    players.loadFromFile("images/players.png");

    Sprite checkerBoard(boardTex);

    for (int i = 0; i < 24; i++) playerSprites[i].setTexture(players);

    loadPosition();

    bool isMoving = false;
    float dx = 0, dy = 0;
    int playerIndex = 0;

    while (window.isOpen())
    {
        Vector2i mousePosition = Mouse::getPosition(window);

        Event _event;
        while (window.pollEvent(_event))
        {
            if (_event.type == Event::Closed)
                window.close();

            if(_event.type == Event::MouseButtonPressed)
                if(_event.key.code == Mouse::Left)
                    for(int i = 0; i < 24; i++)
                    if (playerSprites[i].getGlobalBounds().contains(mousePosition.x, mousePosition.y))
                    {
                        isMoving = true;
                        playerIndex = i;
                        dx = mousePosition.x - playerSprites[i].getPosition().x;
                        dy = mousePosition.y - playerSprites[i].getPosition().y;
                    }

            if (_event.type == Event::MouseButtonReleased)
                if (_event.key.code == Mouse::Left)
                {
                    isMoving = false;
                    // Position locking
                    Vector2f position = playerSprites[playerIndex].getPosition() + Vector2f(boardSize / 2, boardSize / 2);
                    Vector2f newPosition = Vector2f(boardSize*int(position.x / boardSize), boardSize*int(position.y / boardSize));
                    playerSprites[playerIndex].setPosition(newPosition);
                }
        }

        if (isMoving) playerSprites[playerIndex].setPosition(mousePosition.x - dx, mousePosition.y - dy);

        // Draw window
        window.clear();
        window.draw(checkerBoard);
        for (int i = 0; i < 24; i++) window.draw(playerSprites[i]);
        window.display();
    }
    
    //system("PAUSE");
    return 0;
}

2 Востаннє редагувалося P.Y. (04.03.2017 11:45:09)

Re: Шашки С++

Не так давно з'ясував, що існує безліч варіантів гри в шашки, які відрізняються, зокрема, правилами биття. Не впевнений, які саме з них у нас найчастіше використовуються (ймовірно, російські шашки, але, по-моєму, деталі правил, за якими мені доводилося грати, від гри до гри змінювались).

Якщо взяти найпростіший випадок, шашка суперника, яку можна побити, має бути поруч із атакуючою шашкою, і за нею має бути порожня клітинка. З чого випливає, що шашка не може бути під боєм, якщо стоїть на крайній горизонталі чи вертикалі, в решті випадків слід перевірити, чи є біля неї порожнє поле з протилежного від атакуючої шашки боку. Після чого атакуюча шашка перестрибує через неї, бита шашка знімається, перевіряється наявність шашок під боєм поруч з атакуючою і, якщо вони є, атакуюча шашка б'є одну з них на вибір гравця (чи, якщо шашка під боєм одна, б'є її). З дамками складніше (зокрема, через існування різних варантів правил) — треба перевіряти не лише сусідні шашки, а всю діагональ, потім, я плутаюсь, куди слід ставити дамку після бою (на клітинку безпосередньо за битою шашкою, на будь-яку доступну клітинку за нею?..). Якщо шашка під час удару дійшла до краю поля, але ще може бити, вона далі б'є як шашка чи перетворюється на дамку і б'є як дамка (у другому випадку, чи має проведена дамка бити далі, якщо шашки, які вона може побити, стоять на віддалі від неї?)?..

Подякували: ostap34PHP1