#JavaScript (ES7), <s> 216 ... 205 201 </s> 199 bytes Takes input as `(block)(double)`, where _block_ is either \$-2\$ (top right), \$-1\$ (bottom left), \$1\$ (bottom right) or \$2\$ (top left) and _double_ is a Boolean value. <!-- language-all: lang-javascript --> b=>d=>(g=x=>y<31?`+-| =OTF `[X=x-19,Y=y-15,p=X*Y*b<0,q=Y>0^b&1,X*=X,Y*=Y,i=x*24%35>2|~16>>Y%62%6&2,x<39?Y?p*X|(d?Y:X-87)>169?3:i?X-1|Y-16|q?i:7:q*(d?X-87:Y)%169&&6:x%38?4:5:++y&&8]+g(-~x%40):'')(y=0) [Try it online!](https://tio.run/##ZYvBboJAFEX3fsVbFJiBGcOAoo68maRpu@2mCybGRhG1tsTR2jYQwV@32G0XNzc359z35c/ytPrcHb743hbr6wavOaoCFdlihapOY6EXAW8An1@eeotZhhUXE2aw5mLIDpj5xs/TkB3RqPA1dwXLfMyY8dGwHVZ@NHDioYqai0iUMk4SOYkbsSqNJ9rog581pNBGZnw8okokEx3Lnc64aAwXSXPUOzmSR79zboY01Okc101k5cRjPZBDGQS1647nwZbwS@UMQio9j5IaQ3rd2E9SAEI4hQJSBNF1EFA49wBmPGIgGPAu0bzfqY/L1RvJAdUfB1jZ/cmW635pt2RxX9rVB9yd85bBg/3Oy7XsVgEavHp98kCCt7deu6D/rhuSU1LQG2jptNdefwE "JavaScript (Node.js) – Try It Online") [Formatted version](https://tio.run/##hVJNb4JQELzzK@ZQhQfSACIqFUyaptdeepD0I4qgsSWgtW0kin@d7kPiF7Ylgbc7szP7dsPb6Hu0HH/M5p9qnARhPnFyH46LgF5JAKZwsCKAQiBFD00d/SIBhoq6gfPweP8cD59KDBgUChV6t7HHPMJSjrUO2JywAWTiZPhkrB2oBVEeXGh4JaoOvXHkLpPs2Jly75DPiu4yDBM1NFtkYmCzZ/mz1S24LglrsAz@oQbGwWDFZ@zuZ9z16J84zMl/cOYqBejDswlX0Wkz6qtb3TMd0DzJ7TN2VqlH4adjQ3eg06JgcaGIpBXMvlDVFv6rWUCuYMVou7lgw2O0Mz5bvQ5L@M1rxbffqVzV/HP@lnCJUZSU9@qU0AuUMppK6pb3MTUmHItEUWBSSv@BxvJJ8kHXp/AGAXoOdDoVha2plFP0q3PI55RJZ0kB4yReJlF4HSVTaXgbJeN3XK39rIG75MuPQpsyvhUxDZciLUWMEzEbsop0IvlMChgnMiHLfwA) ###How? We iterate from \$y=0\$ to \$y=30\$ and from from \$x=0\$ to \$x=39\$ for each value of \$y\$. We first define \$X=x-19\$ and \$Y=y-15\$. The variables `p = X * Y * b < 0` and `q = Y > 0 ^ b & 1` are used to determine what do draw in each quarter according to the block \$b\$. From now on, both \$X\$ and \$Y\$ are squared in order to easily test absolute positions within each quarter of the field. The expression `x * 24 % 35 > 2` yields _false_ if \$x\$ belongs to \$\{0, 3, 19, 35, 38\}\$ (the positions of the vertical lines) or _true_ otherwise. [Try it online!](https://tio.run/##y0osSyxOLsosKNHNy09J/f8/Lb9Io0LBVsHAWqFCwUbBBERra2sqVHMpKCTn5xXn56Tq5eSna1ToAOW1FIxMFFQVjE0V7BSMNK25av//BwA "JavaScript (Node.js) – Try It Online") The expression `~16 >> Y % 62 % 6 & 2` yields \$0\$ if \$y\$ belongs to \$\{0, 2, 12, 18, 28, 30\}\$ (the positions of the horizontal lines, excluding the net) or \$2\$ otherwise. [Try it online!](https://tio.run/##y0osSyxOLsosKNHNy09J/f8/Lb9Io1LBVsHAWqFSwUbB2BBIa2trKlRzKShEAsWBkroKhqaaClpaCkbWQMHk/Lzi/JxUvZz8dI1KHYU6QzMFOzugUlUFMyMQoaCmYKRpzVX7/z8A "JavaScript (Node.js) – Try It Online") The variable \$i\$ is defined as the result of a bitwise OR between the two values above, and is therefore interpreted as: - 3: space - 2: `|` - 1: `-` - 0: `+` or `T` The expression `(d ? Y : X - 87) > 169` is used to crop the field according to the game type \$d\$ (single or double). The similar expression `(d ? X - 87 : Y) % 169` is used to draw the `T`'s at the appropriate positions.