#!/bin/sed -f # noughts and crosses 1 { s/.*/\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 1> | | \ -+-+-\ 2> | | \ -+-+-\ 3> | | \ \ ^ ^ ^\ A B C\ / h a\ Enter the name of the square in which\ you would like to place a counter, or\ press [RETURN] if you would like me to\ begin. n } /^$/ { 2 g 2 b mefirst } /[Aa]1/ { g s/1> |/1> X|/ t moved b full } /[Aa]2/ { g s/2> |/2> X|/ t moved b full } /[Aa]3/ { g s/3> |/3> X|/ t moved b full } /[Bb]1/ { g s/1> \(.\)| |/1> \1|X|/ t moved b full } /[Bb]2/ { g s/2> \(.\)| |/2> \1|X|/ t moved b full } /[Bb]3/ { g s/3> \(.\)| |/3> \1|X|/ t moved b full } /[Cc]1/ { g s/1> \(.|.\)| /1> \1|X/ t moved b full } /[Cc]2/ { g s/2> \(.|.\)| /2> \1|X/ t moved b full } /[Cc]3/ { g s/3> \(.|.\)| /3> \1|X/ t moved b full } a\ I don't know which square you mean.\ Please enter your choice in the form 'C3'. b :full a\ That particular square is already occupied.\ Please choose another! b :moved /X|X|X/ b win / X.* X.* X/ b win /|X|.*|X|.*|X|/ b win /|.|X.*|.|X.*|.|X/ b win /> X.*> .|X.*> .|.|X/ b win /> .|.|X.*> .|X.*> X/ b win /[OX]|[OX]|[OX].*[OX]|[OX]|[OX].*[OX]|[OX]|[OX]/ b draw h :wait n /^$/ !{ s/.*/Oh no you don't, it's my turn!!/ b wait } g /O|O| / { s/O|O| /O|O|O/ b loose } / |O|O/ { s/ |O|O/O|O|O/ b loose } /O| |O/ { s/O| |O/O|O|O/ b loose } /> O.*> O.*> / b playA /> O.*> .*> O/ b playA /> .*> O.*> */ b playA /|O|.*|O|.*| |/ b playB /|O|.*| |.*|O|/ b playB /| |.*|O|.*|O|/ b playB /|.| .*|.|O.*|.|O/ b playC /|.|O.*|.| .*|.|O/ b playC /|.|O.*|.|O.*|.| / b playC /> |.*|O|.*|.|O/ { s/1> /1> O/ b loose } /> O|.*| |.*|.|O/ { s/\(2> .|\) /\1O/ b loose } /> O|.*|O|.*|.| / { s/\(3> .|.|\) /\1O/ b loose } /|.|O.*|O|.* |.|/ { s/3> /3> O/ b loose } /|.|O.*| |.*O|.|/ { s/\(2> .|\) /\1O/ b loose } /|.| .*|O|.*O|.|/ { s/\(1> .|.|\) /\1O/ b loose } /X|X| / { s/X|X| /X|X|O/ b finished } / |X|X/ { s/ |X|X/O|X|X/ b finished } /X| |X/ { s/X| |X/X|O|X/ b finished } /> X.*> X.*> / b playA /> X.*> .*> X/ b playA /> .*> X.*> */ b playA /|X|.*|X|.*| |/ b playB /|X|.*| |.*|X|/ b playB /| |.*|X|.*|X|/ b playB /|.| .*|.|X.*|.|X/ b playC /|.|X.*|.| .*|.|X/ b playC /|.|X.*|.|X.*|.| / b playC /> |.*|X|.*|.|X/ { s/1> /1> O/ b finished } /> X|.*| |.*|.|X/ { s/\(2> .|\) /\1O/ b finished } /> X|.*|X|.*|.| / { s/\(3> .|.|\) /\1O/ b finished } /|.|X.*|X|.* |.|/ { s/3> /3> O/ b finished } /|.|X.*| |.*X|.|/ { s/\(2> .|\) /\1O/ b finished } /|.| .*|X|.*X|.|/ { s/\(1> .|.|\) /\1O/ b finished } :mefirst /2> .| |/ { s/2> \(.\)| |/2> \1|O|/ 2 !a\ Don't mind if I do! b finished } /[13]> |/ { s/\([13]> \) |/\1O|/ b finished } /[13]> .|.| / { s/\([13]> .|.|\) /\1O/ b finished } /| |/ { s/| |/|O|/ b finished } /2> / { s/2> /2> O/ b finished } s/\(2> .|.|\) /\1O/ :finished /[OX]|[OX]|[OX].*[OX]|[OX]|[OX].*[OX]|[OX]|[OX]/ b draw /O|O|O/ b loose / O.* O.* O/ b loose /|O|.*|O|.*|O|/ b loose /|.|O.*|.|O.*|.|O/ b loose /> O.*> .|O.*> .|.|O/ b loose /> .|.|O.*> .|O.*> O/ b loose h b :win s/$/\ \ You win!!/ q :loose s/$/\ \ I win!!/ q :draw s/$/\ \ It's a draw!!/ q :playA s/> /> O/ b finished :playB s/| |/|O|/ b finished :playC s/\(|.|\) /\1O/ b finished ### colorized by sedsed, a debugger and code formatter for sed scripts ### original script: http://www-jcsu.jesus.cam.ac.uk/~gsb29/sedgames.html