QBasic: Kółko i krzyżyki algorytm Minmax.

0

Witam, Na wstępie napisze: Nie chce, żeby ktoś mi pisał. Ja chce to zrozumieć. Więc wracając do tematu. Mam problem natury technicznej, Profesor od programowania powiedział, żebyśmy napisali program, z którym będziemy mogli grać. Pierwsze chwile i pojawiła się myśl randomizacji i tablicy jednowymiarowej. Ale niezbyt to ambitne, więc poszukałem po Google i natrafiłem na Algorytm Minmax, i przykład, którego zbytnio nierozumień w chyba C++ lub C(brak owych języków jak na razie). Pierwsze pytanie Czy jest możliwe zaimplementowanie tego algorytmu do QBasica ? Czy ktoś może mi wytłumaczyć jak ten algorytm działa ?

0

http://edu.i-lo.tarnow.pl/inf/utils/002_roz/p012.php
Masz Kółko i Krzyżyk w C++ wraz z rekurencyjnym algorytmem minimaksu - przerobisz sobie na co będziesz chciał. A komentarzy jest tyle, że można zrozumieć ogólnie o co chodzi.

0

Więc pytam się dalej Jak w Qbasicu wywołać rekurencje? Możliwe, że dużo komentarzy ale dla osoby, która nie miała styczności z C++ to dla mnie czarna magia np:
if(wygrana(t,gracz,true)) return (gracz == 'X') ? 1 : -1; If jesli coś wtedy powróć, dwa znaki równość ? znak zapytania ?
for(int i = 1; i <= 9; i++) Zwyczajowy for zwiększanie i dalej czarna magia : )

0

Z braku odpowiedzi napisałem z radomizacją, ale gdzieś w połowie zgubiłem. Czy ktoś może napisać gdzie jest błąd?

 

RANDOMIZE TIMER
CLS
SCREEN 7
'tworzenie tablicy dwuwym
DIM zofia(3, 3)

FOR i = 1 TO 3
 FOR j = 1 TO 3
  zofia(i, j) = 0
 NEXT j
NEXT i

a:
GOSUB linie
b:
GOSUB wcisnij
IF (K$ = "") THEN GOTO b
K$ = ""
GOSUB losuj
g = 0
GOTO a


END

linie:
LINE (60, 1)-(60, 180)
LINE (120, 1)-(120, 180)
LINE (1, 60)-(180, 60)
LINE (1, 120)-(180, 120)
RETURN

kolko:
CIRCLE (x, y), 20
RETURN

krzyzyk:
LINE (a, b)-(a + 40, b + 49)
LINE (a + 40, b)-(a, b + 49)
RETURN

' 0 - nic
' 1 - krzyzyk
' 2 - kolko

wcisnij:
andrzej:
K$ = INKEY$
'IF ((K$ = "Q") OR (K$ = "q") AND (zofia(1, 1) = 0)) THEN a = 10: b = 1: GOSUB krzyzyk: zofia(1, 1) = 1
'IF ((K$ = "W") OR (K$ = "w") AND (zofia(2, 1) = 0)) THEN a = 70: b = 1: GOSUB krzyzyk: zofia(2, 1) = 1
'IF ((K$ = "E") OR (K$ = "e") AND (zofia(3, 1) = 0)) THEN a = 130: b = 1: GOSUB krzyzyk: zofia(3, 1) = 1
'IF ((K$ = "A") OR (K$ = "a") AND (zofia(1, 2) = 0)) THEN a = 10: b = 65: GOSUB krzyzyk: zofia(1, 2) = 1
'IF ((K$ = "S") OR (K$ = "s") AND (zofia(2, 2) = 0)) THEN a = 70: b = 65: GOSUB krzyzyk: zofia(2, 2) = 1
'IF ((K$ = "D") OR (K$ = "d") AND (zofia(3, 2) = 0)) THEN a = 130: b = 65: GOSUB krzyzyk: zofia(3, 2) = 1
'IF ((K$ = "Z") OR (K$ = "z") AND (zofia(1, 3) = 0)) THEN a = 10: b = 125: GOSUB krzyzyk: zofia(1, 3) = 1
'IF ((K$ = "X") OR (K$ = "x") AND (zofia(2, 3) = 0)) THEN a = 70: b = 125: GOSUB krzyzyk: zofia(2, 3) = 1
'IF ((K$ = "C") OR (K$ = "c") AND (zofia(3, 3) = 0)) THEN a = 130: b = 125: GOSUB krzyzyk: zofia(3, 3) = 1

SELECT CASE K$

CASE "7"
IF (zofia(1, 1) = 0) THEN
x = 30
y = 30
GOSUB kolko
zofia(1, 1) = 2
ELSE IF zofia(1, 1) = 2 THEN r = 1
END IF

CASE "8"
IF (zofia(2, 1) = 0) THEN
x = 90
y = 30
GOSUB kolko
zofia(2, 1) = 2
ELSE IF zofia(2, 1) = 2 THEN r = 1
END IF

CASE "9"
IF (zofia(3, 1) = 0) THEN
x = 150
y = 30
GOSUB kolko
zofia(3, 1) = 2
END IF
IF zofia(3, 1) = 2 THEN r = 1

CASE "4"
IF (zofia(1, 2) = 0) THEN
x = 30
y = 90
GOSUB kolko
zofia(1, 2) = 2
END IF
IF zofia(1, 2) = 2 THEN r = 1

CASE "5"
IF (zofia(2, 2) = 0) THEN
x = 90
y = 90
GOSUB kolko
zofia(2, 2) = 2
END IF
IF zofia(2, 2) = 2 THEN r = 1

CASE "6"
IF (zofia(3, 2) = 0) THEN
x = 150
y = 90
GOSUB kolko
zofia(3, 2) = 2
END IF
IF zofia(3, 2) = 2 THEN r = 1

CASE "1"
IF (zofia(1, 3) = 0) THEN
x = 30
y = 150
GOSUB kolko
zofia(1, 3) = 2
END IF
IF zofia(1, 3) = 2 THEN r = 1

CASE "2"
IF (zofia(2, 3) = 0) THEN
x = 90
y = 150
GOSUB kolko
zofia(2, 3) = 2
END IF
IF zofia(2, 3) = 2 THEN r = 1

CASE "3"
IF (zofia(3, 3) = 0) THEN
x = 150
y = 150
GOSUB kolko
zofia(3, 3) = 2
END IF
IF zofia(3, 3) = 2 THEN r = 1
END SELECT

IF r = 1 THEN GOTO andrzej
RETURN

losuj:
h:
p = INT(RND * 8) + 1
SELECT CASE p
CASE 1
IF (zofia(1, 1) = 0) THEN
a = 10
b = 1
GOSUB krzyzyk
zofia(1, 1) = 1
ELSE
g = 1
END IF

CASE 2
IF (zofia(2, 1) = 0) THEN
a = 70
b = 1
GOSUB krzyzyk
zofia(2, 1) = 1
ELSE
g = 1
END IF

CASE 3
IF (zofia(3, 1) = 0) THEN
a = 130
b = 1
GOSUB krzyzyk
zofia(3, 1) = 1
ELSE
g = 1
END IF

CASE 4
IF (zofia(1, 2) = 0) THEN
a = 10
b = 65
GOSUB krzyzyk
zofia(1, 2) = 1
ELSE
g = 1
END IF

CASE 5
IF (zofia(2, 2) = 0) THEN
a = 70
b = 65
GOSUB krzyzyk
zofia(2, 2) = 1
ELSE
g = 1
END IF

CASE 6
IF (zofia(3, 2) = 0) THEN
a = 130
b = 65
GOSUB krzyzyk
zofia(3, 2) = 1
ELSE
g = 1
END IF

CASE 7
IF (zofia(1, 3) = 0) THEN
a = 10
b = 125
GOSUB krzyzyk
zofia(1, 3) = 1
ELSE
g = 1
END IF

CASE 8
IF (zofia(2, 3) = 0) THEN
a = 70
b = 125
GOSUB krzyzyk
zofia(2, 3) = 1
ELSE
g = 1
END IF

CASE 9
IF (zofia(3, 3) = 0) THEN
a = 130
b = 125
GOSUB krzyzyk
zofia(3, 3) = 1
ELSE
g = 1
END IF

END SELECT
IF g = 1 THEN GOTO h
RETURN
0

Taki offtopic: weź się nie męcz z QBasicem, naprawdę. Chcesz powiedzieć, że masz profesora, co nakazuje wam robić zadania w QBasicu? WTF :) Zaimplementuj choćby w Visual Basicu, jak już musi być to język Basic:
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-basic-express

1 użytkowników online, w tym zalogowanych: 0, gości: 1