from JMSSGraphics import *
from JMSSNeural import *

jmss = Graphics(width = 350, height = 350, title = "Xs or Os", fps = 60)

n = 8
side_length = 32
margin = 8
border = 16

pixels = [0] * n * n

# paste your neural network below
# network = 
network = [[[0.18920183906168397, 0.15410870491040546, 0.8571238068516918, 0.15193473076008882, 0.4789679198383958, 0.6885945497295063, 0.5566504634791333, 0.5026822295569965, 0.6718049510076989, 0.25111872739742047, 0.8549269581916504, 0.9655671337051487, 0.9590304312234759, 0.5712585206454855, 0.393091086595693, 0.48081364682071687, 0.5194073122603695, 0.04287089179908621, 0.9113811688274268, 0.7270350156175024, 0.09246401414861441, 0.8690109903424902, 0.7107221730771004, 0.17227105669166928, 0.4428406702074038, 0.40035239444100357, 0.2578870780732595, 0.8034451314837548, 0.2699127451495284, 0.848632377274839, 0.03158658835021079, 0.6737394270413648, 0.7267700634606528, 0.7222759464519166, 0.8205480980795217, 0.3832710119359293, 0.20698459154998214, -0.0035262364220516253, 0.03507645766292355, 0.8397933692100698, 0.6725900844550953, 0.47400499480381525, 0.22810238920550738, 0.43781762460721285, 0.046275783044945014, 0.9196562580508477, 0.08900327559014411, 0.03182618484160023, 0.4749077974922429, 0.5473623114187135, 0.6057556862510705, 0.4698274475858403, 0.5335412707840766, 0.3730496929882104, 0.33570282116008454, 0.8058943589344976, 0.35709143558714923, 0.205569790621008, 0.728217832862885, 0.4135348276234174, 0.8586031442877876, 0.5615042339432054, 0.4664977540562996, 0.7590401906000674, 0.6181811091387626], [-5.504598465128638, -1.0071496217551927, 0.43101880115062674, 3.814374450237836, 3.5962085220740856, 1.4968553292926539, 0.5676793353741408, -5.160032651616136, 3.159786289848107, -0.3575965051522642, 2.019938417397444, 1.654458081139169, -1.650506694545178, -0.8953165699887383, -0.8880467082609035, -0.5373753536041144, -0.3616487704819165, 3.7597998120321416, -1.9891986334940606, 0.027415961671704975, -0.6025730756497958, 2.084492722240571, -0.4651115979298746, 0.5918047550396585, -0.35169279190439384, 0.18517984355375838, -3.157818869929539, -2.7216547259421096, -3.843847036296891, -4.002328018469054, -0.780528231973448, 0.5094049797022171, 8.532170998903215, 3.705757752355411, 2.1778175762452654, -1.8528143902156766, -2.017709012858156, 1.3869003354901748, 1.687901552870779, 0.9466054324860506, 1.2806546960133809, 0.7837806321471666, 0.9483324841641998, -1.927774864045199, 1.3960268490045367, 0.6481187573297333, -0.010856305744984354, 2.0809847327148865, 0.952100185335116, -0.47715733334733607, -0.10286805902794698, -0.898964003402708, -0.8148919784642622, -1.9881797685061586, -0.9931355776582681, 0.8600505858467609, -3.1873276635722467, 1.1373212897281426, 2.445894036471882, 0.41175323312084533, -0.5257948446833856, 6.112656912866969, -0.41071816150580065, -0.2752105526997954, -1.8222938180261263], [0.7542619375641441, 0.3440883090715849, 0.870747718251484, 0.9792246814495661, 0.7134127463603056, 0.8112991934421078, 0.18672370759100781, 0.968184679181307, 0.39618259445744614, 0.1695699355435361, 0.10457597382323598, 0.13486889795486737, 0.29673657809485654, 0.43039352001769476, 0.8824670690893699, 0.22462490744208835, 0.374324488856293, 0.5345749228857539, 0.3671243691614689, 0.3474096135360802, 0.6666876651348836, 0.22724377219086225, 0.059187161340184674, 0.4840377741041175, 0.9263089292847473, 0.8106275422320122, 0.3791112144012267, 0.28206586877457557, 0.8412261800669575, 0.6556972134511464, 0.6332450839153271, 0.15879382574736806, 0.4026713570691467, 0.3898072627216699, 0.2548289299719031, 0.7959731097955215, 0.178377388167356, 0.049134368250196764, 0.8889055298918516, 0.8964042253449441, 0.040275239318414646, 0.8551039032041853, 0.5592533381142016, 0.8223336252669796, 0.2826902054318747, 0.7149671453926287, 0.18201385889221539, 0.495952583750339, 0.9082715008313097, 0.764691374481073, 0.8400757532981257, 0.9271894241649135, 0.006948695724613557, 0.7288919201429259, 0.08966129840224683, 0.32041355474957783, 0.29004182254889704, 0.3155622391007272, 0.9018270334470366, 0.28121003084228613, 0.19770876757746816, 0.282350980384288, 0.36563747138306746, 0.1764077405845795, 0.5921803910239218], [0.1507294166851807, 0.28766363204844353, 0.9415823532136179, 0.6507570739480582, 0.8180070520973052, 0.4044945450732299, 0.40126605004696, 0.2385688404207961, 0.1376811788230906, 0.7881309210953036, 0.49480390262823876, 1.016059832446209, 0.28260494818049203, 0.5157856584951882, 0.8332460019530551, 0.36885518445673376, 0.8483070165122245, 0.5053046652161233, 1.3882965043369364, 0.7498064708278611, 1.0049303913579546, 0.5389518926944624, 0.9378859539493607, 1.0789994924121682, 0.44957227327622773, 1.1309819561481533, 1.0870524203338912, -0.02897205307305006, 0.14623474762691377, -0.6155788675715379, 1.1090786684589167, 0.5118843258517386, 0.07378038387878237, 0.6551755543683093, -0.35349789350229466, 0.14838650796680639, 1.8589928280163979, -0.6627375578204492, 0.5796145868468061, 0.4286140327219891, 0.4718641972213007, 1.2690660322895493, -0.24474107168830453, -0.3910994425443623, 0.5949388501194158, -0.8417199812383758, 0.2959720621139547, 0.2351665957565698, 0.6354006785380746, 1.081199546333328, 0.43247730150322855, -0.9227202674729271, -0.22980561101156466, -0.594436403358928, 0.6734680952594091, 0.6770640064498472, 0.5712839991091574, 0.6892806235021613, 0.6990396070535094, 0.6430292972991799, 0.9630146893490799, 0.2966163711186777, 0.5220188504514385, 0.783162370942839, 0.5872365146389235], [0.7394951489464057, 0.6248672898997923, 0.17341334606136674, 0.3050429445670081, 0.7117736196557826, 0.1566143117460043, 0.36076484054459834, 0.18630295991245252, 0.5301909241041957, 0.1281954263492606, 0.28671424693598757, 0.41120902812630394, 0.4123560922478415, 0.22941547771070953, 0.5868598655532964, 0.1994328836263478, 0.24793358698830387, 0.3650711242977717, 0.5617563793014766, 0.7290995741480836, 0.8939607983350227, 0.6664468414696373, 0.5071108063122204, 0.33639353602018063, 0.24163634552760468, 0.9081622930353181, 0.3169678444050354, 0.5260497935215279, 0.03814844977138351, 0.7103779276295511, 0.5032810360085718, 0.09759131163768348, 0.5476156195755015, 0.8692063631623661, 0.11064582553782008, 0.7654800483702737, 0.7293958459719515, 0.811809526544262, 0.9942532834838813, 0.8321975416837745, 0.9813655577918674, 0.8125786815930905, 0.8473502469526195, 0.267883155848715, 0.12923437933334875, 0.25769736303011137, 0.2617417733144688, 0.5105951116305326, 0.3053164530061859, 0.3893095615166776, 0.21638038152904943, 0.1912344055589393, 0.17719260027035535, -0.06401043627644308, 0.5962168660824024, 0.8976602732065782, 0.05295013542773663, 0.9302487212523486, 0.3351177475658646, 0.3847025947881891, 0.5626560166191379, 0.22356463607614388, 0.5860069365355539, 0.31598636146865877, 0.722441386649209]], [[-1.3702729867481334, -12.960655620134407, -1.1756933832571792, 8.93297155237595, -1.031558545885433, -0.6788435580143103]]]

@jmss.mainloop
def Game():
    global pixels
    jmss.clear()

    if jmss.isKeyDown(KEY_SPACE):
        pixels = [0] * n * n

    mouse_pos = jmss.getMousePos()
    x = (mouse_pos[0] - border) // (side_length + margin)
    y = (mouse_pos[1] - border) // (side_length + margin)

    if jmss.isKeyDown(KEY_A):
        if not(x < 0 or x >= n or y < 0 or y >= n):
            pixels[y * n + x] = 1

    if jmss.isKeyDown(KEY_ENTER):
        prediction = nn_predict(network,  pixels)[0]
        letter = "X" if prediction > 0.5 else "O"
        jmss.drawText("Prediction: " + letter +" , output: " + str(prediction), 0, 0)
        
    for x in range(n):
        for y in range(n):
            jmss.drawRect(border + x * (side_length + margin), \
                          border + y * (side_length + margin), \
                          border + x * (side_length + margin) + side_length, \
                          border + y * (side_length + margin) + side_length, \
                          r = pixels[y * n + x], \
                          b = 1 - pixels[y * n + x], \
                          g = 0)
                            

jmss.run()
