2015-07-20 8 views
-1

Я пытаюсь создать генератор случайного уровня, который использует mersenne twister. Вот код (это только начало, так что это не имеет особого смысла):Невозможно преобразовать uniform_int_distribution <int> в int

Generator.h:

//Level generator 

#pragma once 

class GameMap 
{ 
public: 


    static int bgmap[256][256]; 
    static int fg1map[256][256]; 
    static int fg2map[256][256]; 
    static int genposx, genposy, width, height; 


    static std::mt19937 twister(int); 
    static std::uniform_int_distribution<int> dist1(int, int); 
    static std::uniform_int_distribution<int> dist2(int, int); 
    static std::random_device rd; 
    void Generate(int sizex, int sizey, int seed); 

    GameMap(); 
    ~GameMap(); 
}; 

Generator.cpp:

//#include <SFML/Graphics.hpp> 
#include <random> 
#include "Generator.h" 

GameMap::GameMap() 
{ 
    dist1(1, 8); 
    dist2(1, 248); 
} 


void GameMap::Generate(int sizex, int sizey, int seed = rd()) 
{ 
    twister(seed); 

    genposx = 1; 
    genposy = 1; 

    do 
    { 
     genposx = dist2(twister); 
     genposy = dist2(twister); 
     width = dist1(twister); 
     height = dist1(twister); 

    } while (whatever); 
} 

Проблема заключается в том, что я могу 't конвертировать uniform_int_distrubution в int. Я получаю Intellisense сообщения об ошибках:

no suitable conversion from unifgorm_int_distribution<int>" to "int" exists 

argument of type "std::mt19937 (*)(int)" is incompatible with parameter of type "int" 

too few arguments in function call 

Все те, которые на этих линиях:

genposx = dist2(twister); 
genposy = dist2(twister); 
width = dist1(twister); 
height = dist1(twister); 

Я потерял много времени на поиск в Интернете ответ, но я не мог найти ничего. Пожалуйста помоги.

+0

Ну, почему вы пытаетесь преобразовать 'uniform_int_distribution ' к 'int'? Это бессмысленно. Я не верю, что вы «потеряли много часов, отыскав в Интернете ответ», потому что есть масса материалов для чтения по правильному использованию «uniform_int_distribution», и ни один из них не представлен в вашем коде. Вы даже не предоставляете правильное количество аргументов вашим функциям 'dist1' и' dist2' ... –

+0

Почему все в вашем классе является статическим членом данных? Вы не указали определения для каких-либо из этих статических членов, и по какой-то нечетной причине вы продолжаете писать типы своих аргументов конструктора при их объявлении, поэтому компилятор считает, что они являются объявлениями функций-членов. Вероятно, это не тот ответ, который вы хотите услышать, но сделанные вами ошибки предполагают, что вам очень полезно прочитать [C++ book] (https://stackoverflow.com/q/388242/241631). – Praetorian

+0

@Praetorian - Нет, это не ответ, который я бы не хотел слышать. Программирование на самом деле не на первом месте моих интересов, и я не трачу большую часть своего свободного времени на это. Обычно, когда я программирую, я не использую объекты, потому что это низкоуровневое программирование, предназначенное для аппаратного обеспечения, поэтому я новичок в этом. Я собираюсь купить какую-то книгу, потому что кажется, что то, что я узнал об объектах до этого момента, - это фигня. В любом случае, спасибо за ответ. – Mohrcore

ответ

4

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

class GameMap 
{ 
public: 

    // are these really meant to be static (one for all GameMap's) 
    // or do you want one set of map data for every GameMap object (non static)? 
    /*static*/ int bgmap[256][256]; 
    /*static*/ int fg1map[256][256]; 
    /*static*/ int fg2map[256][256]; 
    /*static*/ int genposx, genposy, width, height; 


    // static std::mt19937 twister(int); // function declaration? 
    std::mt19937 twister; 

    // probably you don't want static function declarations 
    std::uniform_int_distribution<int> dist1; //(int, int); 
    std::uniform_int_distribution<int> dist2; //(int, int); 
    static std::random_device rd; 
    void Generate(int sizex, int sizey, int seed); 

    GameMap(); 
    ~GameMap(); 
}; 

GameMap::GameMap() 
: dist1(1, 8) 
, dist2(1, 248) // initialize these here 
{ 
} 


void GameMap::Generate(int sizex, int sizey, int seed = rd()) 
{ 
    twister.seed(seed); // probably you meant this? 

    genposx = 1; 
    genposy = 1; 

    do 
    { 
     genposx = dist2(twister); 
     genposy = dist2(twister); 
     width = dist1(twister); 
     height = dist1(twister); 

    } while (whatever); 
}