CONST Max=20 DECLARE FUNCTION ProxL2%(p%) DECLARE FUNCTION Proximo%() DEFINT A-Z '$DYNAMIC RANDOMIZE TIMER DIM SHARED Jogo(1 TO 9),Quadro(1 TO 9),Lance,Debug 5 FOR i=1 TO 9 Quadro(i)=0:Jogo(i)=0 NEXT Lance=0 CLS ?"Jogo da velha 2.0 - Copyright 1999 (c) WendelSoft LOCATE 3,1 ?" ³ ³ <1>-<9> = Jogar ?"ÄÅÄÅÄ = Sair ?" ³ ³ = Debug ?"ÄÅÄÅÄ = Reiniciar ?" ³ ³ FOR Lance=1 TO 9 IF Lance MOD 2 THEN'Jogador LOCATE 9,1:?"Sua vez "; DO LOCATE 1,66:IF Debug THEN ?"";ELSE ?" "; p$=UCASE$(INPUT$(1)) IF p$="S" THEN CLS:SYSTEM IF p$="R" THEN 5 IF p$="D" THEN Debug=NOT Debug:IF NOT Debug THEN VIEW ?13 TO 25:CLS:VIEW ? IF VAL(p$)>0 THEN IF Quadro(VAL(p$))=0 THEN EXIT DO END IF LOOP Onde=VAL(p$) ELSE'Computador LOCATE 9,1:?"Minha vez"; IF Lance=2 THEN Onde=ProxL2(Onde) ELSE Onde=Proximo'Function END IF END IF LOCATE 7-2*((Onde-1)\3),2*((Onde-1)MOD 3)+1 IF Lance MOD 2 THEN ?"X";ELSE ?"O"; Jogo(Lance)=Onde Quadro(Onde)=10^(Lance MOD 2)'1=Computador 10=Jogador 'Testa fileira completa FOR i=1 TO 7 STEP 3 tt=0 FOR j=i TO i+2 tt=tt+Quadro(j) NEXT IF tt=3 THEN LOCATE 12,1:?"Eu venci. GOTO Fim ELSEIF tt=30 THEN LOCATE 12,1:?"Vocˆ venceu. GOTO Fim END IF NEXT FOR i=1 TO 3 tt=0 FOR j=i TO i+6 STEP 3 tt=tt+Quadro(j) NEXT IF tt=3 THEN LOCATE 12,1:?"Eu venci. GOTO Fim ELSEIF tt=30 THEN LOCATE 12,1:?"Vocˆ venceu. GOTO Fim END IF NEXT tt1=Quadro(1)+Quadro(5)+Quadro(9) tt2=Quadro(3)+Quadro(5)+Quadro(7) IF tt1=3 OR tt2=3 THEN LOCATE 12,1:?"Eu venci. GOTO Fim ELSEIF tt1=30 OR tt2=30 THEN LOCATE 12,1:?"Vocˆ venceu. GOTO Fim END IF ' NEXT LOCATE 12,1:?"Deu velha... Fim: ?"Quer jogar novamente [S/N] ?"; DO a$=UCASE$(INPUT$(1)) LOOP UNTIL a$="S" OR a$="N ?a$ IF a$="S" THEN 5 ELSE CLS:SYSTEM FUNCTION Proximo FOR t=0 TO 1 FOR i=1 TO 7 STEP 3 tt=0 FOR j=i TO i+2 n=Quadro(j) IF n=0 THEN x=j tt=tt+n NEXT IF tt=2*10^t THEN Proximo=x:EXIT FUNCTION NEXT FOR i=1 TO 3 tt=0 FOR j=i TO i+6 STEP 3 n=Quadro(j) IF n=0 THEN x=j tt=tt+n NEXT IF tt=2*10^t THEN Proximo=x:EXIT FUNCTION NEXT tt=Quadro(1)+Quadro(5)+Quadro(9) IF tt=2*10^t THEN FOR x=1 TO 9 STEP 4 IF Quadro(x)=0 THEN Proximo=x:EXIT FUNCTION NEXT END IF tt=Quadro(3)+Quadro(5)+Quadro(7) IF tt=2*10^t THEN FOR x=3 TO 7 STEP 2 IF Quadro(x)=0 THEN Proximo=x:EXIT FUNCTION NEXT END IF NEXT DIM Lista(1 TO Max,0 TO 9) FOR i=1 TO Lance j=Jogo(i) FOR nl=1 TO Max Lista(nl,0)=2 Lista(nl,i)=j NEXT NEXT it=0 FOR w=1 TO 4 it=it+1 FOR nl=1 TO Max IF Lista(nl,0)=2 THEN FOR i=Lance TO 9 Lista(nl,i)=0 NEXT DIM Qteste(1 TO 9) FOR i=1 TO Lance-1 Qteste(Lista(nl,i))=10^(i MOD 2) NEXT a=1:b=0 FOR r=Lance TO 9 x=0 SWAP a,b FOR t=a TO b STEP b-a FOR i=1 TO 7 STEP 3 tt=0 FOR j=i TO i+2 n=Qteste(j) IF n=0 THEN x=j tt=tt+n NEXT IF tt=2*10^t THEN 1 NEXT FOR i=1 TO 3 tt=0 FOR j=i TO i+6 STEP 3 n=Qteste(j) IF n=0 THEN x=j tt=tt+n NEXT IF tt=2*10^t THEN 1 NEXT tt=Qteste(1)+Qteste(5)+Qteste(9) IF tt=2*10^t THEN FOR x=1 TO 9 STEP 4 IF Qteste(x)=0 THEN 1 NEXT END IF tt=Qteste(3)+Qteste(5)+Qteste(7) IF tt=2*10^t THEN FOR x=3 TO 7 STEP 2 IF Qteste(x)=0 THEN 1 NEXT END IF NEXT 'Linha dupla DIM ll(1 TO 9) FOR g=1 TO 9 ll(g)=g NEXT FOR g=1 TO 100-INT(RND*20) SWAP ll(INT(RND*9+1)),ll(INT(RND*9+1)) NEXT FOR t=b TO a STEP a-b FOR g=1 TO 9 px=ll(g) IF Qteste(px)=0 THEN lx=((px-1)\3)*3+1 cx=(px-1)MOD 3+1 t1=0:t2=0 FOR h=0 TO 2 t1=t1+Qteste(cx+3*h) t2=t2+Qteste(lx+h) NEXT IF t1=10^t AND t1=t2 THEN DO IF INT(RND*2)=0 THEN ft=lx+INT(RND*3) ELSE ft=cx+INT(RND*3) END IF LOOP UNTIL Qteste(ft)=0 x=ft ERASE ll GOTO 1 END IF END IF NEXT NEXT ERASE ll DO x=INT(RND*9)+1 LOOP UNTIL Qteste(x)=0 1 Qteste(x)=10^(r MOD 2) Lista(nl,r)=x IF t=a THEN Lista(nl,0)=a+1:EXIT FOR ELSE Lista(nl,0)=0 NEXT ERASE Qteste IF Debug THEN FOR k=0 TO 9 IF k=Lance THEN COLOR 15,0 ELSE COLOR 7,0 LOCATE 14+k,2*nl-1:?USING "#";Lista(nl,k); NEXT COLOR 7,0 END IF END IF NEXT rt=0 DIM Exc(1 TO 9) FOR nl=1 TO Max IF Lista(nl,0)=2 THEN Exc(Lista(nl,Lance))=-1 END IF NEXT FOR nl=1 TO Max IF Lista(nl,0)<2 THEN IF Exc(Lista(nl,Lance))THEN Lista(nl,0)=2:rt=-1 END IF NEXT ERASE Exc IF rt THEN tmi=tmi+1 IF tmi=5 THEN tmi=tmi-1 ELSE ct=-1 FOR nl=1 TO Max ct=ct AND Lista(nl,0)=2 NEXT IF NOT ct THEN w=w-1 END IF IF Debug THEN FOR nl=1 TO Max FOR k=0 TO 9 IF k=Lance THEN COLOR 15,0 ELSE COLOR 7,0 LOCATE 14+k,2*nl-1:?USING "#";Lista(nl,k); NEXT NEXT COLOR 7,0 END IF END IF NEXT tc=0 FOR i=1 TO Max tc=tc OR Lista(i,0)<2 NEXT IF NOT tc THEN DO x=INT(RND*9)+1 LOOP UNTIL Quadro(x)=0 Proximo=x EXIT FUNCTION END IF DIM Estat(1 TO 9) FOR j=1 TO 0 STEP-1 tc=0 FOR w=1 TO 9:Estat(w)=0:NEXT FOR i=1 TO Max IF Lista(i,0)=j THEN tc=-1 w=Lista(i,Lance) Estat(w)=Estat(w)+1 END IF NEXT IF tc THEN IF Debug THEN FOR t=1 TO 9 LOCATE 12+t,70:?USING "#:###";t;Estat(t); NEXT END IF M=0 FOR t=1 TO 9 IF Estat(t)>M OR(Estat(t)=M AND INT(RND*2))THEN M=Estat(t):tt=t NEXT IF Debug THEN COLOR 15,0 LOCATE 12+tt,70:?USING "#:###";tt;Estat(tt); END IF ctd=0:mc=INT(RND*Estat(tt))+1 FOR i=1 TO Max IF Lista(i,0)=j AND Lista(i,Lance)=tt THEN ctd=ctd+1 IF ctd=mc THEN EXIT FOR END IF NEXT IF Debug THEN COLOR 15,0 LOCATE 14,2*i-1:?USING "#";Lista(i,0); COLOR 7,0 END IF Proximo=Lista(i,Lance) ERASE Lista,Estat EXIT FUNCTION END IF NEXT END FUNCTION REM $STATIC FUNCTION ProxL2(p) SELECT CASE p CASE 5 n=INT(RND*4)*2+1 IF n>3 THEN n=n+2 CASE 1,3,7,9 n=5 CASE 2 n=INT(RND*4)*2+1 IF n=7 THEN n=8 CASE 4 n=INT(RND*4)+4 IF n=4 THEN n=1 CASE 6 n=INT(RND*4)+3 IF n=6 THEN n=9 CASE 8 n=INT(RND*4)*2+1 IF n=1 THEN n=2 END SELECT ProxL2=n END FUNCTION