Ada 95 :: x21_ttt.ada

with Simple_io; use Simple_io;
package Class_board is
  type Board is private;
  procedure add( the:in out Board; pos:in Integer; 
                 piece:in Character );
  function  valid( the:in Board; pos:in Integer ) return Boolean;
  procedure display( the:in Board );
private
  SIZE_TTT : CONSTANT := 9;                         -- Must be 9
  subtype Board_index is Integer range 1 .. SIZE_TTT;
  subtype Board_range is Board_index;
  type    Board_grid  is array( Board_range ) of Character;
  type Board is record
    sqrs : Board_grid := ( others => ' ');   -- Initialize
  end record;
end Class_board;

with Simple_io; use Simple_io;
package body Class_board is

  procedure add( the:in out Board; pos:in Integer;
                 piece:in Character ) is
  begin
    the.sqrs( pos ) := piece;
  end add;

  function valid(the:in Board; pos:in Integer) return Boolean is
  begin
    return pos in Board_range and then the.sqrs( pos ) = ' ';
  end valid;

  procedure display( the:in Board ) is
  begin
    for i in Board_range loop          -- All pieces
      put( the.sqrs( i ) );            -- Display counter;
      case i is                        -- after printing counter
        when 3 | 6  =>                 --  print Row Separator
          new_line; put("---------");
          new_line;
        when 9      =>                 --  print new line
          new_line;
        when 1 | 2 | 4 | 5 | 7 | 8 =>  --  print Col separator
          put(" | ");
      end case;
    end loop;
  end display;
end Class_board;


with Simple_io, Class_board;
use  Simple_io, Class_board;
procedure main is
  player : Character;          -- Either 'X' or 'O'
  game   : Board;              -- An instance of Class Board
  move   : Integer;            -- Move from user
begin
  player := 'X';                             -- Set player
  put("Player "); put( player );             --  Ask player for
  put(" enter move (1-9) : ");               --   move
  while not end_of_file loop                 -- While moves
    get( move ); skip_line;                  --  Get move
    if valid( game, move ) then              -- Valid
      add( game, move, player );             --  Add to board
      display( game );                       --  Display board
      case player is                         --  Next Player
        when 'X'      => player := 'O';      --   'X' -> 'O'
        when 'O'      => player := 'X';      --   'O' -> 'X'
        when others   => null;               --
      end case;
    else
      put("Move invalid"); new_line;         -- for board
    end if;
    put("Player "); put( player );           --  Ask player for
    put(" enter move (1-9) : ");             --   move
  end loop;
  new_line(2);
end main;


© M.A.Smith University of Brighton. Created September 1995 last modified May 1997.
Comments, suggestions, etc. M.A.Smith@brighton.ac.uk * [Home page]