"Canasta Opening" - карточная игра на Point JS

Начать новую тему   Ответить на тему

Страница 4 из 6 Предыдущий  1, 2, 3, 4, 5, 6  Следующий

Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Pyro338 в Пт Фев 09, 2018 11:46 am

вроде нашел ошибку. короче нужно для удаления элемента использовать не splice, а delete, потому что splice сдвигает индекс элемента и из-за этого его foreach уже потом не видит. ну я так подозреваю

Код:

function drawPlayerCombinations() { //отрисовка комбинаций карт
    player_cards.forEach(function (item, index) { //убираем ненужные карты из "руки"
      if (item.card_active === true) {
        delete player_cards[index];
      }
    });
    player_combinations.forEach(function (item, index) {
      player_combinations[index].forEach(function (item2, index2) {
        player_combinations[index][index2].x = left_offset + card_width * index + 20; //сложем в стопочку
        player_combinations[index][index2].y = height / 2 + 20 + 20 * index2;
      });
    });
  }
avatar
Pyro338
Админ

Сообщения : 584
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Pyro338 в Пт Фев 09, 2018 3:18 pm

адовая проверка на комбинации по мастям

Код:

  function checkSuitCombination(active_cards) { //проверка комбинаций "по масти"
    let combination_checked = true;
    let red_jocker = 0;
    let black_jocker = 0;
    if (active_cards.length < 4) { //если выбрано меньше четырех карт
      combination_checked = false;
      console.log('trigger1');
    }
    active_cards.forEach(function (item, index) { //считаем джокеров
      if (item.card_suite == 6) {
        red_jocker++;
      } else if (item.card_suite == 5) {
        black_jocker++;
      }
    });
    if (red_jocker == 1 && black_jocker == 1) { //если выбрано 2 джокера - ошибка
      combination_checked = false;
      console.log('trigger2');
    }
    if (red_jocker == 1 && black_jocker == 0) { //если выбран красный джокер и черная масть - ошибка
      active_cards.forEach(function (item) {
        if (!(item.card_suite == 3 || item.card_suite == 4 || item.card_suite == 6)) {
          combination_checked = false;
          console.log('trigger3');
        }
      });
    }
    if (black_jocker == 1 && red_jocker == 0) { //если выбран черный джокер и красная масть - ошибка
      active_cards.forEach(function (item) { //для всех выбранных карт
        if (!(item.card_suite == 1 || item.card_suite == 2 || item.card_suite == 5)) {
          combination_checked = false;
          console.log('trigger4');
        }
      });
    }
    active_cards.sort();
    let previous_suite = active_cards[0].card_suite;
    active_cards.forEach(function (item) {
      if (
        (item.card_suite != previous_suite && red_jocker === 0 && black_jocker === 0)
      ) { //если нет джокеров и масть не совпадает с предведущей мастью - ошибка
        combination_checked = false;
        console.log('trigger5');
      }
      previous_suite = item.card_suite;
    });
    active_cards.forEach(function (item) { //проверяем чтобы все были одной масти и с джокером своего цвета
      if ((red_jocker == 1 || black_jocker == 1) &&
        !(
          (red_jocker == 1 && ((item.card_suite == previous_suite) || (item.card_suite == 3 && previous_suite == 6) || (item.card_suite == 6 && previous_suite == 3))) ||
          (red_jocker == 1 && ((item.card_suite == previous_suite) || (item.card_suite == 4 && previous_suite == 6) || (item.card_suite == 6 && previous_suite == 4))) ||
          (black_jocker == 1 && ((item.card_suite == previous_suite) || (item.card_suite == 1 && previous_suite == 5) || (item.card_suite == 5 && previous_suite == 1))) ||
          (black_jocker == 1 && ((item.card_suite == previous_suite) || (item.card_suite == 2 && previous_suite == 5) || (item.card_suite == 5 && previous_suite == 2)))
        )
      ) {
        combination_checked = false;
        console.log('trigger6');
      }
      previous_suite = item.card_suite;
    });

    return combination_checked;
  }

только как проверить чтобы подряд карты шли - честно говоря хз. тем более с джокерами, тем более, что комбинация может быть по кругу через туза.

скачал какую-то версию под виндоуз98, там вообще не так, как ты объяснял. там комбинации можно дополнять и как-то они вообще не так строятся. хз короче. нормальной играбельной версии в интернете не нашел, чтобы посмотреть вживую - как это все должно происходить.

https://pyro338.ru/CanastaPJS/
avatar
Pyro338
Админ

Сообщения : 584
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Pyro338 в Пт Фев 09, 2018 4:37 pm

ну и научил компа ходить)) можете поиграться))))
avatar
Pyro338
Админ

Сообщения : 584
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор raingo в Пт Фев 09, 2018 5:44 pm

Пока что заметил баг. Если после кнопки "снос" нажать "комбинация" - все исчезает.

raingo
Отдел прокрастинации

Сообщения : 727
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Pyro338 в Пт Фев 09, 2018 5:51 pm

эмм... хз. только что тыкнул - ничего не исчезло. в консоле матюкается?
avatar
Pyro338
Админ

Сообщения : 584
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Pyro338 в Пт Фев 09, 2018 5:52 pm

а. ну если карты не выбраны, то да - ошибку выкидывает. надо проверку добавить
avatar
Pyro338
Админ

Сообщения : 584
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор raingo в Пт Фев 09, 2018 5:57 pm

Почти сделанная игра, прикольно=)

Кстати, бот не умеет раскладываться по масти? Только по значению.

Да, ругается. Вначале нажимаешь снос карты, сносишь карту. Потом сразу же нажимаешь "комбинацию" выдает ошибку:
[PointJS] : ERROR "TypeError: Cannot read property 'card_score' of undefined"
in
line : 218
symbol : 40

А еще, наверное после выложенных карт в начале следующего хода должно раздаваться идентичное кол-во карт. Сколько выложил на стол- столько же и раздается. Хотя хз, конеш.

raingo
Отдел прокрастинации

Сообщения : 727
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор raingo в Пт Фев 09, 2018 5:57 pm

А еще кнопка "завалить" не работает=) Ход можно закончить только сносом. Я хз конеш, может так и задумано.

raingo
Отдел прокрастинации

Сообщения : 727
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Pyro338 в Пт Фев 09, 2018 6:03 pm

Кстати, бот не умеет раскладываться по масти? Только по значению.

пока только по значению

Да, ругается. Вначале нажимаешь снос карты, сносишь карту. Потом сразу же нажимаешь "комбинацию" выдает ошибку:
нашел уже где ошибка, да

Сколько выложил на стол- столько же и раздается
насколько я понял из правил, что писал Алексей - по одной карте

А еще кнопка "завалить" не работает
ну так-то на ней никакого функционала и не висит - она пока для мебели)
avatar
Pyro338
Админ

Сообщения : 584
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор raingo в Пт Фев 09, 2018 6:03 pm

А еще если в комбе два джокера - алгоритм их не распознает, только один джокер. Ну это типа тогда фишка такая. Правила.

Приколи, я сейчас флешбек словил. Дежваю. Это уже где-то было.

raingo
Отдел прокрастинации

Сообщения : 727
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Pyro338 в Пт Фев 09, 2018 6:06 pm

А еще если в комбе два джокера - алгоритм их не распознает, только один джокер
ну это тоже в правилах Алексей писал вроде

Приколи, я сейчас флешбек словил. Дежваю. Это уже где-то было.
вьетнамские флешбэки? ггг

и чо там было?
avatar
Pyro338
Админ

Сообщения : 584
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор raingo в Пт Фев 09, 2018 6:07 pm

Ты сделал для кого-то пол проекта. Я чутка поделился замечаниями. А в итоге автору не понравилось)

raingo
Отдел прокрастинации

Сообщения : 727
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Pyro338 в Пт Фев 09, 2018 6:12 pm

чот я не помню - для кого это я пол проекта делал
avatar
Pyro338
Админ

Сообщения : 584
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор raingo в Пт Фев 09, 2018 6:18 pm

Значит это было в параллельном мире.

raingo
Отдел прокрастинации

Сообщения : 727
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Pyro338 в Пт Фев 09, 2018 6:19 pm

ну не исключено
avatar
Pyro338
Админ

Сообщения : 584
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Pyro338 в Пт Фев 09, 2018 7:56 pm

бугога чот он меня выносит как сынка ггг


avatar
Pyro338
Админ

Сообщения : 584
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор AlexeyOK в Пт Фев 09, 2018 7:59 pm

Я тут.) Мне самому интересно, что да как. Кодинг особенно важен. Ещё раз по поводу ДЖОКЕРОВ. КРАСНЫЙ джокер может пойти только в комбинацию из красных карт (черви, буби). Чёрный - только в чёрную комбинацию. Есть исключение - Комбинация ЗНАЧЕНИЕ из 6-ти карт возможна только с 4-мя картами "натуральными" и 2-мя джокерами. Пример: четыре 10-тки и 2 джокера - комбинация ЗНАЧЕНИЕ из 6-ти карт, за сбор её даётся 10 очков.

Очень интересно узнать кодинг компьютерного соперника на будущее.)

Графику можно и полегче - тогда висов будет меньше. Какие карты у меня - они весят сущие килобайты по 10-15.)


AlexeyOK

Сообщения : 50
Дата регистрации : 2018-01-08

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор AlexeyOK в Пт Фев 09, 2018 8:02 pm

О-ляля. Что за скрин? Жесть.

AlexeyOK

Сообщения : 50
Дата регистрации : 2018-01-08

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор AlexeyOK в Пт Фев 09, 2018 8:04 pm

СНОС ДЖОКЕРА. Если джокера сносит игрок в "колоду для сноса" (редко,но могут возникнуть и такие ситуации), то следующий игрок не может "завалить" "колоду для сноса". Он должен покрыть джокера любой другой своей картой, даже джокером, если таковой у него имеется.
ЗАВАЛ КОЛОДЫ для сноса: если верхняя карта в колоде (кроме джокера) может пойти в комбинацию игроку, чья очерёдность хода, то тот игрок может по своему усмотрению взять верхнюю карту из "колоды для сноса" к себе в объявляемую комбинацию. Если под верхней картой в "колоде для сноса" лежат ещё какие-нибудь карты, то они автоматически идут в "руку" к тому игроку, который "завалил" колоду.
НИЧЬЯ и ОБЪЯВЛЕНИЕ ВЫИГРЫША: Ничья засчитывается при условии нахождения в "руках" игроков минимум 1 карты и наличия 0 карт в "закрытой" колоде. При ничьей оставшиеся карты на руках игроков засчитываются в минус. 1 каждая оставшаяся карта = 1 очко в минус. Чтобы объявить выигрыш игрок должен со своей руки сбросить все карты путём выкладки комбинаций. Минимум может быть выложена 1 масть и 1 комбинация по значению.

AlexeyOK

Сообщения : 50
Дата регистрации : 2018-01-08

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор AlexeyOK в Пт Фев 09, 2018 8:07 pm

ПРИМЕРЫ ПРАВИЛЬНЫХ КОМБИНАЦИЙ:

1. 10 буби, 10 червей, 10 треф - ЗНАЧЕНИЕ из 3х карт
2. Дама пик, Король пик, Туз пик, чёрный джокер, 3-ка пик - МАСТЬ из 5-ти карт
3. 4 шестёрки всех мастей - ЗНАЧЕНИЕ из 4-рёх карт
4. 4 шестёрки всех мастей и 2 джокера - ЗНАЧЕНИЕ из 6-карт.
5.

AlexeyOK

Сообщения : 50
Дата регистрации : 2018-01-08

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор AlexeyOK в Пт Фев 09, 2018 8:24 pm

Разок затестил новую версию - глюков ещё полно. Изначально у игроков по 9 карт. Первым делает ход игрок по жребию - затем по очерёдности ходов. Допустим игрок взял карту из закрытой колоды - у него стало 10 карт. Допустим никакую комбинацию из выпавших карт создать нельзя - надо делать снос карты в "колоду для сноса". Карту игрок снёс - у него вновь стало 9 карт. Далее делает ход компьютер. Теперь у компьютера 10 карт. Например он выкладывает масть из 4-рёх карт. После выкладки комбинации - у него должно остаться 6 карт, а после сноса карты в "колоду для сноса" - всего 5 карт. Дальше ход совершает игрок исходя из хода компьютера. В колоде для сноса уже лежит 2 карты. Допустим игрок "заваливает" колоду ходом взятия верхней карты из "колоды для сноса" в свою комбинацию... КОМБИНАЦИЮ ОБЪЯВИЛ И КОЛОДУ ЗАВАЛИЛ. Все карты находящиеся под верхней картой в "колоде для сноса" добавляются в "руку" завалившему колоду игроку. Игрок уже в праве добавить в свои комбинации карты из заваленной колоды либо составить новые комбинации не из выложенных карт на столе. Выложенные комбинации карт можно дополнять при своём ходе.

AlexeyOK

Сообщения : 50
Дата регистрации : 2018-01-08

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Pyro338 в Пт Фев 09, 2018 8:24 pm

КРАСНЫЙ джокер может пойти только в комбинацию из красных карт (черви, буби). Чёрный - только в чёрную комбинацию.
ну я собственно так и сделал

Комбинация ЗНАЧЕНИЕ из 6-ти карт возможна только с 4-мя картами "натуральными" и 2-мя джокерами.
а ну ок. недопонял. я сделал, что максиально из 5и карт - например 4 десятки и 1 джокер

сейчас комментарии напишу и код выложу
avatar
Pyro338
Админ

Сообщения : 584
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Pyro338 в Пт Фев 09, 2018 8:25 pm

Код:


  let pjs = new PointJS(1280, 1024, {
    backgroundImage: "url(sukno.jpg)",
    backgroundSize : "cover",
  });
  let game = pjs.game;
  let system = pjs.system;
  let mouse = pjs.mouseControl.initMouseControl();
  let brush = pjs.brush;
  let width = pjs.game.getWH().w; //получаем ширину игровой области
  let height = pjs.game.getWH().h; //получаем высоту игровой области
  let point = pjs.vector.point;
  system.initFullScale();

  //переменные для самой игры

  let cards_array = ['c2c', 'c3c', 'c4c', 'c5c', 'c6c', 'c7c', 'c8c', 'c9c', 'c10c', 'cjc', 'cqc', 'ckc', 'cac', 'c2h', 'c3h', 'c4h', 'c5h', 'c6h', 'c7h', 'c8h', 'c9h', 'c10h', 'cjh', 'cqh', 'ckh', 'cah', 'c2s', 'c3s', 'c4s', 'c5s', 'c6s', 'c7s', 'c8s', 'c9s', 'c10s', 'cjs', 'cqs', 'cks', 'cas', 'c2d', 'c3d', 'c4d', 'c5d', 'c6d', 'c7d', 'c8d', 'c9d', 'c10d', 'cjd', 'cqd', 'ckd', 'cad', 'cjkb', 'cjkk'];
  let player_cards = []; //массив карт игрока
  let comp_cards = []; //массив карт компа
  let card_height = 150; //высота карты
  let card_width = 100; //ширина карты
  let left_offset = 20; //отступ слева для "рук"
  let player_top_offset = height - 20 - card_height; //отступ сверху для "руки" игрока
  let comp_top_offset = 20; //отступ сверху для "руки" компьютера
  let player_combinations_offset = height / 2 + 20; //отступ сверху для комбинаций игрока
  let comp_combinations_offset = card_height + 40; //отступ сверху для комбинаций компа
  let deck = []; //колода
  let pull_deck = []; //колода для сноса
  let game_step = 0; //переменная показывает на каком этапе игры мы находимся: 1 - игрок берет карту, 2 - игрок ходит, 3 - компьютер берет карту, 4 - компьютер ходит
  let pull_button_sprite = pjs.tiles.newImage('pull-button.png'); //кнопочки
  let round_button_sprite = pjs.tiles.newImage('round-button.png');
  let combination_button_sprite = pjs.tiles.newImage('combination-button.png');
  let drop_button_sprite = pjs.tiles.newImage('drop-button.png');
  let is_pulled = false; //снесена ли карта
  let is_dropped = false; //дропнута ли колода для сноса
  let player_combinations = []; //комбинации игрока
  let comp_combinations = []; //комбинации компа
  let active_cards = []; //активные карты

  let deck_close = game.newImageObject({ //колода
    file    : 'card_mask.png',
    x      : width - 20 - card_width,
    y      : height / 2 - card_height / 2,
    h      : card_height,
    w      : card_width,
    userData: {
      cards_count: 54
    }
  });

  let deck_pull_colsed = game.newImageObject({ //колода для сноса
    file    : 'deck_pool.png',
    x      : width - 20 - card_width * 2,
    y      : height / 2 - card_height / 2,
    h      : card_height,
    w      : card_width,
    userData: {
      cards_count: 0
    }
  });

  let push_combination_button = game.newImageObject({ //кнопочки
    file: combination_button_sprite.file,
    w  : card_width * 2,
    h  : 65,
    x  : width - card_width * 2 - 20,
    y  : height / 2 + card_height / 2 + 20
  });

  let pull_card_button = game.newImageObject({
    file: pull_button_sprite.file,
    w  : card_width * 2,
    h  : 65,
    x  : width - card_width * 2 - 20,
    y  : height / 2 + card_height / 2 + 120
  });

  let finish_round_button = game.newImageObject({
    file: round_button_sprite.file,
    w  : card_width * 2,
    h  : 65,
    x  : width - card_width * 2 - 20,
    y  : height / 2 - card_height / 2 - 200
  });

  let drop_button = game.newImageObject({
    file: drop_button_sprite.file,
    w  : card_width * 2,
    h  : 65,
    x  : width - card_width * 2 - 20,
    y  : height / 2 - card_height / 2 - 100
  });

  function parseCardValue(card) { //функция вычисления масти и достоинства карты
    let card_properties = {};
    if (card == 'cjkb') { //если джокер, даем ему максимальную масть и достоинство
      card_properties.suite = 5;
      card_properties.score = 15;
      return card_properties;
    }
    if (card == 'cjkk') { //если джокер, даем ему максимальную масть и достоинство
      card_properties.suite = 6; //здесь я изменил, чтобы у красного и черного джокера масть разная была для проверки комбинации
      card_properties.score = 15;
      return card_properties;
    }
    if (card.length == 3) {
      card_properties.suite = card.charAt(2);
      card_properties.score = card.charAt(1);
    } else {
      card_properties.suite = card.charAt(3);
      card_properties.score = card.charAt(1) + card.charAt(2);
    }
    switch (card_properties.suite) { //парсим масти
      case 's':
        card_properties.suite = 1;
        break;
      case 'c':
        card_properties.suite = 2;
        break;
      case 'd':
        card_properties.suite = 3;
        break;
      case 'h':
        card_properties.suite = 4;
        break;
    }
    switch (card_properties.score) { //парсим картинки
      case 'j':
        card_properties.score = 11;
        break;
      case 'q':
        card_properties.score = 12;
        break;
      case 'k':
        card_properties.score = 13;
        break;
      case 'a':
        card_properties.score = 14;
        break;
    }
    return card_properties;
  }

  function fieldSorter(fields) {//функция сортировки
    return function (a, b) {
      return fields
        .map(function (o) {
          var dir = 1;
          if (o[0] === '-') {
            dir = -1;
            o = o.substring(1);
          }
          if (a[o] > b[o]) return dir;
          if (a[o] < b[o]) return -(dir);
          return 0;
        })
        .reduce(function firstNonZeroValue(p, n) {
          return p ? p : n;
        }, 0);
    };
  }

  function addCardToPlayer(player_cards_array) { //функция взятия карты из колоды. параметром принимает массив карт игрока/компа
    if(deck_close.cards_count > 0){ //если в колоде есть карты
      let last_item = deck[deck.length - 1]; //берем последнюю карту
      player_cards_array.push(last_item); //суем в массив карт нужного игрока
      deck.splice(deck.length - 1, 1); //убираем из колоды
      deck_close.cards_count--; //уменьшаем счетчик карт в колоде
    }

  }

  function sortCards(player_cards_array, offset) { //функция сортировки руки
    let card_offset_x = 0; //тут надо придумать сдвиг, чтобы все карты в экран помещались
    player_cards_array = player_cards_array.filter(function(n){ return n != undefined });
    player_cards_array.sort(fieldSorter(['card_suite', 'card_score'])); //сортируем карты по масти и по достоинству
    if(player_cards_array.length > 15){
      //card_offset_x = 20;
    }
    player_cards_array.forEach(function (item, index) {
      item.y = offset; //ставим карту в нужную позицию
      item.x = left_offset + (card_width - card_offset_x) * index;
    });
  }

  function TasCards() {//функция тасования кард
    cards_array.forEach(function (item) {
      let card = game.newImageObject({ //создаем объект
        file    : item + '.png', //картинка
        h      : card_height, //высота карты
        w      : card_width, //ширина карты
        userData: {
          card_value : item, //номинал карты
          card_suite : parseCardValue(item).suite, //масть карты
          card_score : parseInt(parseCardValue(item).score), //достоинство карты
          card_active: false //активна ли карта
        }
      });
      deck.push(card); //пушим в колоду
    });
    pjs.math.randomFY(deck);
    for (var i = 0; i < 9; i++) {
      addCardToPlayer(player_cards); //даем карту игроку
      addCardToPlayer(comp_cards); //даем карту компу
    }
    sortCards(player_cards, player_top_offset); //сортируем руку игрока
    sortCards(comp_cards, comp_top_offset); //сортируем руку компа
  }

  function checkValueCombination(active_cards) { //проверка комбинаций "по значению"
    let count_of_jockers = 0; //количество джокеров
    let combination_checked = true; //установим флаг, что проверка пройдена
    let previousCard = active_cards[0].card_score; //предведущая карта = первая карта
    if (active_cards.length < 3) { //если выбрано меньше трех карт
      return false; //проверка не пройдена
    }
    active_cards.forEach(function (item) { //для всех выбранных карт
      if (item.card_score != 15) { //если не джокер
        if (item.card_score != previousCard) { //если значение текущей карты не равно значению предведущей
          combination_checked = false; //проверка провалена
        }
        previousCard = item.card_score; //предведущая карта = текущая карта
      } else {
        count_of_jockers++;
      }
    });
    if (count_of_jockers > 1) {
      combination_checked = false;
    }
    return (combination_checked); //возвращаем результат проверки
  }

  function checkSuitCombination(active_cards) { //проверка комбинаций "по масти"
    let combination_checked = true;
    let red_jocker = 0; //количество красных джокеров
    let black_jocker = 0; //количество черных джокеров
    if (active_cards.length < 4) { //если выбрано меньше четырех карт
      combination_checked = false; //ошибка
      console.log('trigger1');
    }
    active_cards.forEach(function (item) { //считаем джокеров
      if (item.card_suite == 6) {
        red_jocker++;
      } else if (item.card_suite == 5) {
        black_jocker++;
      }
    });
    if (red_jocker == 1 && black_jocker == 1) { //если выбрано 2 джокера - ошибка
      combination_checked = false;
      console.log('trigger2');
    }
    if (red_jocker == 1 && black_jocker == 0) { //если выбран красный джокер и черная масть - ошибка
      active_cards.forEach(function (item) {
        if (!(item.card_suite == 3 || item.card_suite == 4 || item.card_suite == 6)) {
          combination_checked = false;
          console.log('trigger3');
        }
      });
    }
    if (black_jocker == 1 && red_jocker == 0) { //если выбран черный джокер и красная масть - ошибка
      active_cards.forEach(function (item) { //для всех выбранных карт
        if (!(item.card_suite == 1 || item.card_suite == 2 || item.card_suite == 5)) {
          combination_checked = false;
          console.log('trigger4');
        }
      });
    }
    active_cards.sort();
    let previous_suite = active_cards[0].card_suite;
    active_cards.forEach(function (item) {
      if (item.card_suite != previous_suite && red_jocker === 0 && black_jocker === 0){ //если нет джокеров и масть не совпадает с предведущей мастью - ошибка
        combination_checked = false;
        console.log('trigger5');
      }
      previous_suite = item.card_suite;
    });
    active_cards.forEach(function (item) { //проверяем чтобы все были одной масти и с джокером своего цвета
      if ((red_jocker == 1 || black_jocker == 1) &&
        !(
          (red_jocker == 1 && ((item.card_suite == previous_suite) || (item.card_suite == 3 && previous_suite == 6) || (item.card_suite == 6 && previous_suite == 3))) ||
          (red_jocker == 1 && ((item.card_suite == previous_suite) || (item.card_suite == 4 && previous_suite == 6) || (item.card_suite == 6 && previous_suite == 4))) ||
          (black_jocker == 1 && ((item.card_suite == previous_suite) || (item.card_suite == 1 && previous_suite == 5) || (item.card_suite == 5 && previous_suite == 1))) ||
          (black_jocker == 1 && ((item.card_suite == previous_suite) || (item.card_suite == 2 && previous_suite == 5) || (item.card_suite == 5 && previous_suite == 2)))
        )
      ) {
        combination_checked = false;
        console.log('trigger6');
      }
      previous_suite = item.card_suite;
    });

    return combination_checked;
  }

  function drawPlayerCombinations(player_cards_array, player_combinations_array,  top_offset) { //отрисовка комбинаций карт
    player_cards_array.forEach(function (item, index) { //убираем ненужные карты из "руки"
      if (item.card_active === true) {
        delete player_cards_array[index];
      }
    });
    player_combinations_array.forEach(function (item, index) {
      player_combinations_array[index].forEach(function (item2, index2) {
        player_combinations_array[index][index2].x = left_offset + (card_width + 20) * index; //сложем в стопочку
        player_combinations_array[index][index2].y = top_offset + 20 * index2;
      });
    });
  }

  function compFindCombinations(){ //поиск комбинаций для компа
    let combinations = [];
    for(var i = 0; i <= 14 ; i++){ //прогоняем все достоинства карт
      combinations[i] = []; //массив с доступными комбинациями
      comp_cards.forEach(function(item){
        if(item.card_score == i || item.card_score == 15){ //если карты одного достоинства или джокеры
          combinations[i].push(item); //пушим комбинацию
        }
      });
    }
    let max_length = 0; //самая длинная комбинация
    let selected_combination = []; //индекс самой длинной комбинации
    combinations.forEach(function(item){ //для всех комбинаций
      if(item.length > max_length){ //если текущая комбинация длиннее предведущей
        max_length = item.length; //выбираем ее
        selected_combination = item;
      }
    });
    if(max_length < 3){ //если нет нормальной комбинации
      if(pull_deck.length > 0 && pull_deck[pull_deck.length - 1].card_score != 15){ //если можно завалить колоду
        dropPullDeck(comp_cards); //заваливаем колоду
        sortCards(comp_cards, comp_top_offset); //сортируем руку
        game_step = 1; //передаем ход
      }else{ //если колоду завалить нельзя
        compPullCard(); //сносим карту
      }
    }else{ //если есть комбинации
      selected_combination.forEach(function(item){
        item.card_active = true; //делаем карты активными
      });
      compPushCombination(selected_combination); //выкладываем комбинацию
      compPullCard(); //сносим карту
    }
  }

  function compPushCombination(selected_combination){ //функция выкладывания комбинаций компа
    comp_combinations.push(selected_combination); //пушим активные карты в массив с комбинациями
    drawPlayerCombinations(comp_cards, comp_combinations, comp_combinations_offset); //складываем в стопочки
    sortCards(comp_cards, comp_top_offset); //сортируем руку
  }

  function compPullCard(){ //функция сноса карты компом
    if(comp_cards.length > 0){ //если у компа есть карты
      let smallest_card_score = 15;
      let smallest_card_index;
      comp_cards.forEach(function(item, index){ //выбираем самую маленькую
        if(item.card_score < smallest_card_score){
          smallest_card_score = item.card_score;
          smallest_card_index = index;
        }
      });
      pull_deck.push(comp_cards[smallest_card_index]); //пушим ее в колоду для сноса
      deck_pull_colsed.file = pull_deck[pull_deck.length - 1].card_value + '.png'; //назначаем колоде для сноса ее картинку
      deck_pull_colsed.cards_count++;
      delete comp_cards[smallest_card_index]; //убираем
      sortCards(comp_cards, comp_top_offset); //сортируем руку
      is_pulled = true; //карта снесена
    }
  }

  function dropPullDeck(player_cards_array){ //функция заваливания колоды
    pull_deck.forEach(function(item){ //для всех карт в колоде для сноса
      if(item.card_value != ''){ //если карта не "пустая"
        player_cards_array.push(item); //отдаем ее игроку
      }
      item.card_active = false; //деактивируем
    });
    deck_pull_colsed.file = 'deck_pool.png'; //ставим для колоды для сноса картинку, что там ничего нет
    pull_deck.length = 0; //обнуляем счетчик кард
    deck_pull_colsed.cards_count = 0; //обнуляем калоду для сноса
  }

  game.newLoopFromConstructor("my game", function () { //создаем игровой цикл
    this.entry = function () { //при входе в игровой цикл
      game_step = 0;
    }
    this.update = function () { //в игровом цикле
      game.clear(); //очищаем экран
      switch (game_step) {
        case 0:
          TasCards(); //тасуем карты и раздаем их
          game_step = 1;
          break;
        case 1:
          addCardToPlayer(player_cards); //даем игроку карту
          sortCards(player_cards, player_top_offset); //сортируем руку
          is_pulled = false; //карта пока не снесена
          is_dropped = false; //колода пока не завалена
          active_cards.length = 0; //активных карт нет
          game_step = 2; //переходим к следующему этапу
          break;
        case 2:
          push_combination_button.draw(); //рисуем кнопку комбинаций
          if (is_pulled == false) { //если карта не снесена
            pull_card_button.draw(); //рисуем кнопку сноса
          } else { //иначе
            finish_round_button.draw(); //рисуем кнопку завершения хода
          }
          if(pull_deck.length > 0 && pull_deck[pull_deck.length - 1].card_score != 15 && is_pulled == false && is_dropped == false){ //если можно завалить колоду
            drop_button.draw(); //рисуем кнопку завала
          }
          if (mouse.isPeekObject('LEFT', drop_button)){ //при нажатии на кнопку завала
            dropPullDeck(player_cards); //заваливаем колоду
            sortCards(player_cards, player_top_offset); //сортируем руку
            is_dropped = true; //колода завалена
            game_step = 3;
          }
          player_cards.forEach(function (item) { //для всех карт игрока
            if (mouse.isPeekObject('LEFT', item)) { //если тыкнуть мышкой в карту
              if (item.card_active == false) { //если карта неактивна
                item.y -= 50; //выдвигаем ее вверх
                item.card_active = true; //и делаем активной
              } else { //иначе
                item.y += 50; //задвигаем назад
                item.card_active = false; //и делаем неактивной
              }
            }
          });
          if (mouse.isPeekObject('LEFT', push_combination_button)) {
            let active_cards = [];
            player_cards.forEach(function (item) { //для всех карт игрока
              if (item.card_active === true) { //если карта активна
                active_cards.push(item); //пихаем ее в массив
              }
            });
            if(active_cards.length > 0){
              if (checkValueCombination(active_cards) || checkSuitCombination(active_cards)) { //если проверка на комбинацию пройдена
                player_combinations.push(active_cards); //пушим активные карты в массив с комбинациями
                drawPlayerCombinations(player_cards, player_combinations, player_combinations_offset); //складываем в стопочки
                sortCards(player_cards, player_top_offset); //сортируем руку
              }
            }
          }
          if (mouse.isPeekObject('LEFT', pull_card_button)) { //если тыкнуть в кнопку сноса
            let selected_cards = 0; //количество выбранных карт 0
            let selected_card_index = ''; //номер выбранной карты
            player_cards.forEach(function (item, index) { //для всех карт
              if (item.card_active === true) { //если карта активна
                selected_cards++; //увеличиваем счетчик активных карт
                selected_card_index = index; //запоминаем номер выбранной карты
              }
            });
            if (selected_cards == 1) { //если выбрана одна карта
              pull_deck.push(player_cards[selected_card_index]); //пушим ее в колоду для сноса
              deck_pull_colsed.file = pull_deck[pull_deck.length - 1].card_value + '.png'; //назначаем колоде для сноса ее картинку
              deck_pull_colsed.cards_count++; //увеличиваем счетчик карт в колоде для сноса
              delete player_cards[selected_card_index]; //убираем
              sortCards(player_cards, player_top_offset); //сортируем руку
              is_pulled = true; //карта снесена
            } else {
              alert('Для сноса должна быть выбрана одна карта'); //если не выбрана ни одна карта или больше одной, матюкаемся
            }
          }
          if (mouse.isPeekObject('LEFT', finish_round_button)) { //если тыкаем "завершить ход"
            game_step = 3;//переходим к следующему шагу
          }
          break;
        case 3:
          addCardToPlayer(comp_cards); //даем игроку карту
          sortCards(comp_cards, comp_top_offset); //сортируем руку
          is_pulled = false; //карта пока не снесена
          is_dropped = false; //колода не завалена
          active_cards.length = 0; //активных карт нет
          game_step = 4; //переходим к следующему этапу
          break;
        case 4:
          compFindCombinations(); //ищем комбинации для компа
          game_step = 1;
          break;
      }
      if (deck_close.cards_count == 0) { //если в колоде не осталось карт
        deck_close.file = 'deck_pool.png'; //рисуем соответствующую картинку
      }
      deck_close.draw(); //рисуем колоду
      deck_pull_colsed.draw(); //рисуем колоду для сноса
      pjs.OOP.drawArr(player_cards); //рисуем массив объектов карт комьютера
      pjs.OOP.drawArr(comp_cards); //рисуем массив объектов карт игрока
      player_combinations.forEach(function (item) {
        pjs.OOP.drawArr(item); //рисуем стопочки с комбинациями
      });
      comp_combinations.forEach(function (item) {
        pjs.OOP.drawArr(item); //рисуем стопочки с комбинациями
      });
    }
  });

  game.setLoop("my game");
  game.start();
avatar
Pyro338
Админ

Сообщения : 584
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Pyro338 в Пт Фев 09, 2018 8:29 pm

Какие карты у меня - они весят сущие килобайты
ты конечно извини, но bmp категорически не предназначен для веба

О-ляля. Что за скрин? Жесть.
скрин как ИИ меня вздул)))

Если джокера сносит игрок в "колоду для сноса" (редко,но могут возникнуть и такие ситуации), то следующий игрок не может "завалить" "колоду для сноса". Он должен покрыть джокера любой другой своей картой, даже джокером, если таковой у него имеется.
ну я сделал, что джокером закрыть тоже нельзя - хз


avatar
Pyro338
Админ

Сообщения : 584
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор AlexeyOK в Пт Фев 09, 2018 8:50 pm

Хе. ИИ тебя не вздул Smile, посмотри внимательно на свои комбинации. Видишь глюки где? Кстати раз карты можно при своём ходе добавлять в комбинации, наверное это условие тоже стоит прописать. Напомню АЛГОРИТМ ИГРЫ:
1. ИГРОК берёт карту из закрытой колоды
2. Идёт составление комбинаций если таковые возможны. Если невозможно, то шаг 3-й.
3. Игрок сносит карту в "колоду для сноса". После сноса - ход передаётся компьютеру.
4. Компьютер может взять карту из колоды для сноса, если таковой ход возможен и если он может карту из колоды для сноса сразу объявить в свою комбинацию. Но он может и не брать карту из колоды для сноса, тогда он берёт карту из закрытой колоды и пробует собрать уже с ней комбницию. Если комбинации собрать не удаётся, то следующий шаг.
5. Компьютер сносит любую свою карту в колоду для сноса и ход передаётся игроку.
6. А теперь уже игрок думает стоит ли ему брать карту из "колоды для сноса" или стоит брать карту из "закрытой колоды"...Пока сплошные глюки.

AlexeyOK

Сообщения : 50
Дата регистрации : 2018-01-08

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: "Canasta Opening" - карточная игра на Point JS

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Страница 4 из 6 Предыдущий  1, 2, 3, 4, 5, 6  Следующий

Вернуться к началу


 
Права доступа к этому форуму:
Вы можете отвечать на сообщения