View in color | License | Download script | History | Other scripts by: crazyaxe |
21-Jan 17:01 UTC
[0.06] 24.181k
[0.06] 24.181k
supermastermind.rrebol[ title: "Supermastermind"
Author: "Massimiliano Vessi"
Email: %maxint--tiscali--it
Date: 23-11-2011
version: 2.0.5
file: %supermastermind.r
Purpose: "The old clasic game Mastermind"
;following data are for www.rebol.org library
;you can find a lot of rebol script there
library: [
level: 'beginner
platform: 'all
type: [tutorial game ]
domain: [ vid gui]
tested-under: [windows linux]
support: none
license: [gpl]
see-also: none
]
]
;load configuration settings
either exists? %.supermastermind.conf [
configuration: do load %.supermastermind.conf
] [
configuration: make object! [
hi-score_hard: copy [ ]
hi-score_easy: copy [ ]
hystory_b: [backdrop sienna across tabs 100 ] ;the history block
hyst_offset: 0x0 ; the history layout offset
difficulty: "Easy"
secret: copy [] ;the secret code
playing: false
counter: 0
]
]
;loading image
either exists? %.supermastermind.png [ foto: load %.supermastermind.png ] [
either ( error? [ foto: load http://www.maxvessi.net/rebsite/supermastermind.png] ) [ foto: logo.gif ] [
foto: load http://www.maxvessi.net/rebsite/supermastermind.png
save/png %.supermastermind.png foto
]
]
colors: [ blue red black maroon green magenta orange white ]
random/seed now
saveall: does [ save %.supermastermind.conf configuration ]
;secret code creation function, used for a new game
create_code: does [
secret: copy []
either configuration/difficulty = "Easy" [ secret: copy/part random colors 5 ] [
for i 1 5 1 [
append secret ( copy/part random colors 1 )
]
]
configuration/secret: secret
saveall
]
either (configuration/secret = [] ) [ create_code] [ secret: configuration/secret ]
;color convertion functions
convert: func [ text ] [
if text = "blue" [return 0.0.255]
if text = "red" [return 255.0.0]
if text = "black" [return 0.0.0]
if text = "maroon" [return 128.0.0]
if text = "green" [return 0.255.0]
if text = "magenta" [return 255.0.255]
if text = "orange" [return 255.150.10]
if text = "white" [return 255.255.255]
]
riconvert: func [ text ] [
if text = 0.0.255 [return "blue" ]
if text = 255.0.0 [return "red"]
if text = 0.0.0 [return "black"]
if text = 128.0.0 [return "maroon" ]
if text = 0.255.0 [return "green" ]
if text = 255.0.255 [return "magenta"]
if text = 255.150.10 [return "orange"]
if text = 255.255.255 [return "white" ]
]
;layouts
secret_lay: layout reduce [
'backdrop 'sienna
'across
'box 100x30 secret/1 (to-string secret/1)
'box 100x30 secret/2 (to-string secret/2)
'box 100x30 secret/3 (to-string secret/3)
'box 100x30 secret/4 (to-string secret/4)
'box 100x30 secret/5 (to-string secret/5)
]
secret_lay/offset: 0x0
hidden_lay: layout [
backdrop sienna
h1 brown configuration/difficulty
at 199x0
box 300x50 brown font [ size: 24 color: sienna] "? ? ? ? ?"
]
hidden_lay/offset: 0x0
lost_lay: layout [
across
backdrop sienna
title yellow "YOU LOST!"
return
text italic "Sorry, maybe next time you'll be more lucky!"
button "New game" [ configuration/playing: false
create_start
]
return
image foto
]
lost_lay/offset: 0x0
win_lay: layout [
across
backdrop sienna
title yellow "YOU WIN!"
return
text italic "Congratulation!"
button "New game" [
configuration/playing: false
create_start
]
return
image foto
]
win_lay/offset: 0x0
;check colors
check_col: func [blocco] [
youwin: false
blocco2: copy blocco
configuration/counter: configuration/counter + 1
solve_b: copy [ ]
append configuration/hystory_b [ return text white]
append configuration/hystory_b to-string configuration/counter
blocco_secret: reduce secret
blocco_secret2: copy blocco_secret
;black
foreach item blocco_secret [
either item = (first blocco) [
append solve_b "b"
remove blocco
remove blocco_secret2
] [ blocco: next blocco
blocco_secret2: next blocco_secret2
]
]
;now it puts all the black pegs, if there are 5 pegs, the user won
if (length? solve_b) = 5 [ youwin: true ]
;white
blocco: head blocco
blocco_secret2: head blocco_secret2
foreach item blocco [
if find blocco_secret2 item [
remove find blocco_secret2 item
append solve_b "w"
]
]
foreach item solve_b [
if item = "b" [ append configuration/hystory_b [bbutton 20x20 0.0.0] ]
if item = "w" [ append configuration/hystory_b [bbutton 20x20 255.255.255] ]
]
if (length? solve_b) < 5 [
pads: 5 - (length? solve_b)
for i 1 pads 1 [ append configuration/hystory_b [pad 20] ]
]
append configuration/hystory_b reduce [ 'tab 'box 50x30 blocco2/1 'box 50x30 blocco2/2 'box 50x30 blocco2/3 'box 50x30 blocco2/4 'box 50x30 blocco2/5 ]
either configuration/counter > 10 [
configuration/hyst_offset: configuration/hyst_offset - 0x38
hystory/pane: layout/offset configuration/hystory_b configuration/hyst_offset
] [
hystory/pane: layout/offset configuration/hystory_b 0x0
]
show hystory
if youwin [
configuration/playing: false
hystory/pane: win_lay
code/pane: secret_lay
show [ code hystory ]
if configuration/difficulty = "Easy" [ append/only configuration/hi-score_easy reduce [configuration/counter " " (request-text/title "Insert your name:") ] ]
if configuration/difficulty = "Hard" [ append/only configuration/hi-score_hard reduce [configuration/counter " " (request-text/title "Insert your name:") ]]
]
saveall
]
scroll-panel-vert: func [pnl bar][
pnl/pane/offset/y: negate bar/data *
(max 0 pnl/pane/size/y - pnl/size/y)
show pnl
]
;start_layout
start_lay: [
across
backdrop sienna
title yellow {Try to guess the secret combination}
return
]
either configuration/playing [
append start_lay [
text reform [ "Your current game: move " configuration/counter ", difficulty" configuration/difficulty]
return
text italic "What do you want to do?"
button "Resume game" [
hystory/pane: layout/offset
configuration/hystory_b configuration/hyst_offset
show hystory
]
button 100x35 "Star a new game" [create_start]
return
image foto
]
] [
append start_lay [
text {A new combination is ready, difficulty:}
cc: choice "Easy" "Hard" [ configuration/difficulty: value create_start]
do [cc/text: configuration/difficulty show cc]
return
text "You can start to play, just make your combination and press TRY."
return
image foto
]
configuration/hystory_b: [
backdrop sienna
across
tabs 100
style bbutton box effect [oval] edge [color: sienna]
style box box effect [oval] edge [color: sienna]
]
configuration/hyst_offset: 0x0
configuration/counter: 0
configuration/playing: true
]
start_lay: layout/offset start_lay 0x0
create_start: does [
start_lay: layout/offset [
across
backdrop sienna
title yellow {Try to guess the secret combination}
return
text {A new combination is ready, difficulty:}
cc: choice "Easy" "Hard" [ configuration/difficulty: value create_start]
do [cc/text: configuration/difficulty show cc]
return
text "You can start to play, , just make your combination and press TRY."
return
image foto
] 0x0
if value? 'difficulty [ difficulty/text: configuration/difficulty show difficulty ]
create_code
configuration/counter: 0
configuration/hystory_b: copy [backdrop sienna across tabs 100 ]
configuration/hyst_offset: 0x0
hystory/pane: start_lay
hidden_lay: layout [
backdrop sienna
h1 brown configuration/difficulty
at 199x0
box 300x50 brown font [ size: 24 color: sienna] "? ? ? ? ?"
]
secret_lay: layout reduce [
'backdrop 'sienna
'across
'box 100x30 secret/1 (to-string secret/1)
'box 100x30 secret/2 (to-string secret/2)
'box 100x30 secret/3 (to-string secret/3)
'box 100x30 secret/4 (to-string secret/4)
'box 100x30 secret/5 (to-string secret/5)
]
secret_lay/offset: 0x0
hidden_lay/offset: 0x0
code/pane: hidden_lay
show [hystory code]
configuration/playing: true
saveall
]
view/title layout [
backdrop sienna
title "Super Mastermind"
code: box 600x50
do [ code/pane: hidden_lay]
across
hystory: box 600x400 frame brown
do [ hystory/pane: start_lay ]
s1: scroller 16x400 0.99 brown brown [scroll-panel-vert hystory s1]
return
b1: box 100x30 blue "blue"
b2: box 100x30 blue "blue"
b3: box 100x30 blue "blue"
b4: box 100x30 blue "blue"
b5: box 100x30 blue "blue"
return
choice "blue" "red" "black" "maroon" "green" "magenta" "orange" "white" [b1/text: value b1/color: convert value show b1]
choice "blue" "red" "black" "maroon" "green" "magenta" "orange" "white" [b2/text: value b2/color: convert value show b2]
choice "blue" "red" "black" "maroon" "green" "magenta" "orange" "white" [b3/text: value b3/color: convert value show b3]
choice "blue" "red" "black" "maroon" "green" "magenta" "orange" "white" [b4/text: value b4/color: convert value show b4]
choice "blue" "red" "black" "maroon" "green" "magenta" "orange" "white" [b5/text: value b5/color: convert value show b5]
at 560x525 button 60x65 "TRY" [ if configuration/playing [check_col reduce [b1/color b2/color b3/color b4/color b5/color] ] ]
return
box black 600x2
return
button "Help" [
view/new/title layout [
title "Help"
h2 "Rules"
text 500 { The codebreaker (you) tries to guess the pattern, in both order and color. Each guess is made by placing a row of code pegs on the decoding board. Once placed, the codemaker (PC) provides feedback by placing from zero to four key pegs in the small holes of the row with the guess. A colored or black key peg is placed for each code peg from the guess which is correct in both color and position. A white peg indicates the existence of a correct color peg placed in the wrong position. If there are duplicate colours in the guess, they cannot all be awarded a key peg unless they correspond to the same number of duplicate colours in the hidden code. For example, if the hidden code is white-white-black-black and the player guesses white-white-white-black, the codemaker will award two colored pegs for the two correct whites, nothing for the third white as there is not a third white in the code, and a colored peg for the black. No indication is given of the fact that the code also includes a second black.}
h2 "No combination (easy)"
text 500 {This game type has the following rule: sercet code hasn't color repetitions. All five colors are totally different. A skilled player wins in less 12 moves. However you can try any number of time.}
h2 "Combination (hard)"
text 500 {This game type allows ripetitions in secret code (like "blue" "blue" "blue", it's harder to win. A skilled player should win this game less than 16 moves. However you can try any number of time.}
h3 "Author"
text 500 rejoin ["Made by Massimiliano Vessi, you can contact me write to: " "maxint" "@" "tiscali.it" ]
] "Help Supermastermind"
]
button "High scores" [
backhs: reduce [ 'gradient 1x1 random white random white random white]
sort configuration/hi-score_hard
sort configuration/hi-score_easy
view/new/title layout [
backdrop effect backhs
h2 "HIGH SCORE HARD GAME"
text-list data configuration/hi-score_hard
return
box black 1x230
return
vh2"HIGH SCORE EASY GAME"
text-list data configuration/hi-score_easy
] "Supermastermind High-Score"
]
text "Difficulty:"
difficulty: choice "Easy" "Hard" [ configuration/difficulty: value ]
do [ difficulty/text: configuration/difficulty]
button "New game" [
if (confirm "Are you sure that you want to interrupt this game and start a new one?" ) [
configuration/playing: false
create_start
]
]
button red "Surrender" [
if configuration/playing [
if (confirm "Are you sure you want to surrender and loose the game?" ) [
configuration/playing: false
hystory/pane: lost_lay
code/pane: secret_lay
show [ hystory code ]
]
saveall
]
]
return
text reform [ "Version:" system/script/header/version ]
] "Supermastermind" Notes
|