void move(void){ unsigned char i; bit error=1; unsigned char j; bit havefood=0; //determien situation i=snakelen; switch(direct[i-1]){ case 1: if(snakex[i-1]==0){ situation=1; }else if(read_dot(snakex[i-1]-1,snakey[i-1])){ for(j=0;j<6;j++){ if(snakex[i-1]-1==foodx[j] && snakey[i-1]==foody[j]){ food[j]=0; snakex[snakelen]=snakex[i-1]-1; snakey[snakelen]=snakey[i-1]; direct[snakelen]=direct[snakelen-1]; snakelen++; error=0; situation=2; break; } } if (error){ situation=1; } } break; case 2: if(snakex[i-1]==15){ situation=1; }else if(read_dot(snakex[i-1]+1,snakey[i-1])){ for(j=0;j<6;j++){ if(snakex[i-1]+1==foodx[j] && snakey[i-1]==foody[j]){ food[j]=0; snakex[snakelen]=snakex[i-1]+1; snakey[snakelen]=snakey[i-1]; direct[snakelen]=direct[snakelen-1]; snakelen++; error=0; situation=2; break; } } if (error){ situation=1; } } break; case 3: if(snakey[i-1]==0){ situation=1; }else if(read_dot(snakex[i-1],snakey[i-1]-1)){ for(j=0;j<6;j++){ if(snakex[i-1]==foodx[j] && snakey[i-1]-1==foody[j]){ food[j]=0; snakex[snakelen]=snakex[i-1]; snakey[snakelen]=snakey[i-1]-1; direct[snakelen]=direct[snakelen-1]; snakelen++; error=0; situation=2; break; } } if (error){ situation=1; } } break; case 4: if(snakey[i-1]==15){ situation=1; }else if(read_dot(snakex[i-1],snakey[i-1]+1)){ for(j=0;j<6;j++){ if(snakex[i-1]==foodx[j] && snakey[i-1]+1==foody[j]){ food[j]=0; snakex[snakelen]=snakex[i-1]; snakey[snakelen]=snakey[i-1]+1; direct[snakelen]=direct[snakelen-1]; snakelen++; error=0; situation=2; break; } } if (error){ situation=1; } } break; default: break; } if(situation==0){ for(i=0;i<snakelen;i++){ switch(direct[i]){ case 1: snakex[i]-=1;break; case 2: snakex[i]+=1;break; case 3: snakey[i]-=1;break; case 4: snakey[i]+=1;break; default: break; } if(i!=snakelen-1){ direct[i]=direct[i+1]; } } }else if(situation==2){ for(i=0;i<6;i++){ if(food[i]==1){ havefood=1; situation=0; break; } } if(~havefood){ situation=3; } } }
Token* Scanner::get_token() { Token* t; if (tokens) { t = tokens->token; tokens = tokens->prev; } else { t = NULL; while (t == NULL) { fint c = get_char(); switch (c) { case EOF: depth = 0; t = new Token(Token::ACCEPT, line, column, sourceAddr()); break; case '\n': case '\r': if (depth <= 0 && !is_string_scanner()) { t = new Token(Token::ACCEPT, line, column - 1, sourceAddr() - 1); depth = 0; } break; case ' ': case '\t': case '\v': case '\b': case '\f': break; case '"': t = skip_comment(); break; case '(': depth ++; t = new Token(as_TokenType('('), line, column - 1, sourceAddr() - 1); break; case ')': depth --; t = new Token(as_TokenType(')'), line, column - 1, sourceAddr() - 1); break; case '[': depth ++; t = new Token(as_TokenType('['), line, column - 1, sourceAddr() - 1); break; case ']': depth --; t = new Token(as_TokenType(']'), line, column - 1, sourceAddr() - 1); break; case '.': t = read_dot(); break; case '\'': t = read_string(); break; case '\\': c = get_char(); if (c == '\n' || c == '\r') { // an escaped newline; ignore } else { push_char(c); c = '\\'; t = read_op(c); } break; case '{': t = new Token(Token::ANNOTATION_START, line, column - 1, sourceAddr() - 1); break; case '}': t = new Token(Token::ANNOTATION_END, line, column - 1, sourceAddr() - 1); break; default: if (is_digit(c) || c == '-') t = read_number(c); else if (is_id_alpha(c) || c == ':') t = read_name(c); else if (is_punct(c)) t = read_op(c); else t = TokenizingError("unknown character in input"); } } } if (t && PrintTokens) t->print(); return t; }