Tried using a fixed meandering path for the snake effect. Doesn't work as of now.
This commit is contained in:
		@@ -14,6 +14,7 @@ class SnakeEffect : public Effect {
 | 
			
		||||
private:
 | 
			
		||||
	Coords _pos;
 | 
			
		||||
	Coords _apple;
 | 
			
		||||
	Coords _tail;
 | 
			
		||||
	int8_t _dir = SNAKE_DIR_NORTH;
 | 
			
		||||
	uint8_t* _map;
 | 
			
		||||
	uint16_t _pixels;
 | 
			
		||||
@@ -32,11 +33,16 @@ private:
 | 
			
		||||
	const uint32_t _weights[36] = {0xbd25943f, 0xbf279d81, 0x3e25d128, 0x3ec62438, 0x3f0e719c, 0x3eefbea9, 0x3e947ed4, 0xbe5323c1, 0xbf2d4796, 0xbf3f0a75, 0x3f0e45d9, 0xbf0253ca, 0xbedca2f2, 0xbd79073c, 0x3ede80ec, 0xbd4b97b6, 0x3f69a6be, 0xbe4b8bf2, 0x3eccf87d, 0xbf301113, 0xbf62b6e8, 0xbf71daf6, 0xbf204130, 0xbf222609, 0x3e26c03c, 0xbf497837, 0xbee4d175, 0x3ec601de, 0x3e4954eb, 0x3eef2619, 0xbe849370, 0xbf18fb2b, 0x3f25bbd1, 0xbf3b4e44, 0x3f484d59, 0x3edd6a8a};
 | 
			
		||||
	//   Round 193, 164.8 points, length  36,  6% stopped, 94% died
 | 
			
		||||
	//const uint32_t _weights[36] = {0x3e872ffb, 0xbea57262, 0xbee269bf, 0x3ed790a3, 0xbf54014f, 0x3ecde0a6, 0xbf240a93, 0xbe9e4782, 0x3f205106, 0xbf4465c2, 0xbf79579a, 0xbf07f122, 0x3ed0e1bc, 0xbf7a5a09, 0xbf0fc70b, 0xbf6d1971, 0xbe0f5585, 0xbec94b12, 0x3f51f7a9, 0x3eaac42b, 0xbe6aafa6, 0x3d3e3ce3, 0xbf7c4232, 0xbe634103, 0x3f800000, 0x3eff886c, 0x3deae1e8, 0x3eea6988, 0xbf800000, 0xbf426a20, 0x3e3a0a45, 0xbe848803, 0x3e84e8c9, 0x3ef9fabc, 0xbe7733e6, 0xbecda633};
 | 
			
		||||
	//   Round 13650, 244.8 points, length 42, 34% stopped, 66% died
 | 
			
		||||
	//const uint32_t _weights[36] = {0xbeb99de3, 0x3e6ca488, 0xbe3e9dad, 0xbed38d4e, 0x3f279fc1, 0xbd367111, 0xbf473843, 0xbf800000, 0x3f614edc, 0xbecc734f, 0xbe59b29d, 0x3d479078, 0x3efa7ca6, 0xbedc6ce6, 0x3f4626a1, 0x3e9d8c2c, 0x3f29e25c, 0x3ebde05d, 0x3e8f3e29, 0xbe8ad92c, 0xbe148f2d, 0x3d4a3ca7, 0xbf800000, 0x3d9cd634, 0x3f29802e, 0xbf2cc57e, 0xbcbfafff, 0x3e280b8a, 0x3f5ff9a3, 0xbf4e29c9, 0x3e8936d2, 0xbf49dda9, 0xbe9bf4c7, 0x3e203ea8, 0xbd4edf4d, 0xbf4e3c05};
 | 
			
		||||
 
 | 
			
		||||
	const uint8_t _net_layout[3] = {6, 4, 3};
 | 
			
		||||
	const uint8_t _net_layers = 3;
 | 
			
		||||
	const uint8_t _net_total_size = 36;
 | 
			
		||||
	
 | 
			
		||||
	uint8_t _head_rounds = 0;
 | 
			
		||||
	uint8_t _tail_rounds = 0;
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	uint16_t _xy2i(uint8_t x, uint8_t y);
 | 
			
		||||
	uint16_t _xy2i(Coords c);
 | 
			
		||||
@@ -49,6 +55,7 @@ private:
 | 
			
		||||
	void _place_apple();
 | 
			
		||||
	void _init();
 | 
			
		||||
	void _decide();
 | 
			
		||||
	uint8_t _coords_to_field_id(Coords);
 | 
			
		||||
	int8_t _manual_decision();
 | 
			
		||||
	void _move();
 | 
			
		||||
	void _draw();
 | 
			
		||||
 
 | 
			
		||||
@@ -124,6 +124,35 @@ int8_t SnakeEffect::_manual_decision() {
 | 
			
		||||
	return 0;
 | 
			
		||||
}*/
 | 
			
		||||
 | 
			
		||||
/* This uses a predefined meandering path through the complete field.
 | 
			
		||||
   The snake always tries to reach the field matching following criteria:
 | 
			
		||||
     (1) Being free.
 | 
			
		||||
     (2) Having a number smaller than the field the apple is on. (Watch out for "overflows".)
 | 
			
		||||
*/
 | 
			
		||||
int8_t SnakeEffect::_manual_decision() {
 | 
			
		||||
	uint16_t head_index = (_head_rounds<<8) | _coords_to_field_id(_pos);
 | 
			
		||||
	uint16_t apple_index = (_head_rounds<<8) | _coords_to_field_id(_apple);
 | 
			
		||||
	uint16_t tail_index = (_tail_rounds<<8) | _coords_to_field_id(_tail);
 | 
			
		||||
	
 | 
			
		||||
	if (apple_index < head_index) apple_index += 0x100;
 | 
			
		||||
	
 | 
			
		||||
	uint8_t best_dist = 0xFF;
 | 
			
		||||
	int8_t decision = 0;
 | 
			
		||||
	for (int i=-1; i<=1; i++) {
 | 
			
		||||
		Coords new_pos = _new_pos(_dir + i);
 | 
			
		||||
		uint16_t theoretical_index = (_head_rounds<<8) | _coords_to_field_id(new_pos);
 | 
			
		||||
		if (theoretical_index < head_index) theoretical_index += 0x100;
 | 
			
		||||
		int16_t dist = apple_index - theoretical_index;
 | 
			
		||||
		if (dist < 0) dist += window->height * window->width;
 | 
			
		||||
		if (dist < best_dist && _is_free(_dir + i) && theoretical_index<tail_index && theoretical_index<tail_index) {
 | 
			
		||||
			decision = i;
 | 
			
		||||
			best_dist = dist;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	_dir = (_dir + decision) % 4;
 | 
			
		||||
	return decision;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool SnakeEffect::_is_free(uint8_t dir) {
 | 
			
		||||
	return _free_spaces(dir)!=0;
 | 
			
		||||
}
 | 
			
		||||
@@ -150,6 +179,17 @@ uint8_t SnakeEffect::_free_spaces(uint8_t dir) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t SnakeEffect::_coords_to_field_id(Coords c) {
 | 
			
		||||
	if (c.y==0) return window->width - c.x;
 | 
			
		||||
	if (c.x % 2 == 0) {
 | 
			
		||||
		// even columns
 | 
			
		||||
		return window->width + c.x*(window->height - 1) + c.y - 1;
 | 
			
		||||
	} else {
 | 
			
		||||
		// odd columns
 | 
			
		||||
		return window->width + (c.x+1)*(window->height-1) - c.y;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t SnakeEffect::_to_apple(uint8_t dir) {
 | 
			
		||||
	uint8_t d = dir % 4;
 | 
			
		||||
	int8_t d_x = _apple.x - _pos.x;
 | 
			
		||||
@@ -207,7 +247,7 @@ void SnakeEffect::_move() {
 | 
			
		||||
	}
 | 
			
		||||
	_round++;
 | 
			
		||||
	_last_move_at = now;
 | 
			
		||||
	_decide();
 | 
			
		||||
	_manual_decision();
 | 
			
		||||
	
 | 
			
		||||
	if (_dying==0 && !_is_free(_dir)) {
 | 
			
		||||
		_dying = 150;
 | 
			
		||||
@@ -215,6 +255,10 @@ void SnakeEffect::_move() {
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	_pos = _new_pos(_dir);
 | 
			
		||||
	
 | 
			
		||||
	uint8_t index_head = _coords_to_field_id(_pos);
 | 
			
		||||
	uint8_t index_tail = _coords_to_field_id(_tail);
 | 
			
		||||
	
 | 
			
		||||
	if (SNAKE_DEBUG) LOGln("SnakeEffect * new_pos: %d, %d", _pos.x, _pos.y);
 | 
			
		||||
	if (SNAKE_DEBUG) LOGln("SnakeEffect * apple:   %d, %d", _apple.x, _apple.y);
 | 
			
		||||
	if (_pos.x==_apple.x && _pos.y==_apple.y) {
 | 
			
		||||
@@ -222,13 +266,26 @@ void SnakeEffect::_move() {
 | 
			
		||||
		_length++;
 | 
			
		||||
	}
 | 
			
		||||
	for (int i=0; i<_pixels; i++) {
 | 
			
		||||
		if (_map[i]>0 && _map[i]<_length-1) _map[i]++;
 | 
			
		||||
		if (_map[i]>0 && _map[i]<_length-1) {
 | 
			
		||||
			_map[i]++;
 | 
			
		||||
			if (_map[i]==_length-1) {
 | 
			
		||||
				_tail = _i2xy(i);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else _map[i]=0;
 | 
			
		||||
	}
 | 
			
		||||
	_map[_xy2i(_pos)] = 1;
 | 
			
		||||
	if (_pos.x==_apple.x && _pos.y==_apple.y) {
 | 
			
		||||
		_place_apple();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	if (index_head > _coords_to_field_id(_pos)) _head_rounds++;
 | 
			
		||||
	if (index_tail > _coords_to_field_id(_tail)) _tail_rounds++;
 | 
			
		||||
	if (_head_rounds > 0 && _head_rounds > 0) {
 | 
			
		||||
		uint8_t min = (_head_rounds < _tail_rounds) ? _tail_rounds : _head_rounds;
 | 
			
		||||
		_head_rounds -= min;
 | 
			
		||||
		_tail_rounds -= min;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SnakeEffect::_draw() {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user