Source Code (Use browser search to find items of interest.)

Class Index

ksnake'CompuSnake (./kdegames/ksnake/snake.h:56)

class CompuSnake : public Snake
{
public:
    CompuSnake(Board *b, PixServer *p);
    void nextMove();
private:
    bool init();
    void removeSamy();
    bool findEmpty(int i, int it);
    bool permission();
    void out();
};


ksnake'CompuSnake::CompuSnake() (./kdegames/ksnake/snake.cpp:142)

CompuSnake::CompuSnake( Board *b, PixServer *p)
    : Snake( b, p, NORTH_GATE, CompuSnakePix )
{
    init();
}


ksnake'CompuSnake::init() (./kdegames/ksnake/snake.cpp:148)

bool CompuSnake::init()
{
    if( !list.isEmpty()) {
	list.clear();
    }

    int index = NORTH_GATE;
    int length = 12;
    grow = 0;
    hold = OUT;

    if ( !board->isBrick(gate) ) return FALSE;

    Samy *sam;
    for ( int x = 0; x < length; x++) {
	board->set(index, snake);
	sam = new Samy;
	sam->direction = S;
	sam->index = index;
	sam->pixmap = (x == 0 ? HeadDown : BodyVt);
	list.append(sam);
	index = -1;
    }
    return TRUE;
}


ksnake'CompuSnake::permission() (./kdegames/ksnake/snake.cpp:174)

bool CompuSnake::permission()
{
    if( list.isEmpty() ){

	if ( hold != OUT) {
	    emit killed();
	    hold = OUT;
	}

	if(board->isBrick(gate)){
	    static int  skip = 12;
	    if (skip < 12) {
		skip++;
		return FALSE;
	    } else {
		skip = 0;
		return init();
	    }
	}
	else return FALSE;
    }
    else return TRUE;
}


ksnake'CompuSnake::nextMove() (./kdegames/ksnake/snake.cpp:198)

void CompuSnake::nextMove()
{
    if (!permission()) return;

    Samy *sam = list.first();
    int  index = sam->index;
    int  dir = sam->direction;
    static bool varies = FALSE;


    bool found = FALSE;

	for ( int x = 0; x < 4 ; x++) {
	    int next = board->getNext(x, sam->index);
	    if (board->isApple(next)){
		index = next;
		dir = x;
		found = TRUE;
		grow+=6;
		emit score(FALSE, index);
		break;
	    }
	}

    if(!found)
	for ( int x = 0; x < 4 ; x++) {
	    int sq = emptySq[sam->direction][x];
	    if (varies && (x > 0 && x < 3))
		sq = opposite[sq];
	    int next = board->getNext(sq, sam->index);
	    if (findEmpty(next, x)) {
		index = next;
		dir = sq;
		found = TRUE;
		break;
	    }
	}
    varies = !varies;

    if(!found) {
	hold = list.last()->index;
	if (board->isSnake(hold)) board->set(hold, empty);
	removeSamy();
    }
    else
	if(growing())
	    appendSamy();
	else
	    if (!growing() && found) {
		hold = list.last()->index;
		if (board->isSnake(hold)) board->set(hold, empty);
		updateSamy();
	    }

    if( !list.isEmpty()) {
	board->set(index, snake);
	reset(index, dir);
    }

    if ( hold == gate)
	out();
}


ksnake'CompuSnake::findEmpty() (./kdegames/ksnake/snake.cpp:261)

bool CompuSnake::findEmpty(int i, int it)
{
    bool found = FALSE;
    bool change = FALSE;
    static int s_random =  random.getLong(BoardWidth/2);
    static int moves  = 0;

    if (moves > s_random) {
	s_random =  random.getLong(BoardWidth/2);
	moves  = 0;
	change = TRUE;
    }

    found =  (   (  board->isEmpty(i) && it > 0)
		 || (  board->isEmpty(i) && !change && it == 0) );

    moves++;
    change = FALSE;
    return found;
}


ksnake'CompuSnake::removeSamy() (./kdegames/ksnake/snake.cpp:282)

void CompuSnake::removeSamy()
{
    list.remove();
    grow = 0;
}


ksnake'CompuSnake::out() (./kdegames/ksnake/snake.cpp:288)

void CompuSnake::out()
{
    emit closeGate( gate );

    if( list.isEmpty() )
	return;

    if(list.first()->index == OUT) {
	emit restartTimer();
	list.clear();
    }
}