SNAKE FINAL ULTIMATE
Kandif
plain_text
2 years ago
5.7 kB
6
Indexable
extends Node2D var point_pos:Vector2 var snake_body = [Vector2(5,10),Vector2(4,10),Vector2(3,10)] var snake_direction = Vector2(1,0) var changed_direction = false var buffered_direction = Vector2.ZERO var add_point = false var number_of_points = 500 var score = 0 func _ready(): for i in number_of_points: $Board.set_cellv(place_point(),1) point_pos = place_point() draw_point() draw_snake() func draw_snake(): for block_index in snake_body.size(): var block = snake_body[block_index] if block_index == 0: var head_dir = relation(snake_body[1],snake_body[0]) match(head_dir): "left": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(3,1)) "right": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(2,0)) "top": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(2,1)) "down": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(3,0)) elif block_index == snake_body.size()-1: var tail_dir = relation(snake_body[block_index],snake_body[block_index-1]) match(tail_dir): "left": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(1,0)) "right": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(0,0)) "top": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(1,1)) "down": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(0,1)) else: var previous_block = relation(snake_body[block_index],snake_body[block_index-1]) var next_block = relation(snake_body[block_index],snake_body[block_index+1]) match(previous_block+"_"+next_block): "left_top","top_left": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(5,1)) "right_top","top_right": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(4,1)) "down_top","top_down": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(6,1)) "right_left","left_right": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(6,0)) "left_down","down_left": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(5,0)) "right_down","down_right": $Board.set_cell(block.x,block.y,0,false,false,false,Vector2(4,0)) func draw_point(): $Board.set_cell(point_pos.x,point_pos.y,1) func place_point(): randomize() var x = randi() % 20 var y = randi() % 20 while(Vector2(x,y) in snake_body): x = randi() % 20 y = randi() % 20 return Vector2(x,y) func delete_tiles(id): var cells = $Board.get_used_cells_by_id(id) for cell in cells: $Board.set_cell(cell.x,cell.y,-1) func move_snake(): delete_tiles(0) var removable = 2 if add_point: removable = 1 add_point = false var body_copy = snake_body.slice(0,snake_body.size() - removable) var new_head = body_copy[0] + snake_direction body_copy.insert(0,new_head) snake_body = body_copy if buffered_direction!=Vector2.ZERO: snake_direction = buffered_direction buffered_direction = Vector2.ZERO changed_direction = true func _on_Timer_timeout(): if not $Label2.visible: changed_direction = false check_point_eaten() check_game_over() move_snake() draw_point() draw_snake() func check_point_eaten(): var head = snake_body[0] + snake_direction if $Board.get_cell(head.x,head.y) == 1: point_pos = place_point() add_point = true score += 1 $Label.update_score(score) if point_pos == snake_body[0] + snake_direction: point_pos = place_point() add_point = true score += 1 $Label.update_score(score) func check_game_over(): var head = snake_body[0] + snake_direction if head.x>19 or head.x<0 or head.y<0 or head.y>19: reset() if head in snake_body.slice(0,snake_body.size() - 2): reset() func reset(): snake_body = [Vector2(4,10),Vector2(3,10),Vector2(2,10)] snake_direction = Vector2(1,0) delete_tiles(1) point_pos = place_point() for i in number_of_points: $Board.set_cellv(place_point(),1) $Label.check_highscore(score) score = 0 $Label2.visible = true func _process(delta): if $Label2.visible and Input.is_key_pressed(KEY_ENTER): $Label2.visible = false $Label.update_score(0) if not changed_direction: if Input.is_key_pressed(KEY_W) and not snake_direction == Vector2(0,1): changed_direction = true snake_direction = Vector2(0,-1) elif Input.is_key_pressed(KEY_S) and not snake_direction == Vector2(0,-1): changed_direction = true snake_direction = Vector2(0,1) elif Input.is_key_pressed(KEY_A) and not snake_direction == Vector2(1,0): changed_direction = true snake_direction = Vector2(-1,0) elif Input.is_key_pressed(KEY_D) and not snake_direction == Vector2(-1,0): changed_direction = true snake_direction = Vector2(1,0) else: if Input.is_key_pressed(KEY_W) && not snake_direction == Vector2(0,1) : buffered_direction = Vector2(0,-1) elif Input.is_key_pressed(KEY_D) && not snake_direction == Vector2(-1,0) : buffered_direction = Vector2(1,0) elif Input.is_key_pressed(KEY_A) && not snake_direction == Vector2(1,0) : buffered_direction = Vector2(-1,0) elif Input.is_key_pressed(KEY_S) && not snake_direction == Vector2(0,-1) : buffered_direction = Vector2(0,1) func relation(first_block:Vector2,second_block:Vector2): var block_relation = second_block - first_block if block_relation == Vector2(-1,0): return "left" if block_relation == Vector2(1,0): return "right" if block_relation == Vector2(0,1): return "down" if block_relation == Vector2(0,-1): return "top"
Editor is loading...