Проблема в том, что
cards[i].suit = i / 13;
будет выдавать значение от 0 до 3, а не от 1 до 4, как предполагает ваш код.
И такая же проблема существует с
cards[i].value = i % 13;
, который дает значение от 0 до 12, а не от 1 до 13.
ОК, последняя проблема
if (cards[i].value == 0) {
cards[i].value = 1;
}
if (cards[i].value == 1) {
cards[i].value = 2;
}
if ... etc etc
должна быть
if (cards[i].value == 0) {
cards[i].value = 1;
}
else if (cards[i].value == 1) {
cards[i].value = 2;
}
else if ... etc etc
В вашей версии первый оператор if (если true) установит значение 1, но затем следующий оператор if будет true и установит значение 2 и так далее. Использование else if
обеспечивает выполнение только одного оператора if.