Skip to content

Instantly share code, notes, and snippets.

@clicube
Created December 13, 2011 17:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save clicube/1473054 to your computer and use it in GitHub Desktop.
Save clicube/1473054 to your computer and use it in GitHub Desktop.
janken
require 'socket'
require 'digest/sha2'
Te = %w[rock scissors paper]
Te_cmd = %w[r s p]
if ARGV.length != 2 || !ARGV[1].to_i || ARGV[1].to_i <= 0
puts File.basename(__FILE__) + " <server_host> <port>"
exit
end
sock = TCPSocket.new(ARGV[0],ARGV[1].to_i)
puts "connected"
loop do
key = rand(65536).to_s
$stdout.write "input your te (r,p,s): "
te_str = $stdin.gets.strip
if Te_cmd.include?(te_str)
te = Te_cmd.index(te_str)
te_hash = Digest::SHA256.new.update(te.to_s + key)
sock.puts "jan,#{te_hash}"
line = sock.gets.strip
lineitems = line.split(",")
if(lineitems[0] == "ken")
server_te = lineitems[1].to_i
puts "you: #{Te[te]}, server: #{Te[server_te]}"
case (te - server_te + 3 ) % 3
when 0
puts "-> draw"
when 1
puts "-> lose"
when 2
puts "-> win"
end
sock.puts "pon,#{te},#{key}"
end
elsif te_str == ""
sock.puts ""
exit
end
end
require 'socket'
require 'digest/sha2'
Te = %w[rock scissors paper]
if ARGV.length != 1 || !ARGV[0].to_i || ARGV[0].to_i <= 0
puts File.basename(__FILE__) + " <port>"
exit
end
server = TCPServer.new(ARGV[0].to_i)
sock = server.accept
puts "client accepted"
client_te = nil
client_hash = nil
server_te = nil
loop do
line = sock.gets.strip
lineitems = line.split(",")
exit if lineitems.length == 0
case lineitems[0]
when "jan"
puts "received jan"
client_hash = lineitems[1]
server_te = rand(3)
sock.puts "ken,#{server_te}"
puts "sent ken"
when "pon"
puts "received pon"
client_te = lineitems[1].to_i
key = lineitems[2]
if Digest::SHA256.new.update(client_te.to_s + key) == client_hash
puts "server: #{Te[server_te]}, client: #{Te[client_te]}"
case (server_te - client_te.to_i + 3) % 3
when 0
puts "-> draw"
when 1
puts "-> lose"
when 2
puts "-> win"
end
else
puts "client cheated ?"
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment