Rebol3 Code Examplex
Flipping bits game
Rebol [
title: "Rosetta code: Flipping bits game"
file: %Flipping_bits_game.r3
url: https://rosettacode.org/wiki/Flipping_bits_game
]
random/seed now/time/precise ;; seed RNG
flipping-bits: function/with [
"Flipping bits game"
size [pair!] "Board size"
][
init size
;;--- main loop -----------------------------------------------------
target: copy/deep board ;; save target
random kValid
repeat pos 3 [flip pick kValid pos] ;; scramble 3 moves
run: -1
forever [
++ run
prin "^[[2J^[[H"
print as-green "TARGET BOARD"
print [header " " header]
repeat row kRows [
b1: append clear "" row
b2: append clear "" row
repeat col kCols [
append b1 ajoin [SP target/:row/:col]
append b2 ajoin [SP board/:row/:col]
]
print [b1 " " b2]
]
if board = target [
print as-green "^/BINGO!"
print ["You solved it in" as-green run "move(s)!"]
halt
]
print ["^/Moves:" as-green run]
until [
prin "^MEnter row number or column letter: "
prin inp: wait-key
unless char? inp [exit]
find kValid inp: uppercase inp
]
flip inp
]
][
board: target: header: kValid: _ kCols: kRows: 3
init: func [size /local letter] [
kRows: max 3 min 9 to integer! size/x
kCols: max 3 min 9 to integer! size/y
board: array/initial 10 [] ;; build kRows empty rows
kValid: copy "1A" ;; validation chars e.g. "321ABC"
loop (kRows - 1) [insert kValid (first kValid) + 1]
loop (kCols - 1) [append kValid (last kValid) + 1]
repeat row kRows [ ;; fill board with random 0/1
loop kCols [append board/:row -1 + random 2]
]
letter: #"A" header: copy " "
loop kCols [append header ajoin [SP letter] letter: letter + 1]
]
;;--- helpers -------------------------------------------------------
xorme: func ['val] [ ;; flip a board cell in place
set val 1 xor get val
]
flip: function [what [char!]] [ ;; flip a full row or column
row: -48 + what
either row <= kRows [
repeat col kCols [xorme board/:row/:col]
][ repeat row2 kRows [xorme board/:row2/(row - 16)] ]
]
]
flipping-bits 3x3 ;-- Start game!Output:
TARGET BOARD
A B C A B C
1 0 1 1 1 0 0 0
2 0 0 0 2 0 1 1
3 1 0 0 3 0 0 0
Moves: 0
Enter row number or column letter: a
TARGET BOARD
A B C A B C
1 0 1 1 1 1 0 0
2 0 0 0 2 1 1 1
3 1 0 0 3 1 0 0
Moves: 1
Enter row number or column letter: 2
TARGET BOARD
A B C A B C
1 0 1 1 1 1 0 0
2 0 0 0 2 0 0 0
3 1 0 0 3 1 0 0
Moves: 2
Enter row number or column letter: 1
TARGET BOARD
A B C A B C
1 0 1 1 1 0 1 1
2 0 0 0 2 0 0 0
3 1 0 0 3 1 0 0
BINGO!
You solved it in 3 move(s)!