Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: ошибка при програмировании на языке с  (Прочитано 1453 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн 2R0k

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
народ, помогите. пишу игру для консоли по типу just for fan. и гдето в коде закралась ошибка.фрагмент кода:
        do {
                card=rand() % 52;
                }while(card==outCard[0]); // проверка наличия карты в колоде
        outCard[1]=card;                  // исключение карты из колоды
        AI[0]=card;                       // выдача карты боту
        do {
                card=rand() % 52;
                for((i=0)&&(flaq=1);i<2;i++){ //условие проверки наличия карты. условно карта присутствует
                        if (card==outCard[i]) //проверка наличия карты в колоде
                        flaq=0;               //результат проверки. 0 означает отсутвие карты
                        }
                }while(flaq==1);
        outCard[2]=card;                      //исключение карты из колоды
        playerCard[1]=card;                   //выдача карты игроку
из-за чего-то эти карты совпадают в 100% случаев. я не могу понять по чему. помогите если кто-то видит ошибку

Оффлайн kupamaan

  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Re: ошибка при програмировании на языке с
« Ответ #1 : 22 Ноября 2012, 07:48:43 »
скорее всего потому, что rand() %52 всегда одно и то же число.
попробуйте через clock().

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: ошибка при програмировании на языке с
« Ответ #2 : 22 Ноября 2012, 08:44:34 »
}while(card==outCard[0]); // проверка наличия карты в колоде

если outCard массив карт, то наверно надо проверять
в цикле for по всей колоде outCard

Оффлайн 2R0k

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: ошибка при програмировании на языке с
« Ответ #3 : 24 Ноября 2012, 23:05:06 »
сократил прогрмму до минимума.
код
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void){
        int check=1,outCard[8][1]={{0}},playerCard[1][1]={{0}},score[4]={0},AI[1][1]={{0}};
        srand(time(NULL));
        playerCard[0][0]=rand() %12+1;
        playerCard[1][0]=rand() %12+1;
        playerCard[0][1]=rand() %3+1;
        playerCard[1][1]=rand() %3+1;
        printf("player card 1 = %d %d \n",playerCard[0][0],playerCard[0][1]);
        printf("player card 2 = %d %d",playerCard[1][0],playerCard[1][1]);
        return(0);
        }
playerCard[1][0]=rand() %12+1;
 playerCard[0][1]=rand() %3+1;
 это совпадающие рандомы. совпадают в 100% случаев.

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: ошибка при програмировании на языке с
« Ответ #4 : 25 Ноября 2012, 00:12:35 »
Что мешает написать свой ГСЧ?
ГСЧ - генератор случайных чисел?

Оффлайн 2R0k

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: ошибка при програмировании на языке с
« Ответ #5 : 25 Ноября 2012, 08:29:41 »
не знание того как это делается. я пока только начинаю программировать.

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: ошибка при програмировании на языке с
« Ответ #6 : 30 Ноября 2012, 19:49:01 »
Вот пример проверенный для символов:

int Rnd = 111 // здесь задается начальное значение - может быть другим

char RandomChar(){ // Возвращает случайный символ
    int x = Rnd * 0x10450405 >> 15;
    Rnd = x + 1;
    return (char)Rnd;
}


Для чисел:
int Rnd = 111 // здесь задается начальное значение - может быть другим

int RandomInt(){ // Возвращает случайное целое число
    int x = Rnd * 0x10450405 >> 15;
    Rnd = x + 1;
    return Rnd;
}



Для целых чисел из диапазона от 0..31

int Choose() {
    r = RandomInt();
    return (r % 32)
}


Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: ошибка при програмировании на языке с
« Ответ #7 : 04 Декабря 2012, 23:02:03 »
Señor_Gaga, не надо учить человека плохому. Надо использовать библиотечные функции, а не изобретать лисапеды!

По сути: я попробовал сделать по-другому:
Код: (bash) [Выделить]
e@e16:~/news$ ./array
player card 1 = 4 3
player card 2 = 11 2
e@e16:~/news$ ./array
player card 1 = 7 3
player card 2 = 7 2
e@e16:~/news$ ./array
player card 1 = 11 1
player card 2 = 12 3
e@e16:~/news$ ./array
player card 1 = 10 1
player card 2 = 2 2
e@e16:~/news$ ./array
player card 1 = 5 2
player card 2 = 11 1
e@e16:~/news$

Как видим, никаких стопроцентных совпадений. А почему? Я слегка поменял ваш код:

Код: (C) [Выделить]
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void){
        int pc00, pc10, pc01, pc11;

        srand(time(NULL));

        pc00=rand() %12+1;
        pc10=rand() %12+1;
        pc01=rand() %3+1;
        pc11=rand() %3+1;

        printf("player card 1 = %d %d \n",pc00,pc01);
        printf("player card 2 = %d %d \n",pc10,pc11);
        return(0);
        }

Результаты хранятся не в массиве, а в отдельных переменных.

У вас неправильный массив, он маловат...

playerCard[1][1]={{0}} — содержит только ОДИН элемент! Это playerCard[0][0]!

Остальные элементы находятся за границами массива! Ну и так уж получается, что playerCard[1][0] и playerCard[0][1] — это «одно и то же лицо».

Пользователь решил продолжить мысль 04 Декабря 2012, 23:09:53:
Кстати, если уж хотите написать свой ГСЧ, изучите хотя бы упрощенную пример по книжке Форсайт, Малькольм, Моулер «Машинные методы математических вычислений», можно также почитать Кнута, но там сложнее; по первой книжке получаются вполне нормальные результаты.
« Последнее редактирование: 08 Марта 2013, 14:37:05 от inkblack »
Делюсь знаниями, но их у меня мало!

 

Страница сгенерирована за 0.026 секунд. Запросов: 22.