スマートインフォメディアシステム特論 期末课题
用Processing写贪吃蛇脚本,有手动和自动两种模式,程序开始直接手动控制,GG一次后可以选择RESTART重新开始,或者AI MODE进入自动模式。其中AI MODE模式有两种报酬计算方法,或者两种距离算法,distance_type=1 表示曼哈顿距离, distance_type=2 表示欧拉距离。具体代码直接贴出来,放到Processing 2.XX 里应该是可以直接运行的。
int game_pause = -1;
int snake_length_max = 800;
int snake_length = 10;
int grid = 10;
int Length = 600;
int score = 0;
int count = 0;
int frame_rate = 15;
int distance_type = 1;
char snake_direction = 'L';
char snake_direction_tmp = snake_direction;
boolean food_eaten = true;
boolean stop = false;
boolean ai_flag = true;
PVector [] snake = new PVector[snake_length_max];
PVector food;
PVector [] neighbor = new PVector[4];
int interval = 100;
int button_width = 150;
int button_height = 50;
boolean rectOver1, rectOver2, rectOver3 = false;
char [] direction_array = new char[4];
void setup(){
size(600, 800);
make_background();
frameRate(frame_rate);
initial_snake();
food = new PVector(Length/4, Length/4);
direction_array[0] = 'U';
direction_array[1] = 'L';
direction_array[2] = 'D';
direction_array[3] = 'R';
for (int i=0; i<4; i++){
neighbor[i] = new PVector(0,0);
}
}
void draw(){
count++;
make_background();
draw_arrow();
draw_food();
if (ai_flag && count > 2){
ai_mode();
}
if(!stop){
switch(snake_direction) {
case 'L':
snake[0].set(snake[0].x-grid, snake[0].y);
break;
case 'R':
snake[0].set(snake[0].x+grid, snake[0].y);
break;
case 'D':
snake[0].set(snake[0].x, snake[0].y+grid);
break;
case 'U':
snake[0].set(snake[0].x, snake[0].y-grid);
break;
}
}
if (snake_direction != 'P'){
check_snake_end();
}
draw_snake();
if (snake[0].x == food.x && snake[0].y == food.y){
food_eaten = true;
snake_length++;
score+=10;
frame_rate++;
frameRate(frame_rate);
}
}
void initial_snake()
{
for (int i = snake_length-1; i >= 0 ; i--){
snake[i] = new PVector(Length/2, Length/2-i);
}
}
void draw_snake(){
if (snake_direction != 'P' && !stop){
for (int i = snake_length - 1; i>0; i--){
if (i == snake_length - 1){
snake[i] = new PVector(snake[i-1].x, snake[i-1].y);
}
else{
snake[i].set(snake[i-1].x, snake[i-1].y);
}
}
}
fill(50, 131, 168);
for(int i=0; i