|
|
|
|
@@ -6,7 +6,7 @@
|
|
|
|
|
// Returns the bottommost empty row in col, or NVLLVS if full
|
|
|
|
|
DEFINI find_slot(b, col) VT {
|
|
|
|
|
DESIGNA ans VT NVLLVS
|
|
|
|
|
DONICVM r VT I VSQVE VII FACE {
|
|
|
|
|
DONICVM r VT I VSQVE VI FACE {
|
|
|
|
|
SI b[(r - I) * VII + col] EST NVLLVS TVNC {
|
|
|
|
|
DESIGNA ans VT r
|
|
|
|
|
}
|
|
|
|
|
@@ -16,32 +16,32 @@ DEFINI find_slot(b, col) VT {
|
|
|
|
|
|
|
|
|
|
// Returns VERITAS if player has four in a row
|
|
|
|
|
DEFINI est_victor(b, player) VT {
|
|
|
|
|
DONICVM r VT I VSQVE VII FACE {
|
|
|
|
|
DONICVM c VT I VSQVE V FACE {
|
|
|
|
|
DONICVM r VT I VSQVE VI FACE {
|
|
|
|
|
DONICVM c VT I VSQVE IV FACE {
|
|
|
|
|
DESIGNA idx VT (r - I) * VII + c
|
|
|
|
|
SI b[idx] EST player ET b[idx + I] EST player ET b[idx + II] EST player ET b[idx + III] EST player TVNC {
|
|
|
|
|
REDI(VERITAS)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
DONICVM r VT I VSQVE IV FACE {
|
|
|
|
|
DONICVM c VT I VSQVE VIII FACE {
|
|
|
|
|
DONICVM r VT I VSQVE III FACE {
|
|
|
|
|
DONICVM c VT I VSQVE VII FACE {
|
|
|
|
|
DESIGNA idx VT (r - I) * VII + c
|
|
|
|
|
SI b[idx] EST player ET b[idx + VII] EST player ET b[idx + XIV] EST player ET b[idx + XXI] EST player TVNC {
|
|
|
|
|
REDI(VERITAS)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
DONICVM r VT I VSQVE IV FACE {
|
|
|
|
|
DONICVM c VT I VSQVE V FACE {
|
|
|
|
|
DONICVM r VT I VSQVE III FACE {
|
|
|
|
|
DONICVM c VT I VSQVE IV FACE {
|
|
|
|
|
DESIGNA idx VT (r - I) * VII + c
|
|
|
|
|
SI b[idx] EST player ET b[idx + VIII] EST player ET b[idx + XVI] EST player ET b[idx + XXIV] EST player TVNC {
|
|
|
|
|
REDI(VERITAS)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
DONICVM r VT I VSQVE IV FACE {
|
|
|
|
|
DONICVM c VT IV VSQVE VIII FACE {
|
|
|
|
|
DONICVM r VT I VSQVE III FACE {
|
|
|
|
|
DONICVM c VT IV VSQVE VII FACE {
|
|
|
|
|
DESIGNA idx VT (r - I) * VII + c
|
|
|
|
|
SI b[idx] EST player ET b[idx + VI] EST player ET b[idx + XII] EST player ET b[idx + XVIII] EST player TVNC {
|
|
|
|
|
REDI(VERITAS)
|
|
|
|
|
@@ -53,9 +53,9 @@ DEFINI est_victor(b, player) VT {
|
|
|
|
|
|
|
|
|
|
DEFINI print_board(b) VT {
|
|
|
|
|
DICE("+---+---+---+---+---+---+---+")
|
|
|
|
|
DONICVM r VT I VSQVE VII FACE {
|
|
|
|
|
DONICVM r VT I VSQVE VI FACE {
|
|
|
|
|
DESIGNA line VT "| "
|
|
|
|
|
DONICVM c VT I VSQVE VIII FACE {
|
|
|
|
|
DONICVM c VT I VSQVE VII FACE {
|
|
|
|
|
DESIGNA cell VT b[(r - I) * VII + c]
|
|
|
|
|
SI cell EST I TVNC {
|
|
|
|
|
DESIGNA line VT line & "X | "
|
|
|
|
|
@@ -101,35 +101,35 @@ DEFINI score_fenestram(a, b, c, d) VT {
|
|
|
|
|
DEFINI aestima(b) VT {
|
|
|
|
|
DESIGNA score VT NVLLVS
|
|
|
|
|
// Center column preference: each AI piece in column IV is worth +1
|
|
|
|
|
DONICVM r VT I VSQVE VII FACE {
|
|
|
|
|
DONICVM r VT I VSQVE VI FACE {
|
|
|
|
|
SI b[(r - I) * VII + IV] EST II TVNC {
|
|
|
|
|
DESIGNA score VT score + I
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Horizontal windows (6 rows x 4 starting columns = 24)
|
|
|
|
|
DONICVM r VT I VSQVE VII FACE {
|
|
|
|
|
DONICVM c VT I VSQVE V FACE {
|
|
|
|
|
DONICVM r VT I VSQVE VI FACE {
|
|
|
|
|
DONICVM c VT I VSQVE IV FACE {
|
|
|
|
|
DESIGNA idx VT (r - I) * VII + c
|
|
|
|
|
DESIGNA score VT score + INVOCA score_fenestram(b[idx], b[idx + I], b[idx + II], b[idx + III])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Vertical windows (3 starting rows x 7 columns = 21)
|
|
|
|
|
DONICVM r VT I VSQVE IV FACE {
|
|
|
|
|
DONICVM c VT I VSQVE VIII FACE {
|
|
|
|
|
DONICVM r VT I VSQVE III FACE {
|
|
|
|
|
DONICVM c VT I VSQVE VII FACE {
|
|
|
|
|
DESIGNA idx VT (r - I) * VII + c
|
|
|
|
|
DESIGNA score VT score + INVOCA score_fenestram(b[idx], b[idx + VII], b[idx + XIV], b[idx + XXI])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Diagonal up-right windows (3 starting rows x 4 starting columns = 12)
|
|
|
|
|
DONICVM r VT I VSQVE IV FACE {
|
|
|
|
|
DONICVM c VT I VSQVE V FACE {
|
|
|
|
|
DONICVM r VT I VSQVE III FACE {
|
|
|
|
|
DONICVM c VT I VSQVE IV FACE {
|
|
|
|
|
DESIGNA idx VT (r - I) * VII + c
|
|
|
|
|
DESIGNA score VT score + INVOCA score_fenestram(b[idx], b[idx + VIII], b[idx + XVI], b[idx + XXIV])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Diagonal up-left windows (3 starting rows x 4 starting columns = 12)
|
|
|
|
|
DONICVM r VT I VSQVE IV FACE {
|
|
|
|
|
DONICVM c VT IV VSQVE VIII FACE {
|
|
|
|
|
DONICVM r VT I VSQVE III FACE {
|
|
|
|
|
DONICVM c VT IV VSQVE VII FACE {
|
|
|
|
|
DESIGNA idx VT (r - I) * VII + c
|
|
|
|
|
DESIGNA score VT score + INVOCA score_fenestram(b[idx], b[idx + VI], b[idx + XII], b[idx + XVIII])
|
|
|
|
|
}
|
|
|
|
|
@@ -219,8 +219,8 @@ DEFINI ai_move(b) VT {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --- Board setup ---
|
|
|
|
|
DESIGNA board VT [I VSQVE XLIII]
|
|
|
|
|
DONICVM i VT I VSQVE XLIII FACE {
|
|
|
|
|
DESIGNA board VT [I VSQVE XLII]
|
|
|
|
|
DONICVM i VT I VSQVE XLII FACE {
|
|
|
|
|
DESIGNA board[i] VT NVLLVS
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|