@Dreamdancer nice battleships game! You definitely have a good basis
I have a few suggestions which I hope you find useful 
Firstly from a UI (user interface) perspective the fonts, game board and general look and feel is very good! 
However make sure you include a menu so your users can start a new game or exit if they want too.
When your playing more of a delay/transition is required between the switch from computer to human and back again its a little disorientating going between blue and bright yellow and orange if your playing fast
and perhaps some sprites for the ships and water for finishing touches (which I’m sure you’ve thought of already!)
From a code perspective, during play appears very robust and there’s no immeadiately apparent bugs :).
Viewing in the editor some code appears duplicated partly duplicated in places. Consider, a computer player can do everything a human player can do just the difference is the computer does these things automatically. This is where classes are really useful
you could create 3 like so:
Player base class. Has all the common functionality between players like shooting etc.
Player=class()
function Player:init()
end
function Player:setup()
-- get notification of new game
end
function Player:place(ship)
end
function Player:fireat(player,square)
end
function Player:moveStarted()
-- get notification of turn
end
function Player:moveFinished()
-- notify turn finished
end
function Player:touched(touch)
end
HumanPlayer - has all the common functions from Player and uses them with the touched method and would use setup and moveStarted to know when to accept ship placements or moves.
HumanPlayer = class(Player)
function HumanPlayer:init()
Player.init(self)
end
function HumanPlayer:touched(touch)
self:place(ship)
self:fireat(opponent,touchedSquare)
self:moveFinished()
end
Computer player - still has all the common functions from Player but uses them differently. ignores touch input, places ships in the setup function and makes moves in the moveStarted function
ComputerPlayer = class(Player)
function ComputerPlayer:init()
Player.init(self)
end
function ComputerPlayer:setup()
-- choose strategy
-- place ships
end
function ComputerPlayer:moveStarted()
-- calculate move / best move
-- do move
self:MoveFinished()
end
This is called inheritance and polymorphism, which you have probably seen mentioned in your extensive reading
It allows you to share functionality between different objects by it being “inherited” but also have it do things differently (polymorphism) where needed without having to rewrite potentially lots of code:)
You could then apply if further with Players to go on to create difficulties e.g EasyComputerPlayer =class(ComputerPlayer)
,MediumComputerPlayer =class(ComputerPlayer)
etc :). It’s also something you could use in other areas of your game but it should also be noted that just like anything there are times where you should and shouldn’t use it 