|
# This program allows you to play the famed high_low card game you know and love
|
|
# only now with a GUI!
|
|
# A card is dealt from a deck of cards.
|
|
# You have to predict whether the next card will be higher or lower
|
|
|
|
require 'Qt4'
|
|
require_relative 'deck.rb'
|
|
|
|
class HighLowField < Qt::Widget
|
|
signals 'averageScoreChanged(float)', 'scoreChanged(int)'
|
|
slots 'lowPressed()', 'highPressed()', 'startClicked()'
|
|
|
|
def initialize(parent = nil)
|
|
super
|
|
|
|
setPalette(Qt::Palette.new(Qt::Color.new(250,250,200)))
|
|
|
|
@current_card = nil
|
|
@next_card = nil
|
|
@playing = false # Checks if a game is currently playing setAutoFillBackground(true)
|
|
@total_score = 0
|
|
@average_score = 0.0
|
|
@games_played = 0
|
|
@message = nil # Message sent to the player
|
|
@image = Qt::Image.new("cards.png")
|
|
end
|
|
|
|
def paintEvent(event)
|
|
painter = Qt::Painter.new(self)
|
|
if(@playing) then
|
|
draw_cards(painter)
|
|
else
|
|
painter.drawText(Qt::Rect.new, Qt::Rect.new, "Click to start a new game!")
|
|
end
|
|
painter.end
|
|
end
|
|
|
|
def draw_cards(painter)
|
|
# Draw the current card
|
|
source_y = @current_card.suit * 123
|
|
source_x = (@current_card.value-1) * 79
|
|
|
|
target_y = 100
|
|
target_x = 100
|
|
|
|
target = Qt::Rect.new(target_x.to_i, target_y.to_i, 79, 123)
|
|
source = Qt::Rect.new(source_x.to_i, source_y.to_i, 79, 123)
|
|
painter.drawImage(target, @image, source)
|
|
|
|
# Draw the next card
|
|
if(next_card != nil) then
|
|
source_y = @next_card.suit * 123
|
|
source_x = (@next_card.value-1) * 79
|
|
|
|
target_x = 200
|
|
|
|
target.setRect(target_x.to_i, target_y.to_i, 79, 123)
|
|
source.setRect(source_x.to_i, source_y.to_i, 79, 123)
|
|
painter.drawImage(target, @image, source)
|
|
end
|
|
|
|
# TODO Draw the message to the player down here
|
|
end
|
|
|
|
def play()
|
|
deck = Deck.new
|
|
|
|
correct_guesses = 0
|
|
|
|
guess = nil
|
|
|
|
deck.shufle
|
|
|
|
current_card = deck.deal_card
|
|
# TODO The rest of this method is not finished yet!
|
|
end
|
|
end
|
|
|
|
class HighLowWidget < Qt::Widget
|
|
def initialize(parent = nil)
|
|
setWindowTitle("High Low Card Game!")
|
|
puts("Initializing HighLowWidget")
|
|
super
|
|
|
|
higher = Qt::PushButton.new(tr("Higher"))
|
|
font = Qt::Font.new('Times', 18, Qt::Font::Bold)
|
|
higher.setFont(font)
|
|
lower = Qt::PushButton.new(tr("Lower"))
|
|
lower.setFont(font)
|
|
highLowField = HighLowField.new
|
|
|
|
connect(higher, SIGNAL("clicked()", highLowField, SLOT("highPressed()")))
|
|
|
|
connect(lower, SIGNAL("clicked()", highLowField, SLOT("lowPressed()")))
|
|
|
|
current_score = Qt::LCDRange.new
|
|
current_score.setRange(0, 54)
|
|
|
|
average_score = Qt::LCDRange.new
|
|
average_score.setRange(0, 54)
|
|
|
|
leftLayout = Qt::VBoxLayout.new
|
|
leftLayout.addWidget(current_score)
|
|
leftLayout.addWidget(average_score)
|
|
|
|
gridLayout = Qt::GridLayout.new
|
|
gridLayout.addWidget(highLowField, 0, 0)
|
|
gridLayout.addLayout(leftLayout, 1, 0)
|
|
gridLayout.addWidget(higher, 1, 1, 2, 1)
|
|
gridLayout.addWidget(lower, 1, 2, 2, 1)
|
|
gridLayout.setColumnStretch(1, 10)
|
|
setLayout(gridLayout)
|
|
end
|
|
end
|
|
|
|
app = Qt::Application.new(ARGV)
|
|
|
|
widget = HighLowWidget.new
|
|
p(widget)
|
|
puts("HighLowWidget should be ready by now.")
|
|
widget.resize(500, 500)
|
|
widget.show()
|
|
app.exec
|
|
|