"Canasta Opening" - карточная игра на Point JS
Участников: 5
Страница 4 из 6
Страница 4 из 6 • 1, 2, 3, 4, 5, 6
Re: "Canasta Opening" - карточная игра на Point JS
вроде нашел ошибку. короче нужно для удаления элемента использовать не 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;
});
});
}
Re: "Canasta Opening" - карточная игра на Point JS
адовая проверка на комбинации по мастям
только как проверить чтобы подряд карты шли - честно говоря хз. тем более с джокерами, тем более, что комбинация может быть по кругу через туза.
скачал какую-то версию под виндоуз98, там вообще не так, как ты объяснял. там комбинации можно дополнять и как-то они вообще не так строятся. хз короче. нормальной играбельной версии в интернете не нашел, чтобы посмотреть вживую - как это все должно происходить.
https://pyro338.ru/CanastaPJS/
- Код:
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/
Re: "Canasta Opening" - карточная игра на Point JS
Пока что заметил баг. Если после кнопки "снос" нажать "комбинация" - все исчезает.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: "Canasta Opening" - карточная игра на Point JS
эмм... хз. только что тыкнул - ничего не исчезло. в консоле матюкается?
Re: "Canasta Opening" - карточная игра на Point JS
а. ну если карты не выбраны, то да - ошибку выкидывает. надо проверку добавить
Re: "Canasta Opening" - карточная игра на Point JS
Почти сделанная игра, прикольно=)
Кстати, бот не умеет раскладываться по масти? Только по значению.
Да, ругается. Вначале нажимаешь снос карты, сносишь карту. Потом сразу же нажимаешь "комбинацию" выдает ошибку:
А еще, наверное после выложенных карт в начале следующего хода должно раздаваться идентичное кол-во карт. Сколько выложил на стол- столько же и раздается. Хотя хз, конеш.
Кстати, бот не умеет раскладываться по масти? Только по значению.
Да, ругается. Вначале нажимаешь снос карты, сносишь карту. Потом сразу же нажимаешь "комбинацию" выдает ошибку:
[PointJS] : ERROR "TypeError: Cannot read property 'card_score' of undefined"
in
line : 218
symbol : 40
А еще, наверное после выложенных карт в начале следующего хода должно раздаваться идентичное кол-во карт. Сколько выложил на стол- столько же и раздается. Хотя хз, конеш.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: "Canasta Opening" - карточная игра на Point JS
А еще кнопка "завалить" не работает=) Ход можно закончить только сносом. Я хз конеш, может так и задумано.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: "Canasta Opening" - карточная игра на Point JS
Кстати, бот не умеет раскладываться по масти? Только по значению.
пока только по значению
нашел уже где ошибка, даДа, ругается. Вначале нажимаешь снос карты, сносишь карту. Потом сразу же нажимаешь "комбинацию" выдает ошибку:
насколько я понял из правил, что писал Алексей - по одной картеСколько выложил на стол- столько же и раздается
ну так-то на ней никакого функционала и не висит - она пока для мебели)А еще кнопка "завалить" не работает
Re: "Canasta Opening" - карточная игра на Point JS
А еще если в комбе два джокера - алгоритм их не распознает, только один джокер. Ну это типа тогда фишка такая. Правила.
Приколи, я сейчас флешбек словил. Дежваю. Это уже где-то было.
Приколи, я сейчас флешбек словил. Дежваю. Это уже где-то было.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: "Canasta Opening" - карточная игра на Point JS
ну это тоже в правилах Алексей писал вродеА еще если в комбе два джокера - алгоритм их не распознает, только один джокер
вьетнамские флешбэки? гггПриколи, я сейчас флешбек словил. Дежваю. Это уже где-то было.
и чо там было?
Re: "Canasta Opening" - карточная игра на Point JS
Ты сделал для кого-то пол проекта. Я чутка поделился замечаниями. А в итоге автору не понравилось)
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: "Canasta Opening" - карточная игра на Point JS
Значит это было в параллельном мире.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: "Canasta Opening" - карточная игра на Point JS
Я тут.) Мне самому интересно, что да как. Кодинг особенно важен. Ещё раз по поводу ДЖОКЕРОВ. КРАСНЫЙ джокер может пойти только в комбинацию из красных карт (черви, буби). Чёрный - только в чёрную комбинацию. Есть исключение - Комбинация ЗНАЧЕНИЕ из 6-ти карт возможна только с 4-мя картами "натуральными" и 2-мя джокерами. Пример: четыре 10-тки и 2 джокера - комбинация ЗНАЧЕНИЕ из 6-ти карт, за сбор её даётся 10 очков.
Очень интересно узнать кодинг компьютерного соперника на будущее.)
Графику можно и полегче - тогда висов будет меньше. Какие карты у меня - они весят сущие килобайты по 10-15.)
Очень интересно узнать кодинг компьютерного соперника на будущее.)
Графику можно и полегче - тогда висов будет меньше. Какие карты у меня - они весят сущие килобайты по 10-15.)
AlexeyOK- Сообщения : 50
Дата регистрации : 2018-01-08
Re: "Canasta Opening" - карточная игра на Point JS
О-ляля. Что за скрин? Жесть.
AlexeyOK- Сообщения : 50
Дата регистрации : 2018-01-08
Re: "Canasta Opening" - карточная игра на Point JS
СНОС ДЖОКЕРА. Если джокера сносит игрок в "колоду для сноса" (редко,но могут возникнуть и такие ситуации), то следующий игрок не может "завалить" "колоду для сноса". Он должен покрыть джокера любой другой своей картой, даже джокером, если таковой у него имеется.
ЗАВАЛ КОЛОДЫ для сноса: если верхняя карта в колоде (кроме джокера) может пойти в комбинацию игроку, чья очерёдность хода, то тот игрок может по своему усмотрению взять верхнюю карту из "колоды для сноса" к себе в объявляемую комбинацию. Если под верхней картой в "колоде для сноса" лежат ещё какие-нибудь карты, то они автоматически идут в "руку" к тому игроку, который "завалил" колоду.
НИЧЬЯ и ОБЪЯВЛЕНИЕ ВЫИГРЫША: Ничья засчитывается при условии нахождения в "руках" игроков минимум 1 карты и наличия 0 карт в "закрытой" колоде. При ничьей оставшиеся карты на руках игроков засчитываются в минус. 1 каждая оставшаяся карта = 1 очко в минус. Чтобы объявить выигрыш игрок должен со своей руки сбросить все карты путём выкладки комбинаций. Минимум может быть выложена 1 масть и 1 комбинация по значению.
ЗАВАЛ КОЛОДЫ для сноса: если верхняя карта в колоде (кроме джокера) может пойти в комбинацию игроку, чья очерёдность хода, то тот игрок может по своему усмотрению взять верхнюю карту из "колоды для сноса" к себе в объявляемую комбинацию. Если под верхней картой в "колоде для сноса" лежат ещё какие-нибудь карты, то они автоматически идут в "руку" к тому игроку, который "завалил" колоду.
НИЧЬЯ и ОБЪЯВЛЕНИЕ ВЫИГРЫША: Ничья засчитывается при условии нахождения в "руках" игроков минимум 1 карты и наличия 0 карт в "закрытой" колоде. При ничьей оставшиеся карты на руках игроков засчитываются в минус. 1 каждая оставшаяся карта = 1 очко в минус. Чтобы объявить выигрыш игрок должен со своей руки сбросить все карты путём выкладки комбинаций. Минимум может быть выложена 1 масть и 1 комбинация по значению.
AlexeyOK- Сообщения : 50
Дата регистрации : 2018-01-08
Re: "Canasta Opening" - карточная игра на Point JS
ПРИМЕРЫ ПРАВИЛЬНЫХ КОМБИНАЦИЙ:
1. 10 буби, 10 червей, 10 треф - ЗНАЧЕНИЕ из 3х карт
2. Дама пик, Король пик, Туз пик, чёрный джокер, 3-ка пик - МАСТЬ из 5-ти карт
3. 4 шестёрки всех мастей - ЗНАЧЕНИЕ из 4-рёх карт
4. 4 шестёрки всех мастей и 2 джокера - ЗНАЧЕНИЕ из 6-карт.
5.
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
Разок затестил новую версию - глюков ещё полно. Изначально у игроков по 9 карт. Первым делает ход игрок по жребию - затем по очерёдности ходов. Допустим игрок взял карту из закрытой колоды - у него стало 10 карт. Допустим никакую комбинацию из выпавших карт создать нельзя - надо делать снос карты в "колоду для сноса". Карту игрок снёс - у него вновь стало 9 карт. Далее делает ход компьютер. Теперь у компьютера 10 карт. Например он выкладывает масть из 4-рёх карт. После выкладки комбинации - у него должно остаться 6 карт, а после сноса карты в "колоду для сноса" - всего 5 карт. Дальше ход совершает игрок исходя из хода компьютера. В колоде для сноса уже лежит 2 карты. Допустим игрок "заваливает" колоду ходом взятия верхней карты из "колоды для сноса" в свою комбинацию... КОМБИНАЦИЮ ОБЪЯВИЛ И КОЛОДУ ЗАВАЛИЛ. Все карты находящиеся под верхней картой в "колоде для сноса" добавляются в "руку" завалившему колоду игроку. Игрок уже в праве добавить в свои комбинации карты из заваленной колоды либо составить новые комбинации не из выложенных карт на столе. Выложенные комбинации карт можно дополнять при своём ходе.
AlexeyOK- Сообщения : 50
Дата регистрации : 2018-01-08
Re: "Canasta Opening" - карточная игра на Point JS
ну я собственно так и сделалКРАСНЫЙ джокер может пойти только в комбинацию из красных карт (черви, буби). Чёрный - только в чёрную комбинацию.
а ну ок. недопонял. я сделал, что максиально из 5и карт - например 4 десятки и 1 джокерКомбинация ЗНАЧЕНИЕ из 6-ти карт возможна только с 4-мя картами "натуральными" и 2-мя джокерами.
сейчас комментарии напишу и код выложу
Re: "Canasta Opening" - карточная игра на Point JS
- Код:
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();
Re: "Canasta Opening" - карточная игра на Point JS
ты конечно извини, но bmp категорически не предназначен для вебаКакие карты у меня - они весят сущие килобайты
скрин как ИИ меня вздул)))О-ляля. Что за скрин? Жесть.
ну я сделал, что джокером закрыть тоже нельзя - хзЕсли джокера сносит игрок в "колоду для сноса" (редко,но могут возникнуть и такие ситуации), то следующий игрок не может "завалить" "колоду для сноса". Он должен покрыть джокера любой другой своей картой, даже джокером, если таковой у него имеется.
Re: "Canasta Opening" - карточная игра на Point JS
Хе. ИИ тебя не вздул , посмотри внимательно на свои комбинации. Видишь глюки где? Кстати раз карты можно при своём ходе добавлять в комбинации, наверное это условие тоже стоит прописать. Напомню АЛГОРИТМ ИГРЫ:
1. ИГРОК берёт карту из закрытой колоды
2. Идёт составление комбинаций если таковые возможны. Если невозможно, то шаг 3-й.
3. Игрок сносит карту в "колоду для сноса". После сноса - ход передаётся компьютеру.
4. Компьютер может взять карту из колоды для сноса, если таковой ход возможен и если он может карту из колоды для сноса сразу объявить в свою комбинацию. Но он может и не брать карту из колоды для сноса, тогда он берёт карту из закрытой колоды и пробует собрать уже с ней комбницию. Если комбинации собрать не удаётся, то следующий шаг.
5. Компьютер сносит любую свою карту в колоду для сноса и ход передаётся игроку.
6. А теперь уже игрок думает стоит ли ему брать карту из "колоды для сноса" или стоит брать карту из "закрытой колоды"...Пока сплошные глюки.
1. ИГРОК берёт карту из закрытой колоды
2. Идёт составление комбинаций если таковые возможны. Если невозможно, то шаг 3-й.
3. Игрок сносит карту в "колоду для сноса". После сноса - ход передаётся компьютеру.
4. Компьютер может взять карту из колоды для сноса, если таковой ход возможен и если он может карту из колоды для сноса сразу объявить в свою комбинацию. Но он может и не брать карту из колоды для сноса, тогда он берёт карту из закрытой колоды и пробует собрать уже с ней комбницию. Если комбинации собрать не удаётся, то следующий шаг.
5. Компьютер сносит любую свою карту в колоду для сноса и ход передаётся игроку.
6. А теперь уже игрок думает стоит ли ему брать карту из "колоды для сноса" или стоит брать карту из "закрытой колоды"...Пока сплошные глюки.
AlexeyOK- Сообщения : 50
Дата регистрации : 2018-01-08
Страница 4 из 6 • 1, 2, 3, 4, 5, 6
Страница 4 из 6
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|