connect_n_game 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d8c22e80821cd3f7868d2fb55e1382c2fcdb8f64
4
+ data.tar.gz: 1e71e994e2930b55160aef91e9f637df6675f24b
5
+ SHA512:
6
+ metadata.gz: 4131de533d207ecc4e94f88d7a9c33139ea5f0e272adf202222b5f0a25f19b034cf68cb24c00a90ccfe375a7f5166eafad79fba38851e54c01a9df76a57dc69e
7
+ data.tar.gz: 01ddd823edb705af2593621f6da26dce0d9bf7abbc55f40653f197d46303890923e6e0a45f1f85c4c43d8058a47735497db7ebcb102960dca09ade448c62da0a
@@ -0,0 +1,21 @@
1
+ *.bat
2
+ *.zip
3
+ *.tmp
4
+ *.gem
5
+ *.rbc
6
+ .bundle
7
+ .config
8
+ .yardoc
9
+ Gemfile.lock
10
+ InstalledFiles
11
+ _yardoc
12
+ coverage
13
+ docs/.~lock.*
14
+ lib/bundler/man
15
+ pkg
16
+ rdoc
17
+ spec/reports
18
+ test/tmp
19
+ test/version_tmp
20
+ tmp
21
+ temp.txt
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in connect_n_game.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Peter Camilleri
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,74 @@
1
+ # ConnectNGame
2
+
3
+ This gem is a connect game with flexible board sizes. The classical game is
4
+ a seven by six playing rack with a goal of four in a row. This game supports
5
+ up to 14 by 12 rack with a goal of eight in a row.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'connect_n_game'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install connect_n_game
22
+
23
+ ## Usage
24
+
25
+ From the command line simply type:
26
+
27
+ $ connect_n_game [options]
28
+
29
+ To embed the game in another program use:
30
+
31
+ ```ruby
32
+ require 'connect_n_game'
33
+ ```
34
+
35
+ and then {W.I.P.}
36
+
37
+ ### Options
38
+
39
+ To get help simply enter:
40
+
41
+ $ connect_n_game --help
42
+
43
+ The available options are:
44
+
45
+ ```
46
+ Welcome to the Connect N Command Line Interface.
47
+ This is game version: 0.0.1.
48
+
49
+ Usage info: connect_n_game <options>
50
+
51
+ --help, -h, -? -- Display this message and quit.
52
+ --player, -p <name> -- Select player or automaton 'name'
53
+ Note: Limit of two players
54
+ --order, -o <4..8> -- The winning run length. Default=4
55
+ --debug, -d -- Display debug info.
56
+
57
+ Player Selection:
58
+ Basic Minimum tactical analysis.
59
+ Bruce An actual player.
60
+ Echo Really unoriginal.
61
+ Human An actual player.
62
+ Middle Moves toward the middle
63
+ Prudent Minimum tactical analysis with some defense.
64
+ Random Moves randomly.
65
+ Sheila An actual player.
66
+ ```
67
+
68
+ ## Contributing
69
+
70
+ 1. Fork it ( https://github.com/PeterCamilleri/connect_n_game/fork )
71
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
72
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
73
+ 4. Push to the branch (`git push origin my-new-feature`)
74
+ 5. Create a new Pull Request
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env rake
2
+ # coding: utf-8
3
+
4
+ require 'rake/testtask'
5
+ require 'rdoc/task'
6
+
7
+ require "bundler/gem_tasks"
8
+
9
+ #Generate internal documentation with rdoc.
10
+ RDoc::Task.new do |rdoc|
11
+ rdoc.rdoc_dir = "rdoc"
12
+
13
+ #List out all the files to be documented.
14
+ rdoc.rdoc_files.include("lib/**/*.rb", "license.txt", "README.md")
15
+
16
+ #Make all access levels visible.
17
+ rdoc.options << '--visibility' << 'private'
18
+ #rdoc.options << '--verbose'
19
+ #rdoc.options << '--coverage-report'
20
+
21
+ #Set a title.
22
+ rdoc.options << '--title' << 'fOOrth Language Internals'
23
+
24
+ end
25
+
26
+ #Run the fOOrth unit test suite.
27
+ Rake::TestTask.new do |t|
28
+ #List out all the test files.
29
+ t.test_files = FileList['tests/**/*.rb']
30
+ t.verbose = false
31
+ end
32
+
33
+ desc "Fire up an IRB session with the game preloaded."
34
+ task :console do
35
+ require 'irb'
36
+ require 'irb/completion'
37
+ require './lib/connect_n_game'
38
+ puts "Starting an IRB console for connect_n_game."
39
+ ARGV.clear
40
+ IRB.start
41
+ end
42
+
43
+ desc "What version of the connect_n_game is this?"
44
+ task :vers do |t|
45
+ puts
46
+ puts "connect_n_game version = #{ConnectNGame::VERSION}"
47
+ end
48
+
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ #Run the Connect N Game from the command line.
5
+
6
+ unless defined?(ConnectNGame)
7
+ begin
8
+ require 'connect_n_game'
9
+ rescue LoadError
10
+ require_relative '../lib/connect_n_game'
11
+ end
12
+ end
13
+
14
+ require_relative '../lib/cli/cli'
15
+
16
+ ConnectNGame::CLI.new.main
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'connect_n_game/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "connect_n_game"
8
+ spec.version = ConnectNGame::VERSION
9
+ spec.authors = ["Peter Camilleri"]
10
+ spec.email = ["peter.c.camilleri@gmail.com"]
11
+ spec.summary = "The Connect 4 (or more) Game gem."
12
+ spec.description = "The Captain's Mistress Game Generalized for 4 to 8 pieces."
13
+ spec.homepage = "http://teuthida-technologies.com/"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency 'minitest', "~> 5.5.1"
24
+ spec.add_development_dependency 'rdoc', "~> 4.0.1"
25
+
26
+ end
@@ -0,0 +1,72 @@
1
+ # coding: utf-8
2
+ #The command line interface for the connect_n_game.
3
+
4
+ require_relative 'process_options'
5
+ require_relative 'select_players'
6
+ require_relative 'cli_debug'
7
+
8
+ #Monkey patching the CLI UI into the game.
9
+ require_relative 'cli_rack'
10
+ require_relative 'cli_human'
11
+
12
+ module ConnectNGame
13
+
14
+ #The Connect N Command Line Interface class.
15
+ class CLI
16
+
17
+ #Set up the command line interface
18
+ def initialize
19
+ @players = []
20
+ @order = 4
21
+ end
22
+
23
+ #The starting point for an interactive, command-line-driven session
24
+ #of the Connect N Game!
25
+ def main
26
+ welcome
27
+ process_cmd_line
28
+ top_up_players
29
+
30
+ play_game
31
+
32
+ rescue Interrupt
33
+ puts
34
+ end
35
+
36
+ #Play the game
37
+ def play_game
38
+ @game = Game.new(@players[0], @players[1], @order)
39
+ @game.game_initialize
40
+
41
+ begin
42
+ current = @game.current
43
+ puts
44
+ result = @game.next_move
45
+ puts "On turn ##{@game.turn}, " +
46
+ "player #{current} " +
47
+ "plays channel #{Utl.channel_to_name(@game.last_move)}."
48
+ @game.rack.cli_display
49
+ end while result == :continue
50
+
51
+ if result == :victory
52
+ puts "Player #{@game.current}, #{@game.current_player.name} wins!"
53
+ puts
54
+ puts @game.current_player.winners_comments
55
+ puts @game.previous_player.losers_comments
56
+ elsif result == :stalemate
57
+ puts "No winner, it's a tie!"
58
+ else
59
+ puts "Result is #{result}"
60
+ end
61
+
62
+ puts
63
+ end
64
+
65
+ #The welcome message.
66
+ def welcome
67
+ puts "Welcome to the Connect N Command Line Interface."
68
+ puts "This is game version: #{VERSION}."
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,20 @@
1
+ # coding: utf-8
2
+
3
+ #Some monkey patching for debugging.
4
+ class Array
5
+
6
+ #A debugging routine. Turned on by the --debug option.
7
+ def show_weights(msg = "")
8
+ if $game_debug
9
+ print msg.ljust(7)
10
+ self.each do |weight|
11
+ print " #{Utl.channel_to_name(weight[1])}#{"%5.2f" % weight[0]} "
12
+ end
13
+
14
+ puts
15
+ end
16
+
17
+ self
18
+ end
19
+
20
+ end
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+ #\CLI extensions to the \Human class.
3
+
4
+ module ConnectNGame
5
+
6
+ class Human < Player
7
+
8
+ #Make a move. This player moves with DNA and other stuff too.
9
+ #<br>Parameters
10
+ #* game - the game being played.
11
+ #* piece - the piece to be played, 1 or 2.
12
+ #<br>Returns
13
+ #* A move, 1 .. rack.width
14
+ def make_move(game, piece)
15
+ begin
16
+ legal = legal_moves(game.rack)
17
+ puts "Player #{piece} select [#{legal}] "
18
+ reply = gets[0].upcase
19
+ channel = Utl.name_to_channel(reply)
20
+ end until channel && legal.include?(reply)
21
+
22
+ channel
23
+ end
24
+
25
+ #Get a string of legal moves.
26
+ #<br>Parameters
27
+ #* rack - the playing area.
28
+ #<br>Returns
29
+ #* A string with all possible legal moves.
30
+ def legal_moves(rack)
31
+ legal = rack.channel_names.reject do |name|
32
+ channel = Utl.name_to_channel(name)
33
+ rack.channel_full?(channel)
34
+ end
35
+
36
+ legal.join("")
37
+ end
38
+
39
+ end
40
+
41
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ #\CLI extensions to the \Rack class.
3
+
4
+ module ConnectNGame
5
+
6
+ #The output conversion hash
7
+ CLI_MAP = { nil => ' ', 1 => 'X', 2 => 'O'}
8
+
9
+ class Rack
10
+
11
+ #Display the rack via a command line interface.
12
+ def cli_display
13
+ #Show the title line.
14
+ puts " " + channel_names.join(" ")
15
+
16
+ #Show the body
17
+ (1..depth).reverse_each do |row|
18
+ (1..width).each do |channel|
19
+ print "|#{CLI_MAP[get_cell(channel,row)]}"
20
+ end
21
+
22
+ puts "|"
23
+ end
24
+ end
25
+
26
+ puts
27
+ end
28
+
29
+
30
+ end
@@ -0,0 +1,62 @@
1
+ # coding: utf-8
2
+ # Handle any command line arguments.
3
+
4
+ require 'getoptlong'
5
+
6
+ module ConnectNGame
7
+
8
+ class CLI
9
+
10
+ #Handle any command line parameters.
11
+ def process_cmd_line
12
+
13
+ opts = GetoptLong.new(
14
+ [ "--help", "-h", "-?", GetoptLong::NO_ARGUMENT ],
15
+ [ "--player", "-p", GetoptLong::REQUIRED_ARGUMENT ],
16
+ [ "--order", "-o", GetoptLong::REQUIRED_ARGUMENT ],
17
+ [ "--debug", "-d", GetoptLong::NO_ARGUMENT ])
18
+
19
+ # Translate the parsed options into fOOrth.
20
+ opts.each do |opt, arg|
21
+
22
+ case opt
23
+ when "--player"
24
+ fail "Error: Too many players!" if @players.length >= 2
25
+
26
+ puts "Player ##{@players.length + 1} is #{arg}"
27
+ fail "Error: Unknown player: #{arg}" unless (player = find_player(arg))
28
+ @players << player
29
+ when "--order"
30
+ @order = arg.to_i
31
+ fail "Invalid order #{arg}" unless @order.between?(4,8)
32
+ when "--debug"
33
+ puts "Debug mode is enabled."
34
+ $game_debug = true
35
+ else
36
+ fail ""
37
+ end
38
+ end
39
+
40
+ rescue => err
41
+ puts err.message
42
+ show_help
43
+ exit
44
+ end
45
+
46
+ #Display the help message.
47
+ def show_help
48
+ puts
49
+ puts "Usage info: connect_n_game <options>"
50
+ puts
51
+ puts "--help, -h, -? -- Display this message and quit."
52
+ puts "--player, -p <name> -- Select player or automaton 'name'"
53
+ puts " Note: Limit of two players"
54
+ puts "--order, -o <4..8> -- The winning run length. Default=4"
55
+ puts "--debug, -d -- Display debug info."
56
+
57
+ show_players
58
+ end
59
+
60
+ end
61
+
62
+ end