   ;; then determines if there has been a winner. If there has been a
   ;; winner, it marks the winner. Flips turn and returns true at this point
   (when-let [i (and
-                (< 0 move ncols)
+                (<= 0 move (dec ncols))
                 (->> (range (* move nrows) (* (inc move) nrows))
                      (filter (fn [i] (= (@state i) 0)))
                      first))]

            (when-not @winner
              (recur)))))
      ;; Cleanup
      (doseq [{:keys [latch ch-out]} players]
        (<! (notify ch-out))
        (>! ch-out {:type (if @winner "end" "disconnected")})
        (async/close! latch)))))

            (>! @matcher {:id id :chs chs :latch latch})
            ;; Waits here until game ends
            (<! latch))
          (>! ch-out {:type "ignored" :msg msg}))
        (recur)))))

;;; Game loop
(defn game-init [s]
