Voita (tai jos olet pöhkö, niin häviä!) pöhkö 'tekoäly' ristinollassa. Peli on kehitteillä, mutta voi sillä jo hyvin pelailla. Pelissä on graafinen käyttöliittymä :) Ei tarvitse kuin hiirellä näpytellä.
Windows exe: https://www.petke.info/ristinolla.exe
Pelissä on itse vielä tarkkailtava saako kone vaiko pelaaja viisi peräkkäistä...
Peli loppuu kun painelee näppäintä ja hiiren vasenta 'sopivasti'.
Program Ristinolla;
uses crt,winmouse,graph,wincrt,math,sysutils;
CONST
koko=40;
voittokoko=5;
TYPE
Pelilauta=array[1..koko, 1..koko] OF Char;
VAR
lauta: Pelilauta;
dx:LongInt;
dy:LongInt;
gd,gm: integer;
error : SmallInt;
eka:BOOLEAN;
PROCEDURE AlustaLauta;
VAR
i, j: Integer;
BEGIN
FOR i := 1 to koko DO
FOR j := 1 to koko DO
lauta[i, j] := ' ';
END;
PROCEDURE Alusta;
BEGIN
AlustaLauta;
WRITELN('heippa');
gd := D4bit;
gm := m800x600;
initgraph(gd,gm,'');
error := graphResult;
if (error <> grOk) Then
begin
writeln('800x600x16 is not supported!');
halt(1);
end;
dx:=Trunc(800/koko);
dy:=Trunc(600/koko);
setTextStyle(defaultFont,horizDir,2);
initmouse;
eka:=TRUE;
END;
FUNCTION OnkoLaillinenSiirto(i,j:LongInt):BOOLEAN;
BEGIN
OnkoLaillinenSiirto:=(lauta[i,j]=' '); //Jos lauta on tyhjä, niin siihen voi laittaa merkin
END;
FUNCTION VoittaakoTietokone: Boolean;
VAR
i, j: Integer;
BEGIN
// Tarkistetaan vaakasuorat voitot
FOR i := 1 TO koko DO
FOR j := 1 TO (koko - voittoKoko + 1) DO
if (lauta[i, j] = 'O') and OnkoLaillinenSiirto(i, j) then
Exit(True);
// Tarkistetaan pystysuorat voitot
FOR i := 1 TO (koko - voittoKoko + 1) DO
FOR j := 1 TO koko DO
if (lauta[i, j] = 'O') and OnkoLaillinenSiirto(i, j) then
Exit(True);
// Tarkistetaan pääviistot
FOR i := 1 TO (koko - voittoKoko + 1) DO
FOR j := 1 TO (koko - voittoKoko + 1) DO
if (lauta[i, j] = 'O') and OnkoLaillinenSiirto(i, j) then
Exit(True);
// Tarkistetaan sivuviistot
FOR i := 1 TO (koko - voittoKoko + 1) DO
FOR j := voittoKoko TO koko DO
BEGIN
if (lauta[i, j] = 'O') and OnkoLaillinenSiirto(i, j) then
Exit(True);
END;
VoittaakoTietokone := False;
END;
FUNCTION Viereinen(i,j:LongInt):BOOLEAN;
VAR apu:BOOLEAN;
BEGIN
apu:=FALSE;
IF lauta[i-1,j]='O' THEN apu:=TRUE;
IF lauta[i-1,j-1]='O' THEN apu:=TRUE;
IF lauta[i,j-1]='O' THEN apu:=TRUE;
IF lauta[i+1,j-1]='O' THEN apu:=TRUE;
IF lauta[i+1,j]='O' THEN apu:=TRUE;
IF lauta[i+1,j+1]='O' THEN apu:=TRUE;
IF lauta[i,j+1]='O' THEN apu:=TRUE;
IF lauta[i-1,j+1]='O' THEN apu:=TRUE;
Viereinen:=apu;
END;
PROCEDURE TietokoneenSiirto;
VAR
i,j:Integer;
BEGIN
FOR i:=1 TO koko DO
BEGIN
FOR j:=1 TO koko DO
BEGIN
IF OnkoLaillinenSiirto(i,j) THEN
BEGIN
lauta[i, j] := 'O';
IF VoittaakoTietokone THEN
Exit; // Jos voitto on mahdollinen, valitaan tämä siirto
// Peruutetaan siirto ja jatketaan etsintää
lauta[i, j] := ' ';
END;
END;
// Jos voittoa ei ole mahdollinen, valitaan siirto jonkin oman merkin vierestä
END;
REPEAT
i := Random(koko) + 1;
j := Random(koko) + 1;
UNTIL OnkoLaillinenSiirto(i, j) AND Viereinen(i,j) OR eka;
lauta[i, j] := 'O';
eka:=FALSE;
END;
PROCEDURE Pelaajansiirto;
VAR
X,Y,state: LongInt;
i,j:LongInt;
BEGIN
REPEAT
repeat until lpressed;
getmousestate(X,Y,state);
i:=(X div dx)+1;
j:=(Y div dy)+1;
UNTIL OnkoLaillinenSiirto(i,j);
lauta[i,j]:='X';
END;
PROCEDURE Tulostalauta;
VAR
i,j:LongInt;
x,y: LongInt;
BEGIN
SetColor(white);
FOR i:=1 TO koko DO
BEGIN
x:=(i-1)*dx;
FOR j:=1 TO koko DO
BEGIN
y:=(j-1)*dy;
line(x,y,x+dx,y);
line(x,y ,x,y+dy);
CASE lauta[i,j] OF
'X': outTextXY(x,y,'X');
'O': outTextXY(x,y,'O');
END;
END;
END;
END;
BEGIN
Alusta;
REPEAT;
TietokoneenSiirto;
Tulostalauta;
Pelaajansiirto;
repeat until not lpressed;
UNTIL keypressed;
CloseGraph;
END.Jaahas! Ohjelmassa on bugi: jos kone ei voi laittaa merkkiään minkään aikaisemman merkin viereen, se jättää siirtonsa tekemättä... Tämä tullaan korjaamaan myöhemmissä versioissa.
EDIT: Ei tuo bugi olekaan, sillä tuollaista tilannetta ei pysty tekemään vaikka yrittäisi.
Mites kun Norton Security poistaa tämän .exe-tiedoston kokonaan koneelta?
walkout_ kirjoitti:
Mites kun Norton Security poistaa tämän .exe-tiedoston kokonaan koneelta?
On nykyään aika yleinen ongelma, että itse käännetyt ohjelmat tulkitaan epäilyttäviksi jollain heuristiikalla. Ei vaadi edes koodilta mitään ihmeitä, melkein mikä tahansa ohjelma voi jäädä haaviin.
Mulla oli muutama vuosi sitten semmonen ongelma, että "gcc main.c":n jälkeen Windowsin oma antivirus poisti generoidun exen saman tien. Ratkesi sillä, että whitelistasin devauskansioni. Ehkä Nortoninkin saa jotenkin pitämään näppinsä erossa sieltä, missä sitä ei kaivata.
Hauskin oma kokemukseni noista antivirussoftien heuristiikoista on todella pitkän ajan takaa, kun antivirussofta (F-Secure) kaatui aina, kun meni kansioon, jossa oli muille kuin x86 prosessoreille käännettyjä binääreitä. Piti sitten whitelistata se.
Ei ne .exe-tiedostot mene AntiVirus-softan haaviin, jos niissä on jokin allekirjoitus, että kuka on tehnyt tiedoston.
Aihe on jo aika vanha, joten et voi enää vastata siihen.