Member 12864130 Ответов: 5

Нужна помощь с проектом на языке Си


Я играю в карты на языке Си для университетского проекта. Я в основном должен создать игру, которая имеет 2 типа карт,"Card" и "CardDeck", написать функцию, чтобы перетасовать их и раздать 8 карт между 2 игроками.
Мне также нужно иметь возможность разрешить пользователю вводить количество колод, которые он хочет использовать, поэтому я не думаю, что смогу использовать массив фиксированного размера, возможно, как динамическое распределение памяти.
Любая помощь будет очень признательна.

Что я уже пробовал:

#include <stdio.h>

//Data Type Card

enum suit
{
	Club, Spade, Heart, Diamond
};

typedef enum suit Suit;

enum rank
{
	Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace 
};
typedef enum rank Rank;

struct card
{
Suit c_suit;
Rank c_rank;
};

typedef struct card Card;
void shuffle(Card * deck);

void shuffle(Card * deck)
{
    int temp;
    int y, x, t=0;  
    for (x = 52; x > 0 ; x--)
    { 
        y = rand() % x;   
        temp = deck[x];
        deck[x] = deck[y];
        deck[y] = temp;
    }

}

5 Ответов

Рейтинг:
2

F-ES Sitecore

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

Нужна помощь с карточной игрой в с.[^]

Независимо от этого ответы будут одинаковыми.


Member 12864130

Может быть, они и есть в моем курсе,но это не поможет мне сделать это. И это проект, а не домашнее задание

Kornfeld Eliyahu Peter

Почему бы и нет - пошлите ему сообщение и учитесь вместе...
Используйте Google и свой мозг (и то, что вы узнали, если таковые имеются)...

Member 12864130

Я использовал google и пытаюсь здесь, потому что я думал, что люди, которым мы должны помочь с такими вещами здесь

Kornfeld Eliyahu Peter

Мы здесь немного чувствительны :-)
Если вам нужна помощь, сначала вы должны много работать...
1. проводите ли вы исследования для себя - использование Google (или Code Project search) - это не ракетостроение...
2. Написать код - код проекта - "для тех, кто код"
3. опубликуйте свой код ( только соответствующую часть, а не дамп кода) - и отформатируйте/прокомментируйте его соответствующим образом
4. подробно опишите возникшую у вас проблему - "не работает" и "что делать" не являются предпочтительными...

Member 12864130

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

Kornfeld Eliyahu Peter

Если вы думаете, что закончили с 1.), то переходите к 2.) и далее...Вполне законно разочароваться в результатах поиска в интернете-полном мусора...

Member 12864130

Я постараюсь, но это просто я спешу сделать это

Рейтинг:
2

Kornfeld Eliyahu Peter

Давайте вместе подумаем об этом...
Что однозначно идентифицирует карту: масть, ранг и колода...
Таким образом, у вас нет необходимости в массивах для хранения всех карт всех колод, но только для тех, которые вы выбрали во время тасовки...
Что-то вроде этого:

struct card
{
  int suit;
  int rank;
  int deck;
};

void shuffle(int numOfDecksFromUser)
{
  card Cards[8];

  while(1) {
    int deck = rand() % numOfDecksFromUser;
    int suit = rand() % 4; // there a 4 suits
    int rank = rand() % 13; // there are 13 ranks

    // check if card in the array already - if not push it...

    // if we have all 8 different cards quit loop...
  }
}


Member 12864130

Да, я понимаю, к чему вы клоните, но мне действительно нужна остальная колода для дальнейшей игры

Kornfeld Eliyahu Peter

Откуда мне было знать? Ты мне не сказал :-)

Member 12864130

Я знаю извини за это

Kornfeld Eliyahu Peter

Не стоит-мы все учимся каждый день...
Смотрите мое другое решение...

Member 12864130

почему вы использовали void shuffle здесь? Когда я пытаюсь скомпилировать его, он выдает мне ошибку :переменная или поле "shuffle" объявлены пустыми

'void shuffle(int numOfDecksFromUser)'

Рейтинг:
1

Kornfeld Eliyahu Peter

Вы проходите тот же курс, что и член 12849609?
Работайте вместе!
Нужна помощь с карточной игрой в с.[^]


Member 12864130

возможно но на моем курсе много людей так что найти их будет нелегко

Рейтинг:
0

Jochen Arndt

Есть две проблемы:


  1. Индексы массивов начинаются с нуля в C/C++, но вы зацикливаетесь от 52 до 1
  2. С помощью rand() % x может не дать ожидаемых результатов


Предполагая, что пройденный deck массив имеет размер 52, вы должны выполнить цикл в диапазоне от 0 до 51.

Используя % оператор по модулю с rand() возвращает случайное значение в диапазоне от 0 до x - 1. Потому что x если ваша петля переменная, то доступный диапазон будет уменьшаться до тех пор, пока результат не станет 1, Когда x == 1.

Правильная реализация может быть:
void shuffle(Card * deck)
{
    int temp;
    int y, x;
    for (x = 0; x < 52 ; x++)
    {
        y = rand() % 52;
        temp = deck[x];
        deck[x] = deck[y];
        deck[y] = temp;
    }
}


Member 12864130

Спасибо, я попробую

Рейтинг:
0

Kornfeld Eliyahu Peter

Согласно вашему комментарию об остальных картах во время игры...

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

struct card
{
  int suit;
  int rank;
  int deck;
  int in_hand;
};

int numOfCardsFromUser = 3;
card* Cards = new card[numOfCardsFromUser * 52];

for(int d = 0; d < numOfCardsFromUser; d++)
{
    for(int s = 0; s < 4; s++)
    {
        for(int r = 0; r < 13; r++)
        {
            Cards[d * 52 + s * 13 + r].deck = d;
            Cards[d * 52 + s * 13 + r].suit = s;
            Cards[d * 52 + s * 13 + r].rank = r;
            Cards[d * 52 + s * 13 + r].in_hand = 0;
        }
    }
}

// run a loop to pick 8 different numbers between zero and numOfCardsFromUser * 52 and sign then as 'in_hand'