Last active
August 3, 2016 08:57
-
-
Save edvardm/695bef8e001643ffc61ed282dcc0955a to your computer and use it in GitHub Desktop.
sanapeli.rb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Toiminnallisuus tiiviisti: peli lukee komentoriviltä käytettyjen kirjainten | |
# määrän. Ohjelma arpoo sen jälkeen näin monta kirjainta. Pelaaja muodostaa | |
# näistä mahdollisimman monta sanaa syöttämällä joko sanan tai pisteen (.) jos | |
# ei enää kykene muodostamaan sanoja. | |
# | |
# Sana pisteytetään vain, jos se löytyy annetusta sanastosta. Pisteyttämiseen on | |
# annettu valmiiksi oma funktio. Sanan pitää olla ainakin 2 merkkiä pitkä, jotta | |
# siitä saa pisteitä. | |
# | |
# Kunkin syötteen jälkeen ja lopetettaessa peli kertoo, montako pistettä | |
# käyttäjällä on. | |
require 'set' | |
SANATIEDOSTO = '/usr/share/dict/words' # vaihda jos windows | |
KÄDEN_KOKO = (ARGV[0] || 7).to_i | |
VOKAALIT = 'aeiouy'.chars # oikeastaan y on sekä vokaali että konsonantti | |
KONSONANTIT = ('a'..'z').reject { |mrk| VOKAALIT.include?(mrk) } | |
# voit käyttää tätä sanojen lukemiseen tiedostosta. Se palauttaa | |
# joukon, missä on kaikki tiedoston sanat pienillä kirjaimilla. | |
def lue_sanasto(tiedosto) | |
sanat = File.readlines(tiedosto).map { |w| w.strip.downcase } | |
puts "Ladattu #{sanat.size} sanaa" | |
Set.new(sanat) # taulukkokin käy, mutta setistä on nopeampi hakea | |
end | |
def jakauma_hash | |
Hash.new { |h, k| h[k] = 0 } | |
end | |
# https://www.wikiwand.com/en/Scrabble_letter_distributions | |
KIRJAIN_PISTEET = { | |
'aeiounrtls' => 1, | |
'dg' => 2, | |
'bcmp' => 3, | |
'fhvwy' => 4, | |
'k' => 5, | |
'jx' => 8, | |
'qz' => 10 | |
} | |
def kirjain_pisteet(kirjain) | |
pari = KIRJAIN_PISTEET.detect { |mjono, pisteet| mjono.include?(kirjain) } | |
if pari | |
pari[-1] | |
else | |
warn "kirjainta #{kirjain} ei löytynyt pistetaulukosta!" | |
0 | |
end | |
end | |
def pelisilmukka(sanasto, pelaajan_käsi) | |
loop do | |
print "Kirjoita sana tai pelkkä piste (.) lopettaaksesi, ja paina Enter: " | |
syöte = STDIN.gets.strip | |
break if syöte == '.' | |
end | |
end | |
# testejä | |
# fail 'pistelasku' unless scrabble_pisteet('car') == 5 | |
### Pääohjelma | |
sanasto = lue_sanasto(SANATIEDOSTO) | |
kirjaimet = jaa_kirjaimet # aloita vaikka tästä | |
alku = Time.now | |
pisteet = pelisilmukka(sanasto, kirjaimet) | |
kulunut_aika = Time.now - alku | |
puts "Sait #{pisteet} pistettä, aikasi oli #{kulunut_aika}s" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment