Kirjautuminen

Haku

Tehtävät

Keskustelu: Projektit: Ristinollaa konetta vastaan

PetriKeckman [13.08.2023 20:13:34]

#

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.

PetriKeckman [13.08.2023 20:24:54]

#

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.

walkout_ [23.09.2023 01:01:56]

#

Mites kun Norton Security poistaa tämän .exe-tiedoston kokonaan koneelta?

Metabolix [25.09.2023 21:57:36]

#

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.

jlaire [26.09.2023 06:24:18]

#

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.

Grez [26.09.2023 10:03:53]

#

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.

walkout_ [26.09.2023 13:13:28]

#

Ei ne .exe-tiedostot mene AntiVirus-softan haaviin, jos niissä on jokin allekirjoitus, että kuka on tehnyt tiedoston.

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta