我正在RoR上构建一个井字游戏。目前,整个董事会成立,下面有一个表格来跟踪这些举动。我被告知要用这个模型来弄清楚这样的事情,比如有一个胜利者(连续3个),一个领带(全盘)等等。我认为我有,但显然不是。不知道我在模型中的players
方法做错了什么。将数据从查看表单传输到模型方法
show.html.erb
:
<div id="board" align = center>
<table>
<tr>
<td data-position="0" class="square <%= class_for_move(0)%>"></td>
<td data-position="1" class="square v <%= class_for_move(1)%>"></td>
<td data-position="2" class="square <%= class_for_move(2)%>"></td>
</tr>
<tr>
<td data-position="3" class="square h <%= class_for_move(3)%>"></td>
<td data-position="4" class="square v h <%= class_for_move(4)%>"></td>
<td data-position="5" class="square h <%= class_for_move(5)%>"></td>
</tr>
<tr>
<td data-position="6" class="square <%= class_for_move(6)%>"></td>
<td data-position="7" class="square v <%= class_for_move(7)%>"></td>
<td data-position="8" class="square <%= class_for_move(8)%>"></td>
</tr>
</table>
</div>
<table>
<tr>
<td><%= @game.player_1 %></td>
<td><%= @game.player_2 %></td>
</tr>
<tr>
<td>X</td>
<td>O</td>
</tr>
</table>
<%= link_to "Play Again", games_path %>
<%= nested_form_for @game do |f| %>
<%= f.fields_for :moves do |move_form| %>
<div id="table" data-current-player="<%=session[:current_player] %>">
<%= move_form.label :position %><br>
<%= move_form.text_field :player, data: {position: move_form.object.position} %>
<%= move_form.hidden_field :id %>
</div>
<% end %>
<input type="Submit">
<% end %>
game.rb
:
class Game < ActiveRecord::Base
has_many :moves
after_create :initialize_moves
accepts_nested_attributes_for :moves
def initialize_moves
9.times do |i|
Move.create(position: i, game:self)
end
end
def players(number)
move = moves.find_by(position: number)
player = move.player
end
def tie?
end
def winner?
if players(0) == players(1) && players(1) == players(2)
return players(0)
end
end
end
games_controller
:
class GamesController < ApplicationController
def create
@game = Game.new(game_params)
@game.save
redirect_to @game
end
def update
@game = Game.find(params[:id])
@game.update(game_params)
if @game.tie?
flash[:error] = "Game over. 'Tis a tie."
elsif @game.winner?
flash[:notice] = "Winner is #{session[:current_player]}"
else
switch_player
end
redirect_to @game
end
def show
@game = Game.find(params[:id])
end
def switch_player
session[:current_player] = session[:current_player] == "X" ? "O" : "X"
end
private
def game_params
params.require(:game).permit(:player_1, :player_2, moves_attributes: [:player, :id])
end
end
当我跑我有什么的那一刻,游戏剧本,直到我有一个三在一排(只做0,1,2时隙测试),switchin g球员和演技正常。一旦三连串成立,它就会保持在当前玩家的位置,并且不会切换。它不会结束游戏,或者给我闪光灯通知。只要坚持当前的球员。如果我尝试添加一个试图放入另一个获胜位置组合的elsif,也是一样。
我意识到这可能是初级水平的东西,但我似乎无法包围我的头,并且到目前为止还没有发现任何有用的东西。而且,如果声明路线不是正确的路线,我愿意换一种方式。我现在无法想出另一种方式。
任何帮助,非常感谢。
哇,似曾相识... – 2014-09-25 17:47:28
我用不同的信息设置了一个新的问题,以避免用大多数相同的问题淹没网站。 – Briknthewall 2014-09-25 18:03:30
有点想通了......虽然看起来你正在取得进展。祝你好运,它随着时间的推移变得更加困惑。 – 2014-09-25 18:06:38