func InteractiveOptions(in, out *os.File, gameName string) *Options {
	if in == nil {
		in = os.Stdin
	}
	if out == nil {
		out = os.Stdout
	}
	result := &Options{
		Name: gameName,
	}
	if !nameLegal(gameName) {
		return result
	}
	defaultDisplayName := strings.Title(gameName)
	result.DisplayName = getString(out, in, "What is the human-readable display name for this game? (e.g. 'Checkers', 'Tic Tac Toe')", defaultDisplayName)
	if result.DisplayName == defaultDisplayName {
		result.DisplayName = ""
	}
	if description := getString(out, in, "What is the description of the game?", ""); description != "" {
		result.Description = description
	}
	numPlayersString := getString(out, in, "Range of valid players counts", "2-4")
	min, max, defaultNum, err := parseNumPlayers(numPlayersString)
	if err != nil {
		fmt.Println("That value is not valid: " + err.Error())
		return nil
	}
	result.MinNumPlayers = min
	result.MaxNumPlayers = max
	result.DefaultNumPlayers = defaultNum
	extras := getBool(out, in, "Generate useful extras like a test, CurrentPhase, and CurrentPlayer?", true)
	if !extras {
		result.SuppressExtras()
	}
	client := getBool(out, in, "Generate stub client renderers?", true)
	if !client {
		result.SuppressClient()
	}
	tutorial := getBool(out, in, "Generate extra tutorial content that demonstrate how to wire up more things?", false)
	if tutorial {
		result.EnableTutorials()
	}
	return result
}
InteractiveOptions renders an interactve prompt at out, in to generate an
Options from the user. If in or out are nil, StdIn or StdOut will be used
implicitly.
package stub
import (
	"errors"
	"fmt"
	"os"
	"strconv"
	"strings"
)