Пример #1
0
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;
		}
	}
}
Пример #2
0
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;
}