Flipping bits game: Difference between revisions
Content added Content deleted
SqrtNegInf (talk | contribs) m (→{{header|Perl}}: future-proof for 5.36, use new bitwise string operators) |
(Added FreeBasic) |
||
Line 2,460: | Line 2,460: | ||
</pre> |
</pre> |
||
=={{header| |
=={{header|FreeBASIC}}== |
||
{{trans|QB64}} |
|||
<syntaxhighlight lang="vb">Dim Shared As Integer celdasXLado, contarMovs |
|||
Dim Shared As String movsValidos, inicioBS, actualBS, objetivoBS |
|||
Sub mostrarTablero (fila As Integer, columna As Integer, junto As String, titulo As String) |
|||
Dim As Integer i, j |
|||
Locate fila - 1, columna: Print titulo |
|||
For i = 1 To celdasXLado |
|||
Locate fila, columna + 2 * (i-1) + 3: Print Mid(movsValidos, i, 1); |
|||
Next i |
|||
Print |
|||
For i = 1 To celdasXLado |
|||
Locate fila + i, columna - 1: Print Str(i); |
|||
For j = 1 To celdasXLado |
|||
Locate fila + i, columna + 2 * j: Print " " + Mid(junto, (i-1) * celdasXLado + j, 1); |
|||
Next j |
|||
Print |
|||
Next i |
|||
End Sub |
|||
Sub mostrarEstado |
|||
Color 9: mostrarTablero 2, 2, actualBS, "Current:" |
|||
Color 12: mostrarTablero 2, 2 + 2 * celdasXLado + 6, objetivoBS, " Target:" |
|||
Color 13: Print !"\n Number of moves taken so far is " + Str(contarMovs) |
|||
Color 14 |
|||
End Sub |
|||
Function Pistas() As String 'compare the currentB to targetB and suggest letter or digit or done |
|||
Dim As Integer i, j |
|||
Dim As Boolean flag = False |
|||
Dim As String r, actualBitS, objetivoBitS |
|||
For i = 1 To 2 * celdasXLado 'check cols first then rows as listed in movsValidos |
|||
r = Mid(movsValidos, i, 1) |
|||
If i <= celdasXLado Then |
|||
actualBitS = Mid(actualBS, i, 1): objetivoBitS = Mid(objetivoBS, i, 1) |
|||
If actualBitS <> objetivoBitS Then flag = False: Exit For |
|||
Else |
|||
j = i - celdasXLado |
|||
actualBitS = Mid(actualBS, (j - 1) * celdasXLado + 1, 1) |
|||
objetivoBitS = Mid(objetivoBS, (j - 1) * celdasXLado + 1, 1) |
|||
If actualBitS <> objetivoBitS Then flag = False: Exit For |
|||
End If |
|||
Next i |
|||
Pistas = Iif(flag, r, "Done?") |
|||
End Function |
|||
Sub Centrar (fila As Integer, texto As String) 'center print at fila |
|||
Locate fila, (80 - Len(texto)) / 2: Print texto; |
|||
End Sub |
|||
Sub vcls 'print the screen to file then clear it |
|||
Dim As String sc(23), scan |
|||
Dim As Integer lineas, t, final, i |
|||
For lineas = 1 To 23 |
|||
For t = 1 To 80: scan &= Chr(Screen(lineas, t)): Next t |
|||
sc(lineas) = Rtrim(scan) |
|||
scan = "" |
|||
Next lineas |
|||
For final = 23 To 1 Step -1 |
|||
If sc(final) <> "" Then Exit For |
|||
Next final |
|||
Print #3, "" |
|||
For i = 1 To final: Print #3, sc(i): Next i |
|||
Print #3, "": Print #3, String(80, "-"): Cls |
|||
End Sub |
|||
Function TeclaPulsada() As String 'just want printable characters |
|||
Dim As String KBD = "" |
|||
While Len(KBD) = 0 |
|||
KBD = Inkey |
|||
If Len(KBD) Then 'press something so respond |
|||
If Len(KBD) = 2 Or Asc(KBD) > 126 Or Asc(KBD) < 32 Then KBD = "*" |
|||
End If |
|||
Wend |
|||
Return KBD |
|||
End Function |
|||
Function inicioTablero() As String |
|||
Dim As String r |
|||
For i As Integer = 1 To celdasXLado ^ 2 |
|||
r &= Ltrim(Str(Int(Rnd * 2))) |
|||
Next i |
|||
Return r |
|||
End Function |
|||
Sub hacerMovim (moveS As String) |
|||
Dim As Uinteger ac = Asc(moveS) |
|||
Dim As Integer i, columna, fila |
|||
Dim As String bitS |
|||
If ac > 96 Then 'letter |
|||
columna = ac - 96 |
|||
For i = 1 To celdasXLado |
|||
bitS = Mid(actualBS, (i - 1) * celdasXLado + columna, 1) |
|||
Mid(actualBS, (i-1) * celdasXLado + columna, 1) = Iif(bitS = "0", "1", "0") |
|||
Next |
|||
Else 'number |
|||
fila = ac - 48 |
|||
For i = 1 To celdasXLado |
|||
bitS = Mid(actualBS, (fila-1) * celdasXLado + i, 1) |
|||
Mid(actualBS, (fila-1) * celdasXLado + i, 1) = Iif(bitS = "0", "1", "0") |
|||
Next i |
|||
End If |
|||
End Sub |
|||
Function hacerObjetivo() As String |
|||
While actualBS = inicioBS |
|||
For i As Integer = 1 To celdasXLado * celdasXLado |
|||
Dim As String mS = Mid(movsValidos, Int(Rnd * Len(movsValidos)) + 1, 1) |
|||
hacerMovim mS |
|||
Next i |
|||
Wend |
|||
Return actualBS |
|||
End Function |
|||
Sub Intro |
|||
Dim As Integer i |
|||
Dim As String inS |
|||
Close |
|||
Open "Copy Flipping Bits Game.txt" For Output As #3 |
|||
celdasXLado = 0: movsValidos = "": contarMovs = 0 |
|||
Color 9: Centrar 3, "Flipping Bits Game (with AI!) JHG 31/05/2023" |
|||
Color 5 |
|||
Centrar 5, "You will be presented with a square board marked Current and" |
|||
Centrar 6, "another marked Target. The object of the game is to match" |
|||
Centrar 7, "the Current board to Target in the least amount of moves." |
|||
Centrar 9, "To make a move, enter a letter for a column to flip or" |
|||
Centrar 10, "a digit for a fila to flip. In a flip, all 1's are" |
|||
Centrar 11, "changed to 0's and all 0's changed to 1's." |
|||
Centrar 13, "You may enter 0 or q at any time to quit." |
|||
Centrar 14, "You may press ? when prompted for move to get a hint." |
|||
Centrar 15, "You may press ! to have the program solve the puzzle." |
|||
Color 14: Print: Print |
|||
While celdasXLado < 2 Or celdasXLado > 9 |
|||
Locate Csrlin, 13: Print "Please press how many cells you want per side 2 to 9 > "; |
|||
inS = TeclaPulsada: Print inS : Sleep .4 |
|||
If inS = "0" Or inS = "q" Then End Else celdasXLado = Val(inS) |
|||
Wend |
|||
vcls |
|||
For i = 1 To celdasXLado: movsValidos = movsValidos + Chr(96 + i) : Next i |
|||
For i = 1 To celdasXLado: movsValidos = movsValidos + Ltrim(Str(i)): Next i |
|||
inicioBS = inicioTablero |
|||
actualBS = inicioBS |
|||
objetivoBS = hacerObjetivo |
|||
actualBS = inicioBS |
|||
End Sub |
|||
Sub MenuPrincipal |
|||
Dim As String SiNo, mS, mvS |
|||
Dim As Boolean mostrarSolucion = False, salir = False |
|||
Do |
|||
mostrarEstado |
|||
If actualBS = objetivoBS Then 'game done! |
|||
Print !"\n Congratulations, done in"; contarMovs; " moves." |
|||
Print !"\n Press y for yes, if you want to start over > "; |
|||
SiNo = TeclaPulsada: Print SiNo: Sleep .4: vcls |
|||
If SiNo = "y" Then Intro Else salir = True |
|||
Else 'get next move |
|||
mS = " " |
|||
While Instr(movsValidos, mS) = 0 |
|||
Print !"\n Press a lettered column or a numbered fila to flip (or 0,q,?,!) > "; |
|||
mS = TeclaPulsada: Print mS: Sleep .4 |
|||
If mS = "!" Then |
|||
mostrarSolucion = True: mS = " ": Exit While |
|||
Elseif mS = "?" Then mS = " ": Centrar Csrlin, "Hint: " + Pistas |
|||
Elseif mS = "0" Or mS = "q" Then vcls: Close: End |
|||
Elseif mS = "" Then mS = " " |
|||
End If |
|||
Wend |
|||
If mostrarSolucion Then 'run the solution from hints function |
|||
mostrarSolucion = False: mvS = Pistas |
|||
Centrar Csrlin + 1, "For the next move, the AI has chosen: " + mvS |
|||
Centrar Csrlin + 1, "Running the solution with 4 sec screen sleeps..." |
|||
Sleep 4: vcls |
|||
While mvS <> "Done?" |
|||
contarMovs += 1 |
|||
hacerMovim mvS |
|||
mostrarEstado |
|||
mvS = Pistas |
|||
Centrar Csrlin + 1, "For the next move, the AI has chosen: " + mvS |
|||
Centrar Csrlin + 1, "Running the solution with 4 sec screen sleeps..." |
|||
Sleep 4: vcls |
|||
Wend |
|||
mostrarEstado |
|||
Centrar Csrlin + 1, "Done! Current board matches Target" |
|||
Centrar Csrlin + 1, "Press y for yes, if you want to start over: > " |
|||
SiNo = TeclaPulsada: Print SiNo: Sleep .4: vcls |
|||
If SiNo = "y" Then Intro Else salir = True |
|||
Else |
|||
vcls |
|||
contarMovs += 1 |
|||
hacerMovim mS |
|||
End If |
|||
End If |
|||
Loop Until salir |
|||
Close |
|||
End Sub |
|||
'--- Programa Principal --- |
|||
Randomize Timer |
|||
Intro |
|||
MenuPrincipal |
|||
End |
|||
'--------------------------</syntaxhighlight> |
|||
{{out}} |
|||
<pre>Similar to QB64 entry.</pre> |
|||
=={{header|Go}}== |
|||
<syntaxhighlight lang="go">package main |
<syntaxhighlight lang="go">package main |
||