2015-12-31 5 views
2

Я начал кодировать несколько недель назад и сейчас тестировал чек-игру. Я создал класс под названием «фигура», а затем массив (рисунок [значение]). Я создал 2D-массив в main.cpp и заполнил его цифрами для каждого рисунка []. EG:Шашки перемещаются (в SFML)

(main.cpp) 
figure Figure[33]; //Figure-array 

for (int i = 0; i < 33; i++) 
{ 
    Figure[i].id = i; 
} 

int field[7][7] = { // (I messed the ID's up a little, just ignore it 
        {0, 0, 1, 2, 3, 0, 0}, 
        {0, 0, 4, 5, 6, 0, 0}, 
        {7, 8, 9, 10, 11, 12, 13} 
        {14, 15, 16, 17, 18, 19, 20}, 
        {21, 22, 23, 24, 25, 26, 27}, 
        {0, 0, 28, 29, 30, 0, 0}, 
        {0, 0, 31, 32, 33, 0, 0} 
        }; 

for (int y = 0; y < 7; y++) //Field gets filled with figure-values { 
    for (int x = 0; x < 7; x++) 
    { 
     if (field[y][x] != 0) 
     { 
      Figure[field[y][x] - 1].setPosition(Vector2i(x + 1, y + 1)); 
     } 
    } 
} 

Теперь я хочу сделать функцию обновления, чтобы заставить их прыгать друг на друга, и т.д. Моя проблема в том, что я не знаю, как сделать это правильно, я не знаю, как написать эту функцию полностью .Здесь это то, что я уже:

(Updatefunction) 
void figure::update(int (&field)[7][7], RenderWindow &window) { 

Vector2i mouseCoords; 
mouseCoords.x = int(Mouse::getPosition(window).x/114); 
mouseCoords.y = int(Mouse::getPosition(window).y/85); 

if ((field[mouseCoords.y][mouseCoords.x] != 0) && (Mouse::isButtonPressed(Mouse::Left))) 
{ 
    if ((field[mouseCoords.y][mouseCoords.x] != 0) && !(Mouse::isButtonPressed(Mouse::Left))) 
    { 
      selected = true; //selected defined in figure.h 
    } 

} 

Vector2i newMouseCoords; 
newMouseCoords.x = int(Mouse::getPosition(window).x/114); 
newMouseCoords.y = int(Mouse::getPosition(window).y/85); 

if (selected = true) 
{ 
    if ((newMouseCoords.x == mouseCoords.x + 2) && (field[newMouseCoords.y][newMouseCoords.x + 2] != 0)) 
    { 

    } 
} 

}

Я не знаю, как продолжить здесь, советы очень ценятся!

+0

У вас также есть семантические ошибки в коде C++. 'selected = true', поскольку последний оператор' if' будет присваивать 'true'' selected' и всегда будет оценивать значение 'true' (поскольку оператор присваивания возвращает значение, которое было назначено). Измените эту строку на 'if (selected == true)' или более идиоматически, измените ее на 'if (selected)', тогда у вас не будет этой проблемы. –

ответ

2

Вы не указали весь свой код, поэтому я не могу дать вам точное решение (и ваш полный список, вероятно, будет слишком длинным и сделает вопрос нечитаемым, если вы его включили, поэтому я бы не рекомендовал что).

Вот как я бы решить, учитывая то, что существующий код выглядит следующим образом:

  1. ли что-то в этой функции для обработки соответствующих поворотов. Не позволяйте игроку перемещать кусок, который не принадлежит им.
  2. В вашей первой проверке клика не просто устанавливайте логическое значение, отличное от единицы, к true. Вместо этого сохраните «выбранную деталь» в другой переменной.
  3. Перед проверкой второго щелчка проверьте, установлена ​​ли переменная «выбранная деталь» (возможно, проверьте, не является ли она null - зависит от того, как вы определяете эту переменную).
  4. Внутри тела вашего второго щелчка проверьте, действительно ли позиция цели для выбранной части является действительным ходом. Если это не так, то отобразите ошибку пользователю.
  5. Если вторая проверка нажмите представляет собой допустимый ход, а затем обновить платы:
    1. переместить часть, захватить любые части он перепрыгнул, король, если это необходимо
    2. Если есть еще один двойной прыжок шаг, который является возможно (возможны два двойных прыжка, которые они могут выбрать), а затем позволить игроку выбрать другой ход. Это означает, что больше блоков «if» ...
    3. Если есть двойной прыжок, позвольте человеку вернуться из хода, так как они еще не завершили его. Откажитесь от первого прыжка.
    4. В зависимости от того, насколько вы строго соблюдаете правила, не позволяйте человеку выбирать не делать двойной прыжок. Некоторые правила шашек делают захват обязательным, если это возможно.
    5. После того, как все ходы завершены, затем переключите переменную, которая отслеживает ход своей очереди, и отключите переменную «выбранная деталь».
  6. Обращайтесь с игрой, проверяя состояние игры. Это, вероятно, должно быть сделано после переезда.
Смежные вопросы