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();
}
}