tic_tac_toe_vj 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/Gemfile +8 -0
- data/README.md +35 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/tic_tac_toe_vj.rb +89 -0
- data/lib/tic_tac_toe_vj/board.rb +73 -0
- data/lib/tic_tac_toe_vj/game.rb +58 -0
- data/lib/tic_tac_toe_vj/game_status.rb +6 -0
- data/lib/tic_tac_toe_vj/location.rb +7 -0
- data/lib/tic_tac_toe_vj/player.rb +7 -0
- data/lib/tic_tac_toe_vj/version.rb +3 -0
- data/tic_tac_toe_vj.gemspec +29 -0
- metadata +102 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3790c471193ac46e14077ce32db0854d34fbfee1d7109ade0a430cf2c796438d
|
4
|
+
data.tar.gz: '09cfe835c06322566feacbfd099eacd702538a1257aed4a890f340f6dcb13aa4'
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 67b82d45f7c09264a72af6a4e34c5b98622510ceef7e1748f47acee589d6791dca04fa110a350ea39d8dbf92082e760ed6e0fcfccf09c59e3a1b9e4f7b2d0b4c
|
7
|
+
data.tar.gz: 47969150802662b56479f720a2c5c10402b0fade5a07c99057f64aef91bdd40cd3d0d3a38587d2957c4eae19c596cf69986d7ffa69104da2c094c8f34c677190
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# TicTacToeVj
|
2
|
+
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/tic_tac_toe_vj`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
+
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'tic_tac_toe_vj'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install tic_tac_toe_vj
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
TODO: Write usage instructions here
|
26
|
+
|
27
|
+
## Development
|
28
|
+
|
29
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
+
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
+
|
33
|
+
## Contributing
|
34
|
+
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/tic_tac_toe_vj.
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "tic_tac_toe_vj"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
require "tic_tac_toe_vj/version"
|
2
|
+
require 'tic_tac_toe_vj/board'
|
3
|
+
require 'tic_tac_toe_vj/game'
|
4
|
+
require 'tic_tac_toe_vj/player'
|
5
|
+
require 'tic_tac_toe_vj/location'
|
6
|
+
require 'tic_tac_toe_vj/game_status'
|
7
|
+
|
8
|
+
class TicTakToeController
|
9
|
+
include TicTacToeVj
|
10
|
+
include GameStatus
|
11
|
+
|
12
|
+
def initialize(player1_name="Vijay", player2_name="Ajay")
|
13
|
+
@board = Board.new
|
14
|
+
@tile_location = Location.new(0,0)
|
15
|
+
@player1 = Player.new(player1_name, :O)
|
16
|
+
@player2 = Player.new(player2_name, :X)
|
17
|
+
@game = Game.new(@board, @player1, @player2)
|
18
|
+
end
|
19
|
+
|
20
|
+
def start
|
21
|
+
puts "Tic tak toe is starting -------------"
|
22
|
+
sleep(1)
|
23
|
+
puts "terns should be write as row coma column ex 1,1 this will Enter your Symbol in the middle"
|
24
|
+
sleep(0.5)
|
25
|
+
user_play_move
|
26
|
+
end
|
27
|
+
|
28
|
+
def validate_input?(user_input)
|
29
|
+
split_input = user_input.split(",")
|
30
|
+
validate = split_input.length == 2
|
31
|
+
if validate
|
32
|
+
split_input.each do |index|
|
33
|
+
validate = validate && check_int?(index) && index.to_i >= 0 && index.to_i <= 2
|
34
|
+
end
|
35
|
+
end
|
36
|
+
return validate
|
37
|
+
end
|
38
|
+
|
39
|
+
def reset_game
|
40
|
+
@board = Board.new
|
41
|
+
@tile_location = Location.new(0,0)
|
42
|
+
@player1 = Player.new(@player1.name, :cross)
|
43
|
+
@player2 = Player.new(@player2.name, :zero)
|
44
|
+
@game = Game.new(@board, @player1, @player2)
|
45
|
+
start
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def update_game_after_move(gamestatus)
|
51
|
+
case gamestatus
|
52
|
+
when GameStatus::NEXT_MOVE
|
53
|
+
puts "your tern #{@game.current_player.name}"
|
54
|
+
user_play_move
|
55
|
+
when GameStatus::DRAW
|
56
|
+
puts "its a draw"
|
57
|
+
puts "Game is starting again"
|
58
|
+
sleep(1)
|
59
|
+
reset_game
|
60
|
+
else
|
61
|
+
"#{@game.current_player.name} wins"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def check_int?(int)
|
66
|
+
result = Integer(int) rescue false
|
67
|
+
return result == false ? false : true
|
68
|
+
end
|
69
|
+
|
70
|
+
def user_play_move
|
71
|
+
puts "#{@board.tile}"
|
72
|
+
puts "Enter your tern #{@game.current_player.name}"
|
73
|
+
location = gets.chomp
|
74
|
+
if validate_input?(location)
|
75
|
+
move_locations = location.split(",")
|
76
|
+
@tile_location = Location.new(move_locations[0].to_i,move_locations[1].to_i)
|
77
|
+
if @board.is_tile_not_marked?(@tile_location)
|
78
|
+
@board.mark_tile(@tile_location, @game.current_player.symbol)
|
79
|
+
@game.play_move(@tile_location)
|
80
|
+
else
|
81
|
+
puts "location is already marked please do terns again"
|
82
|
+
user_play_move
|
83
|
+
end
|
84
|
+
else
|
85
|
+
puts "invalid input please give a valid input in the form of 1,1"
|
86
|
+
end
|
87
|
+
update_game_after_move(@game.status)
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require __dir__ + '/location'
|
2
|
+
|
3
|
+
class Board
|
4
|
+
BOARD_SIZE = 3
|
5
|
+
|
6
|
+
attr_reader :tile
|
7
|
+
|
8
|
+
def initialize()
|
9
|
+
@number_of_tiles_marked = 0
|
10
|
+
@tile = Array.new(BOARD_SIZE) {Array.new(BOARD_SIZE)}
|
11
|
+
end
|
12
|
+
|
13
|
+
def mark_tile(location, mark)
|
14
|
+
if is_tile_not_marked?(location)
|
15
|
+
@tile[location.row][location.column] = mark
|
16
|
+
@number_of_tiles_marked += 1
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def is_tile_not_marked?(location)
|
21
|
+
return @tile[location.row][location.column].nil?
|
22
|
+
end
|
23
|
+
|
24
|
+
def number_of_terns
|
25
|
+
@number_of_tiles_marked
|
26
|
+
end
|
27
|
+
|
28
|
+
def is_game_finish?(player_symbol)
|
29
|
+
return check_left_diognal?(player_symbol) || chek_right_diognal?(player_symbol) || check_row?(player_symbol) || check_column?(player_symbol)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def check_left_diognal?(player_symbol)
|
35
|
+
check_win = true
|
36
|
+
BOARD_SIZE.times do |index|
|
37
|
+
check_win = @tile[index][index] == player_symbol
|
38
|
+
return false if !check_win
|
39
|
+
end
|
40
|
+
return true
|
41
|
+
end
|
42
|
+
|
43
|
+
def chek_right_diognal?(player_symbol)
|
44
|
+
check_win = true
|
45
|
+
BOARD_SIZE.times do |index|
|
46
|
+
check_win = @tile[index][BOARD_SIZE - 1 - index] == player_symbol
|
47
|
+
return false if !check_win
|
48
|
+
end
|
49
|
+
return true
|
50
|
+
end
|
51
|
+
|
52
|
+
def check_row?(player_symbol)
|
53
|
+
BOARD_SIZE.times do |row|
|
54
|
+
check_win = true
|
55
|
+
BOARD_SIZE.times do |column|
|
56
|
+
check_win = check_win && @tile[row][column] == player_symbol
|
57
|
+
end
|
58
|
+
return true if check_win
|
59
|
+
end
|
60
|
+
return false
|
61
|
+
end
|
62
|
+
|
63
|
+
def check_column?(player_symbol)
|
64
|
+
BOARD_SIZE.times do |row|
|
65
|
+
check_win = true
|
66
|
+
BOARD_SIZE.times do |column|
|
67
|
+
check_win = check_win && @tile[column][row] == player_symbol
|
68
|
+
end
|
69
|
+
return true if check_win
|
70
|
+
end
|
71
|
+
return false
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require __dir__ + '/board'
|
2
|
+
require __dir__ + '/player'
|
3
|
+
require __dir__ + '/game_status'
|
4
|
+
|
5
|
+
class Game
|
6
|
+
|
7
|
+
attr_reader :current_player, :status
|
8
|
+
def initialize(board, player1, player2)
|
9
|
+
@board = board
|
10
|
+
@player1 = player1
|
11
|
+
@player2 = player2
|
12
|
+
@current_player = player1
|
13
|
+
@status = GameStatus::NEXT_MOVE
|
14
|
+
end
|
15
|
+
|
16
|
+
def restart
|
17
|
+
@current_player = @player1
|
18
|
+
@status = GameStatus::NEXT_MOVE
|
19
|
+
@board.restart
|
20
|
+
end
|
21
|
+
|
22
|
+
def play_move(location)
|
23
|
+
if @status == GameStatus::NEXT_MOVE
|
24
|
+
@board.mark_tile(location, @current_player.symbol)
|
25
|
+
@status = check_game_status
|
26
|
+
@current_player = change_player
|
27
|
+
end
|
28
|
+
return status
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def is_win?
|
34
|
+
@board.is_game_finish?(@current_player.symbol)
|
35
|
+
end
|
36
|
+
|
37
|
+
def winner
|
38
|
+
@current_player = change_player
|
39
|
+
return @current_player == @player1 ? GameStatus::PLAYER_1_WINS : GameStatus::PLAYER_2_WINS
|
40
|
+
end
|
41
|
+
|
42
|
+
def check_game_status
|
43
|
+
number_of_terns = @board.number_of_terns
|
44
|
+
if number_of_terns < 5
|
45
|
+
return GameStatus::NEXT_MOVE
|
46
|
+
elsif is_win?
|
47
|
+
return winner
|
48
|
+
elsif number_of_terns == 9
|
49
|
+
return GameStatus::DRAW
|
50
|
+
end
|
51
|
+
return GameStatus::NEXT_MOVE
|
52
|
+
end
|
53
|
+
|
54
|
+
def change_player
|
55
|
+
return @current_player == @player1 ? @player2 : @player1
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "tic_tac_toe_vj/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "tic_tac_toe_vj"
|
8
|
+
spec.version = TicTacToeVj::VERSION
|
9
|
+
spec.authors = ["Vijay Pratap Singh"]
|
10
|
+
spec.email = ["vijayprsingh619@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = "A simple terminal tic tak toe game"
|
13
|
+
spec.description = "You can play tic tak toe game by using this gem"
|
14
|
+
spec.homepage = "https://github.com/vjpratap/tic_tac_toe_vj"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
# Specify which files should be added to the gem when it is released.
|
18
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
19
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
20
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
21
|
+
end
|
22
|
+
spec.bindir = "exe"
|
23
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
|
+
spec.require_paths = ["lib"]
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
27
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.8"
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tic_tac_toe_vj
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Vijay Pratap Singh
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-10-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.8'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.8'
|
55
|
+
description: You can play tic tak toe game by using this gem
|
56
|
+
email:
|
57
|
+
- vijayprsingh619@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rspec"
|
64
|
+
- ".travis.yml"
|
65
|
+
- Gemfile
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- bin/console
|
69
|
+
- bin/setup
|
70
|
+
- lib/tic_tac_toe_vj.rb
|
71
|
+
- lib/tic_tac_toe_vj/board.rb
|
72
|
+
- lib/tic_tac_toe_vj/game.rb
|
73
|
+
- lib/tic_tac_toe_vj/game_status.rb
|
74
|
+
- lib/tic_tac_toe_vj/location.rb
|
75
|
+
- lib/tic_tac_toe_vj/player.rb
|
76
|
+
- lib/tic_tac_toe_vj/version.rb
|
77
|
+
- tic_tac_toe_vj.gemspec
|
78
|
+
homepage: https://github.com/vjpratap/tic_tac_toe_vj
|
79
|
+
licenses:
|
80
|
+
- MIT
|
81
|
+
metadata: {}
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
requirements: []
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 2.7.6
|
99
|
+
signing_key:
|
100
|
+
specification_version: 4
|
101
|
+
summary: A simple terminal tic tak toe game
|
102
|
+
test_files: []
|