Skip to content

Instantly share code, notes, and snippets.

@edvardm
Last active August 3, 2016 08:57
Show Gist options
  • Save edvardm/695bef8e001643ffc61ed282dcc0955a to your computer and use it in GitHub Desktop.
Save edvardm/695bef8e001643ffc61ed282dcc0955a to your computer and use it in GitHub Desktop.
sanapeli.rb
# 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