コード例 #1
0
ファイル: er-dtls-13-data.c プロジェクト: SmallLars/ba-codtls
int createSession(uint32_t *buf, uip_ipaddr_t *addr) {
    uint32_t i;

    Session_t *session = (Session_t *) (buf + 8);
    Session_t *s = (Session_t *) RES_SESSION_LIST; // Pointer auf Flashspeicher
    int index = getIndexOf(addr);

    // Ein neuer private Key für ECDH wird in jedem Fall generiert
    nvm_getVar(buf, RES_ECC_ORDER, LEN_ECC_ORDER);
    #if DEBUG
        printf("ECC_ORDER: ");
        for (i = 0; i < 8; i++) printf("%08X", uip_htonl(buf[i]));
        printf("\n");
    #endif
    do {
        random_x((uint8_t *) session->private_key, 32);
    } while (!ecc_is_valid_key(session->private_key, buf));

    // Falls schon ein Eintrag existiert wird die Session durch
    // setzten des neuen private Keys weiterentwickelt. Ansonsten
    // wird alles gesetzt.
    if (index >= 0) {
        nvm_setVar(session->private_key, (fpoint_t) s[index].private_key, 32);
        PRINTF("Session aktualisiert:\n");
        PRINTSESSION(index);
    } else {
        index = getIndexOf(NULL);;
        if (index < 0)
            return -1;

        uip_ipaddr_copy(&session->addr, addr);
        for (i = 0; i < 8; i++) {
            nvm_getVar(session->session + i, RES_ANSCHARS + (random_8() & 0x3F), 1);
        } // TODO session-id auf doppel prüfen
        session->epoch = 0;
        session->valid = 1;

        nvm_setVar(session, (fpoint_t) &s[index], sizeof(Session_t));
        PRINTF("Session erstellt:\n");
        PRINTSESSION(index);
        seq_num_r[index] = 1;
        seq_num_w[index] = 1;
    }

    return 0;
}
コード例 #2
0
ファイル: montecarlo.cpp プロジェクト: aaronjoel/numeric
// Plain Monte Carlo integrator
void MC::plain()
{

  // Set volume of sample space
  set_volume();

  Floattype sum = 0.0f, sumsum = 0.0f, fx;

  for (Lengthtype i=0; i<N; ++i) {
    x = random_x(); // Random sample point inside intervals
    fx = f(x);
    sum += fx;
    sumsum += fx*fx;
  }

  Floattype average  = sum/N;
  Floattype variance = sumsum/N - average*average;

  // Write results
  Q = average * V;
  err = sqrt(variance/N)*V;
}
コード例 #3
0
sgeroids::view::planar::background::object::object(
	sge::renderer::device::core &_renderer,
	sge::renderer::vertex::declaration const &_vertex_declaration,
	sgeroids::view::planar::texture_tree &_texture_tree,
	sgeroids::model::play_area const &_play_area,
	sgeroids::random_generator &_rng,
	star_size const _star_size,
	star_count const _star_count)
:
	sprite_buffers_(
		sge::sprite::buffers::parameters(
			_renderer,
			_vertex_declaration),
		sge::sprite::buffers::option::dynamic),
	sprite_collection_(),
	sprite_state_(
		_renderer,
		sge::sprite::state::parameters<
			sprite_state_choices
		>()),
	sprites_(),
	sprite_render_range_(),
	texture_tree_(
		_texture_tree),
	play_area_(
		_play_area),
	star_size_(
		_star_size),
	star_count_(
		_star_count)
{
	typedef fcppt::random::distribution::basic<
		fcppt::random::distribution::parameters::uniform_int<
			int
		>
	> int_distribution;

	typedef fcppt::random::distribution::basic<
		fcppt::random::distribution::parameters::uniform_real<
			float
		>
	> float_distribution;

	typedef fcppt::random::variate<
		sgeroids::random_generator,
		int_distribution
	> int_rng;

	typedef fcppt::random::variate<
		sgeroids::random_generator,
		float_distribution
	> float_rng;

	int_rng random_x(
		_rng,
		int_distribution(
			int_distribution::param_type::min(
				0),
			int_distribution::param_type::max(
				play_area_.get().size().w())));

	int_rng random_y(
		_rng,
		int_distribution(
			int_distribution::param_type::min(
				0),
			int_distribution::param_type::max(
				play_area_.get().size().h())));

	float_rng random_angle(
		_rng,
		float_distribution(
			float_distribution::param_type::min(
				0.f),
			float_distribution::param_type::sup(
				6.f)));

	int_rng random_radius(
		_rng,
		int_distribution(
			int_distribution::param_type::min(
				math::unit_magnitude() * star_size_.get()),
			int_distribution::param_type::max(
				math::unit_magnitude() * star_size_.get() * 4)));

	for (
		star_count::value_type index = 0;
		index < star_count_.get();
		++index
	)
		sprites_.push_back(
			planar::sprite::object(
				sge::sprite::roles::connection{} =
					sprite_collection_.connection(
						0
					),
				sge::sprite::roles::texture0{} =
					sgeroids::view::planar::sprite::object::texture_type{
						texture_tree_.get(
							sge::resource_tree::path() / FCPPT_TEXT("star")
						)
					},
				sge::sprite::roles::size{} =
					planar::sprite_size_from_texture_and_radius(
						*texture_tree_.get(
							sge::resource_tree::path() / FCPPT_TEXT("star")),
						planar::radius(random_radius())
					),
				sge::sprite::roles::center{} =
					planar::sprite::object::vector(
						random_x(),
						random_y()
					),
				sge::sprite::roles::rotation{} =
					0.f,
				sge::sprite::roles::color{} =
					sge::image::color::any::convert<
						sgeroids::view::planar::sprite::color_format
					>(
						sge::image::color::predef::white()
					)
			)
		);

	sprites_.push_back(
		planar::sprite::object(
			sge::sprite::roles::connection{} =
				sprite_collection_.connection(
					2
				),
			sge::sprite::roles::texture0{} =
				sgeroids::view::planar::sprite::object::texture_type{
					texture_tree_.get(
						sge::resource_tree::path() / FCPPT_TEXT("planet")
					)
				},
			sge::sprite::roles::size{} =
				planar::sprite_size_from_texture_and_radius(
					*texture_tree_.get(
						sge::resource_tree::path() / FCPPT_TEXT("planet")),
					planar::radius(30 * random_radius())
				),
			sge::sprite::roles::center{} =
				planar::sprite::object::vector(
					random_x(),
					random_y()
				),
			sge::sprite::roles::rotation{} =
				random_angle(),
			sge::sprite::roles::color{} =
				sge::image::color::any::convert<
					sgeroids::view::planar::sprite::color_format
				>(
					sge::image::color::predef::white()
				)
		)
	);

	sprites_.push_back(
		planar::sprite::object(
			sge::sprite::roles::connection{} =
				sprite_collection_.connection(
					1
				),
			sge::sprite::roles::texture0{} =
				sgeroids::view::planar::sprite::object::texture_type{
					texture_tree_.get(
						sge::resource_tree::path() / FCPPT_TEXT("nebula"))
				},
			sge::sprite::roles::size{} =
				planar::sprite_size_from_texture_and_radius(
					*texture_tree_.get(
						sge::resource_tree::path() / FCPPT_TEXT("nebula")),
					planar::radius(math::unit_magnitude() * 1024 * 1024)
				),
			sge::sprite::roles::center{} =
				planar::sprite::object::vector(
					random_x(),
					random_y()
				),
			sge::sprite::roles::rotation{} =
				random_angle(),
			sge::sprite::roles::color{} =
				sge::image::color::any::convert<
					sgeroids::view::planar::sprite::color_format
				>(
					sge::image::color::predef::white()
				)
		)
	);

	sprite_render_range_ =
		sge::sprite::geometry::sort_and_update(
			sprite_collection_.range(),
			sge::sprite::compare::default_(),
			sprite_buffers_);
}
コード例 #4
0
ファイル: Random50_45mix.cpp プロジェクト: jd748/A-B
int main()
{
    // Patients (n), attributes (p), iterations in solving DP (N1), iterations in estimation of ratio (N2);
    int p = 45;
    int n = 50;
    int N1 = 250;
    int N2 = 250;

    std::mt19937 generator1 (61245);
    std::mt19937 generator2 (16746);
    std::mt19937 generator3 (27351);
    std::mt19937 generator4 (66459);
    std::mt19937 generator5 (12612);
    std::mt19937 generator6 (16326);
    std::mt19937 generator7 (86733);
    
    std::normal_distribution <double> nd(0.0, 1.0);
    std::chi_squared_distribution <double> xs(p - 2);

    //R is Cholesky factorization of Covar matrix
    //mu is vector of patient attribute means
    Eigen::MatrixXd s(p-1,p-1);
    Eigen::MatrixXd si(p-1,p-1);
    Eigen::MatrixXd zee(n,p-1);
    Eigen::MatrixXd Z(n,p-1);
    Eigen::MatrixXd Z2(n,p);
    //Update mu as necessary
    Eigen::VectorXd mu = Eigen::VectorXd::Zero(p-1);
    
    //Generates matrix of standard normals, then uses cholesky factorization to get correct covar matrix
    for (int i = 0; i < n; i++){
        for (int j = 0; j < p-1; j++){
            zee(i,j) = nd(generator1);
        }
    }

    for (int i = 0; i < p-1; i++){
        for (int j = 0; j < p-1; j++){
            if (i==j)
            {
                s(i,j) = 1.0;
            }
            else
            {
                s(i,j) = 0.1;
            }
        }
    }

    si = s.inverse();
    Eigen::LLT<Eigen::MatrixXd> lltOfS(s);
    Eigen::MatrixXd R = lltOfS.matrixL();

    double temp = 0;
    
    //Z2 is matrix of patient attributes (n x p)
    Z = zee*R;
    for (int i = 0; i < n; i++){
        for (int j = 0; j < p; j++){
            if(j > 0){
                Z2(i,j) = Z(i,j-1) + mu(j-1);
            } else{
                Z2(i,j) = 1;
            }
        }
    }
            
    //Eta + Xi computation
    
    double eta1 [N1];
    double xi1 [N1];
    double eta2 [N1];
    double xi2 [N1];

    for (int i = 0; i < N1; i++){
        eta1[i] = nd(generator3)+2;
        xi1[i] = xs(generator4);
        eta2[i] = nd(generator6)-2;
        xi2[i] = xs(generator7);
    }

    //Solving 2-D DP using mesh
    double M = 2000.0;
    double delta = 0.2;
    int steps = ceil(M/delta)+1;

    DP table(n, delta, M);

    //syntax helpers
    double lambda = 0;
    int m = 0;

    double lambda_up = 0;
    double lambda_down = 0;
    double roundup_plus = 0;
    double rounddown_plus = 0;
    double roundup_minus = 0;
    double rounddown_minus = 0;

    double distdown_minus = 0;
    double distup_minus = 0;
    double distdown_plus = 0;
    double distup_plus = 0;

    double plus = 0;
    double minus = 0;
    double plus2 = 0;
    double minus2 = 0;
    int screwups = 0;


    //Boundary condition
    for (int i = 0; i < 2*n + 1; i++){
        for (int j = 0; j < steps;j++){
            m = i-n;
            lambda = delta*j;
            table.set(0, i, j, pow(m, 2) + lambda);
        }
    }
    
    //Solving mesh
    for (int l = 1;l < n; l++){ 
        std::cout << l << "\n";
        for (int i = l; i < 2*n+1-l; i++){ //under my indexing, l + k = n
            m = i-n;
            for (int j = 0; j < steps; j++){ 
                lambda = delta*j;
                temp = 0;
                for (int iter = 0; iter < N1; iter++){ 
                    lambda_up = pow(sqrt(lambda)+eta1[iter],2)+xi1[iter];
                    lambda_down = pow(sqrt(lambda)-eta1[iter],2)+xi1[iter];
                    
                    if (lambda_down > M){
                        lambda_down = M;
                    }
                    if (lambda_up > M){
                        lambda_up = M;
                    }

                    roundup_plus = ceil(lambda_up/delta);
                    rounddown_plus = floor(lambda_up/delta); 
                    distdown_plus  = lambda_up - rounddown_plus*delta;
                    distup_plus = roundup_plus*delta - lambda_up;

                    roundup_minus = ceil(lambda_down/delta);
                    rounddown_minus = floor(lambda_down/delta);
                    distdown_minus = lambda_down - rounddown_minus*delta;
                    distup_minus = roundup_minus*delta - lambda_down;
                    
                    try{ 
                        plus = (1/delta)*(distup_plus*table.at(l-1, i+1, rounddown_plus) + distdown_plus*table.at(l-1, i+1, roundup_plus));
                        minus = (1/delta)*(distup_minus*table.at(l-1,i-1,rounddown_minus) + distdown_minus*table.at(l-1,i-1,roundup_minus));
                    }
                    catch (const std::out_of_range& e){
                        std::cout << "roundup/down_plus " << roundup_plus << ", " << rounddown_plus << "\n";
                        std::cout << "roundup/down_minus " << roundup_minus << ", " << rounddown_minus << "\n";   
                        std::cout << "Line 151 \n";
                        return 0;
                    }

                    
                    lambda_up = pow(sqrt(lambda)+eta2[iter],2)+xi2[iter];
                    lambda_down = pow(sqrt(lambda)-eta2[iter],2)+xi2[iter];
                    
                    if (lambda_down > M){
                        lambda_down = M;
                    }
                    if (lambda_up > M){
                        lambda_up = M;
                    }

                    roundup_plus = ceil(lambda_up/delta);
                    rounddown_plus = floor(lambda_up/delta); 
                    distdown_plus  = lambda_up - rounddown_plus*delta;
                    distup_plus = roundup_plus*delta - lambda_up;

                    roundup_minus = ceil(lambda_down/delta);
                    rounddown_minus = floor(lambda_down/delta);
                    distdown_minus = lambda_down - rounddown_minus*delta;
                    distup_minus = roundup_minus*delta - lambda_down;
                    
                    try{ 
                        plus += (1/delta)*(distup_plus*table.at(l-1, i+1, rounddown_plus) + distdown_plus*table.at(l-1, i+1, roundup_plus));
                        minus += (1/delta)*(distup_minus*table.at(l-1,i-1,rounddown_minus) + distdown_minus*table.at(l-1,i-1,roundup_minus));
                    }
                    catch (const std::out_of_range& e){
                        std::cout << "roundup/down_plus " << roundup_plus << ", " << rounddown_plus << "\n";
                        std::cout << "roundup/down_minus " << roundup_minus << ", " << rounddown_minus << "\n";   
                        std::cout << "Line 151 \n";
                        return 0;
                    }

                    temp = temp*iter/(iter+1) + std::min(plus,minus)/(iter+1);

                    /*if(temp < 0){
                        std::cout << lambda_down << " " << lambda_up << "\n";
                        std::cout << distdown_plus << " " << distup_plus << "\n";
                        std::cout << distdown_minus << " " << distup_minus << "\n";    
                        return 0;
                    }*/
                }
                
                try{
                    table.set(l,i,j,temp);          
                } 
                catch (const std::out_of_range& e){
                    std::cout << "(" << l << ", " << i << ", " << j <<") \n";
                }

            }
        }
    }
    char result[ PATH_MAX ];
    ssize_t count = readlink( "/proc/self/exe", result, PATH_MAX );
    std::string name = std::string( result, (count > 0) ? count : 0);
    std::string extension = ".csv";
    name.append(extension);

    std::ofstream outputFile;
    outputFile.open(name);

    //for (int l = 0; l < n; l++){
    for (int l = 0; l < n; l++){
        for (int i=0; i < 2*n+1;i++){
            for (int j=0; j < 1; j++){
                outputFile << table.at(l,i,j) << ", ";
            }
            //outputFile << "\n";
        }
        outputFile << "\n";
    }

    outputFile.close();

    return 0;

    //Vs Naive random allocation
    //Eff = x^T P_Z x where x is allocations, P_Z = I - Z(Z^T Z)^(-1) Z^T

    Eigen::MatrixXd PZ;
    Eigen::MatrixXd I = Eigen::MatrixXd::Identity(n,n);
    Eigen::MatrixXd Z2I;
    
    //Generates matrix of standard normals, then uses cholesky factorization to get correct covar matrix
    //Vector of n/2 1's and -1's
    int rand_x[n];
    for (int i = 0; i < n; i++){
        rand_x[i] = -1 + 2*floor(2*i/n);
    }

    std::vector <int> myvector (rand_x, rand_x+n);
    Eigen::VectorXd random_x(n);
    Eigen::VectorXd dp_x(n);

    double eff_r = 0;
    double eff_dp = 0;
    double eff = 0;

    //Tracks variable Delta as in paper
    Eigen::VectorXd var_Delta(p-1);
    var_Delta.setZero();
    Eigen::VectorXd var_Delta_up(p-1);
    Eigen::VectorXd var_Delta_down(p-1);
    Eigen::MatrixXd condition(n,n); //Used to prevent floating point problems
    int var_delta;
    double mahalanobis_plus = 0;
    double mahalanobis_minus = 0;
    //Eigen::EigenSolver<Eigen::MatrixXd> es;
    
    //Large loop to test policies
    for (int asdf = 0; asdf < N2; asdf++){
        //std::cout << "asdf = " << asdf << "\n";
        var_delta = n;
        var_Delta.setZero();

        for (int i = 0; i < n; i++){
            for (int j = 0; j < p-1; j++){
                zee(i,j) = nd(generator1);
            }
        }    
        
        //Z is matrix of patient attributes (n x p)  
        Z = zee*R;
        for (int i = 0; i < n; i++){
            for (int j = 0; j < p; j++){
                if(j > 0){
                    Z2(i,j) = Z(i,j-1) + mu(j-1);
                } else{
                    Z2(i,j) = 1;
                }
            }
        }

        Z2I = Z2.transpose()*Z2;
        PZ = I - Z2*(Z2I.inverse())*Z2.transpose(); 
        //es.compute(PZ, false);
        //temp = 0;
        //for (int i = 0; i < n; i++){
        //    if (temp > (double)(es.eigenvalues()(i,0).real())){
        //        temp = (double)(es.eigenvalues()(i,0).real());
        //    }
        //}
        //PZ = PZ + Eigen::MatrixXd::Identity(n,n)*temp;
        //This is where randomized sampling is done 
        for (int i = 0; i < N1; i++){
            std::random_shuffle ( myvector.begin(), myvector.end());
            for (int j = 0; j < n; j++){
                random_x(j) = myvector[j];
            }
            temp = random_x.transpose() * PZ * random_x;
            eff_r = eff_r*i/(i+1) + temp/(i+1);
        }

        //This is where we do "optimal" sampling
        for (int i = 0; i < n; i++){
            std::cout << Z2.block(i,1,1,p-1) << "\n";
            var_Delta_up = var_Delta + Z2.block(i,1,1,p-1).transpose();
            std::cout << var_Delta_up.transpose() << "\n";
            var_Delta_down = var_Delta - Z2.block(i,1,1,p-1).transpose();
            std::cout << var_Delta_down.transpose() << "\n";
            mahalanobis_plus = var_Delta_up.transpose()*si*var_Delta_up;
            std::cout << mahalanobis_plus << "\n";
            roundup_plus = ceil(mahalanobis_plus/delta);
            rounddown_plus = floor(mahalanobis_plus/delta );
            distup_plus = roundup_plus*delta - mahalanobis_plus;
            distdown_plus = mahalanobis_plus - rounddown_plus*delta;
            //std::cout << var_delta << "\n";
            //std::cout << rounddown_plus << " " << roundup_plus << "\n";
            //std::cout << "(" << n-i-1 << "," << var_delta+1 << ", " << rounddown_plus << ") \n"; 
            //std::cout << "plus done \n";

            mahalanobis_minus = var_Delta_down.transpose()*si*var_Delta_down;
            roundup_minus = ceil(mahalanobis_minus/delta );
            rounddown_minus = floor(mahalanobis_minus/delta);
            distup_minus = roundup_minus*delta - mahalanobis_minus;
            distdown_minus = mahalanobis_minus - rounddown_minus*delta;
            //std::cout << "(" << n-i-1 << "," << var_delta-1 << ", " << rounddown_plus << ") \n";
            
            try{
                plus = (1/delta)*(distup_plus*table.at(n-1-i,var_delta+1, rounddown_plus) + distdown_plus*table.at(n-1-i,var_delta+1,roundup_plus));
                minus = (1/delta)*(distup_minus*table.at(n-1-i,var_delta-1, rounddown_minus) + distdown_minus*table.at(n-1-i,var_delta-1,roundup_minus));
                if (minus > plus){
                    var_delta++;
                    var_Delta = var_Delta_up;
                    dp_x(i) = 1;
                } else{
                    var_delta--;
                    var_Delta = var_Delta_down;
                    dp_x(i) = -1;
                }
            }
            catch (const std::out_of_range& e){
                std::cout << "mahalanobis_plus = " << mahalanobis_plus << "\n";
                std::cout << "mahalanobis_minus = " << mahalanobis_minus << "\n";
                std::cout << "distdown/up plus =" << distdown_plus << ", " << distup_plus << "\n";
                std::cout << "distdown/up minus =" << distdown_minus << ", " << distup_minus << "\n";
                std::cout << "line 273 \n";
                std::cout << asdf << "\n";
                screwups++;
            }

            std::cout << "Press any key to continue.";
            std::cin.get();
        }
    
        eff_dp = dp_x.transpose()*PZ*dp_x;
        std::cout << eff_r << ", " << eff_dp << "\n";
        temp += eff_dp/eff_r;
        eff = eff*asdf/(asdf+1) + (eff_dp/eff_r)/(asdf+1);
    }

    
    std::cout << temp/(N1-screwups) << "\n";
    std::cout << "screwups = " << screwups << "\n";
    std::cout << eff << "\n";
    //std::cout << "\n" << PZ << "\n";
    //std::cout << "\n" << eff_r << "\n \n" << eff_dp << "\n";
    //std::cout << "\n" << dp_x << "\n \n" << dp_x.transpose()*PZ*dp_x;
    //Eigen::EigenSolver<Eigen::MatrixXd> es;
    //es.compute(PZ); 
    //std::cout << "\n" << es.eigenvalues();
}
コード例 #5
0
ファイル: playstate.cpp プロジェクト: NHitmaN/AngleSnake
void CPlayState::Update(CGameEngine* game)
{
  sf::Vector2u window_size = game->window.getSize();

	//System Constants
  unsigned WINDOW_WIDTH = window_size.x;
  unsigned WINDOW_HEIGHT = window_size.y;
  unsigned FPS = 60;
  double PI = 3.14159265;

  //Window Settings
  /*
  sf::ContextSettings settings;
  settings.antialiasingLevel = 8;
  sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "Runner", sf::Style::Default, settings);
  window.setVerticalSyncEnabled(true);
  */

  sf::RenderWindow& window = game->window;

  double lastFrameTimeStamp = GetTickCount(); // GetTickCount is for Windows only
  double frame_length = 1000/FPS;

  //random generator
  std::default_random_engine rand_generator;
  rand_generator.seed(time(0)); // seed will only change once per second
  std::uniform_int_distribution<unsigned> random_x(25,WINDOW_WIDTH-25);
  std::uniform_int_distribution<unsigned> random_y(25,WINDOW_HEIGHT-25);


//-----------------------------------
  //LOAD SOUND FILES

  sf::SoundBuffer buffer;
  if (!buffer.loadFromFile("eat.wav")) {
    //error loading file
  }
  sf::Sound eatsound;
  eatsound.setBuffer(buffer);
  eatsound.setVolume(30);

  sf::SoundBuffer buffer2;
  if (!buffer2.loadFromFile("gameover.wav")) {
    //error loading file
  }
  sf::Sound gameoversound;
  gameoversound.setBuffer(buffer2);
  gameoversound.setVolume(30);


//-----------------------------------
  //LOAD FONT AND TEXT

  //Set Default font and text settings
  sf::Font font;
  font.loadFromFile("arial.ttf");
  sf::Text default_text_settings;
  default_text_settings.setFont(font);
  default_text_settings.setColor(sf::Color(254,255,221,100));
  default_text_settings.setStyle(sf::Text::Bold);
  default_text_settings.setCharacterSize(24);

  sf::Text displayscore = default_text_settings;
  displayscore.setPosition(500,50);

//--------------------------------------
  //INITIALIZE GAME OBJECTS

  //game variables
  bool collision = false;
  bool game_running = true;
  double snake_speed = game->m_GameMode.getGameSpeed();
  std::string gamespeed = "normal";
  unsigned directional_speed = 10;
  double hitbox = 2.2;
  unsigned score = 0;
  if(game->m_GameMode.getGameSpeed() == .30) {
      gamespeed = "fast";
      directional_speed = 15;
      hitbox = 3.3;
  }

  //snake
  unsigned snake_width = 10;
  unsigned snake_height = 10;
  int snake_length = 0;
  float snake_direction = 0;
  sf::Vector2f snake_coord;

  //snake head
  sf::RectangleShape snake(sf::Vector2f(snake_width*2, snake_height*2));
  snake.setPosition(WINDOW_WIDTH/2, WINDOW_HEIGHT/2);
  snake.setOrigin(snake_width, snake_height);

  //snake head
  sf::Texture snakehead;
  if (!snakehead.loadFromFile("snake_head.gif")) {
                // error...
  }
  snakehead.setSmooth(true);
  snake.setTexture(&snakehead);

  //snake skin
  sf::Texture snaketexture;
  if (!snaketexture.loadFromFile("snake_skin.gif")) {
                // error...
  }
  snaketexture.setSmooth(true);
  //snake.setTexture(&snaketexture);

  //snake body
  std::deque<sf::RectangleShape> snake_body{};
  sf::Vector2f snake_body_coord;

  //store past snake coordinates
  std::queue<sf::Vector2f> snake_history;

  //food
  sf::RectangleShape food(sf::Vector2f(6, 6));
  food.setFillColor(sf::Color(255,153,0));
  food.setPosition(random_x(rand_generator), random_y(rand_generator));
  sf::Vector2f food_coord;

  //background
  sf::Texture bgtexture;
  if (!bgtexture.loadFromFile("grassbackground2.jpg",sf::IntRect(0,0,640,480))) {
  //error
  }
  sf::Sprite bgsprite;
  bgsprite.setTexture(bgtexture);


//---------------------------------------



  //GAME LOOP

    while(game_running)
    {
      double currentTimeStamp = GetTickCount();
      if(currentTimeStamp - lastFrameTimeStamp >= frame_length)
      {

        //EVENT HANDLER
        sf::Event event;
        while (window.pollEvent(event))
        {
          switch (event.type)
          {
            case sf::Event::Closed:
              window.close();
              game->Quit();
              break;
          }
        }

        //USER INPUT HANDLER
        if(game->m_ControlMode.getControlType() == "keyboard") {
          if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
            snake_direction -= directional_speed;// move left
          }
          if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
            snake_direction += directional_speed; // move right
          }
        }

        if(game->m_ControlMode.getControlType() == "mouse") {
          if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
            snake_direction -= directional_speed; // move left
          }
          if (sf::Mouse::isButtonPressed(sf::Mouse::Right)) {
            snake_direction += directional_speed;// move right
          }
        }


        //GAME LOGIC

        //store past coordinates
        snake_coord = snake.getPosition();
        snake_history.push(snake_coord);

        //limit size of history queue so it doesn't grow too large
        if (snake_history.size() > snake_length + 10)
        {
          snake_history.pop();
        }

        //Create new snake shape
        sf::RectangleShape snake_temp(sf::Vector2f(snake_width, snake_height));
        //snake_temp.setFillColor(sf::Color(128,128,0));
        snake_temp.setPosition(snake_history.back());
        snake_temp.setOrigin(snake_width/2, snake_height/2);
        snake_temp.setTexture(&snaketexture);

        //Add new temporary snake shape to vector
        snake_body.push_back(snake_temp);

        //remove oldest snake shape from snake body if snake did not grow
        if(snake_body.size() > snake_length)
        {
          snake_body.pop_front();
        }

        //change snake head angle
        snake.setRotation(snake_direction);

        //move snake head forward
        snake.move((snake_speed * frame_length)*sin(snake_direction * PI / 180),
                   (snake_speed * frame_length)*-cos(snake_direction * PI / 180));


        //check if snake hit edge of window
        snake_coord = snake.getPosition();
        if(snake_coord.x - snake_width < 0)
        {
          std::cout<< "Game Over: left edge hit" << std::endl;
          collision = true;
        }
        if(snake_coord.y - snake_height < 0)
        {
          std::cout<< "Game Over: top edge hit" << std::endl;
          collision = true;
        }
        if(snake_coord.x + snake_width > WINDOW_WIDTH)
        {
          std::cout<< "Game Over: right edge hit" << std::endl;
          collision = true;
        }
        if(snake_coord.y + snake_height> WINDOW_HEIGHT)
        {
          std::cout<< "Game Over: bottom edge hit" << std::endl;
          collision = true;
        }

        //SURVIVAL GAME MODE
        if(game->m_GameMode.getGameType() == "survival") {
          snake_length++;
        }

        //check if snake ate food
        snake_coord = snake.getPosition();
        food_coord = food.getPosition();

        if ((snake_coord.x <= food_coord.x + snake_width) &&
            (snake_coord.x >= food_coord.x - snake_width) &&
            (snake_coord.y <= food_coord.y + snake_height) &&
            (snake_coord.y >= food_coord.y - snake_height))
        {
          food.setPosition(random_x(rand_generator), random_y(rand_generator));
          snake_length += 5;
          eatsound.play();
          score++;
        }

        //check for snake head and snake body collision
        for(std::deque<sf::RectangleShape>::size_type i = 0; i != snake_body.size(); i++) {
          snake_body_coord = snake_body[i].getPosition();


          if ((snake_coord.x <= snake_body_coord.x + hitbox) &&
              (snake_coord.x >= snake_body_coord.x - hitbox) &&
              (snake_coord.y <= snake_body_coord.y + hitbox) &&
              (snake_coord.y >= snake_body_coord.y - hitbox))   {
                  std::cout << "Game Over: Collision with body piece: #" << i << std::endl;
                  collision = true;
                  break;
          }
        }

        //GAME OVER CONDITION
        if (collision) {
          gameoversound.play();

          //Store the score in the file
          std::ofstream file;
          file.open ("highscores.txt", std::ios_base::app | std::ios_base::out);
          file << game->m_GameMode.getGameType() << "," << gamespeed << "," << score << "\r";
          file.close();

          Sleep(1000);
          game_running = false;
          game->PopState();
          game->PopState();
          break;
        }

        std::ostringstream ss;
        ss << score;
        displayscore.setString( std::string( "Score: "+ss.str() ) );

        //RENDER
        window.clear();

        window.draw(bgsprite);

        for(std::deque<sf::RectangleShape>::size_type i = snake_body.size(); i != 0; --i) {
          window.draw(snake_body[i-1]); //i != vector.size
        }
        window.draw(snake); //head drawn after body so it is on top
        window.draw(food);
        window.draw(displayscore);
        window.display();

        lastFrameTimeStamp = currentTimeStamp;

        //DEBUG
        //std::cout << snake_body.size();

      }

      Sleep(1); // saves some cpu

    } //end core game loop

}