1. Python / Говнокод #27192

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    board = [" ", " ", " "], \
            [" ", " ", " "], \
            [" ", " ", " "]
    
    i = 1
    win = True
    place_chek = True
    
    
    def show():
        print("---------")
        print("|" + board[0][0] + "  " + board[0][1] + "  " + board[0][2] + "|")
        print("|" + board[1][0] + "  " + board[1][1] + "  " + board[1][2] + "|")
        print("|" + board[2][0] + "  " + board[2][1] + "  " + board[2][2] + "|")
        print("---------")
    
    
    def move(i):
        if i % 2 == 0:
            return "X"
        else:
            return "0"
    
    
    def choise(x, y):
        board[x][y] = move(i)
    
    
    def repeat(x, y):
        global i
        global place_chek
        if board[x][y] == "0":
            print()
            print("Choose another location")
            print()
            place_chek = False
    
        elif board[x][y] == "X":
            print()
            print("Choose another location")
            print()
            place_chek = False
    
        elif board[x][y] == " ":
            i = i + 1
            place_chek = True
    
    
    def win_check():
        global win
        if board[0][0] == board[0][1] == board[0][2] == "X" or \
                board[1][0] == board[1][1] == board[1][2] == "X" or \
                board[2][0] == board[2][1] == board[2][2] == "X" or \
                board[0][0] == board[1][0] == board[2][0] == "X" or \
                board[0][1] == board[1][1] == board[2][1] == "X" or \
                board[0][2] == board[1][2] == board[2][2] == "X" or \
                board[0][0] == board[1][1] == board[2][2] == "X" or \
                board[0][2] == board[1][1] == board[2][0] == "X":
            print("X won")
            win = False
    
        elif board[0][0] == board[0][1] == board[0][2] == "0" or \
                board[1][0] == board[1][1] == board[1][2] == "0" or \
                board[2][0] == board[2][1] == board[2][2] == "0" or \
                board[0][0] == board[1][0] == board[2][0] == "0" or \
                board[0][1] == board[1][1] == board[2][1] == "0" or \
                board[0][2] == board[1][2] == board[2][2] == "0" or \
                board[0][0] == board[1][1] == board[2][2] == "0" or \
                board[0][2] == board[1][1] == board[2][0] == "0":
            print("0 won")
            win = False
    
    
    show()  # first time show
    
    while win:
        x, y = input("Enter the coordinates: ").split()
        repeat(int(x) - 1, int(y) - 1)
        if place_chek:
            choise(int(x) - 1, int(y) - 1)
        show()
        win_check()

    Крестики нолики на питоне. Самый большой позор это способ определение победы, не смог ничего придумать и сделал такой позор

    Запостил: warzon131, 03 Января 2021

    Комментарии (63) RSS

    • Какой анскилл )))
      Ответить
      • Я не смог ничего лучше придумать, чем через ифы делать
        Ответить
        • Бля, мне так ссать охота... Открой свой рот )
          Ответить
    • Стыдно признаться, но я тоже так до сих пор и не узнал, как правильно проверять победу в крестиках-ноликах. Какой багор )))
      Ответить
      • В каком смысле правильно?
        Ответить
      • https://gist.github.com/j123123/bee7141f5690709d478a1c3f832fea28#file-tic_tac_toe-c-L252
        Вот, держи проверку. Писал эту хуиту хрен знает когда.
        Ответить
      • Как-то так?
        int c[8] = {0};
        
        // who and return value are 1 for X and -1 for O
        int check_move(int who, int x, int y) {
            const int m[3][3] = {{0x19, 0x21, 0xC1}, {0x12, 0xAA, 0x42}, {0x94, 0x24, 0x4C}};
            for (int i = 0, j = m[y][x]; i < 8; ++i) {
                if (j & 1) {
                    c[i] += who;
                    if (c[i] * who == 3)
                        return who;
                }
                j >>= 1;
            }
            return 0;
        }
        Ответить
        • Я думал, ты решение на матрицах построишь
          Ответить
          • Ну это практически и есть умножение на матрицу. Только битоёбское.
            Ответить
            • Мне кажется, в настоящем битоёбском решении можно обойтись тремя short int'ами.

              Правда, в крестиках-ноликах троичная логика, сцук
              Ответить
              • хуйню написал, не три, а восемь, получится вариация твоего решения

                можно сделать ынтерпрайзненько: восемь бакетов для каждой "линии", добавлять в них закрашенные клетки, проверять по добавлении в бакет, сколько в нём клеток и какого они цвета. ну и фабрикой всё сверху обмазать, чтобы не вызывать подозрений
                Ответить
                • > ынтерпрайзненько

                  В один SQL (или NoSQL) запрос из таблички где все исходы перечислены. Там всего 20к вариантов где-то.
                  Ответить
              • Ответить
      • // x, y \in [0, 2]
        uint32_t pos(int x, int y) {
          return 1 << (x + 3 * y);
        }
        
        bool wins(uint32_t bits) {
          uint32_t arr[] = {0x7, 0x38, 0x1c0,
                            0x49, 0x92, 0x124,
                            0x111, 0x54};
          for (auto i : arr) {
            if((bits & i) == i)
              return true;
          }
          return false;
        }
        
        enum who
          { X = 0,
            Y = 1
          };
        
        struct board
        {
          uint32_t x_bits = 0;
          uint32_t o_bits = 0;
        
          void move(who who, int x, int y) {
            if(who == X) {
              x_bits |= pos(x, y);
            } else {
              o_bits |= pos(x, y);
            }
          }
        };


        Как-то так? Мог наврать с константами.
        Ответить
        • > X = 0, Y = 1

          На пустом поле крестики выигрывают? А тьфу, у каждого своя битмаска.

          Всё, ты выиграл.
          Ответить
          • Хм, потестил и никто на пустом поле не выигрывает вроде.
            Ответить
        • Блин, в enume должен быть O, а не Y, конечно.
          Ответить
          • Лол, я тоже в своём коде Y вместо O написал сначала.
            Ответить
    • Похоже, впилить восемь явных проверок и есть правильное решение.
      Ответить
      • Ну, по крайней мере его легко написать и проверить.
        Ответить
      • // X = 0x01, O = 0x04
        int check_win(int f[9]) {
            const uint32_t m = {
                0x01001001, 0x00010001, 0x10100001,
                0x00001010, 0x11010010, 0x00100010,
                0x10001100, 0x00010100, 0x01100100
            };
        
            uint32_t c = 0;
            for (size_t i = 0; i < 9; ++i)
                c += f[i] * m[i];
        
            for (size_t i = 0; i < 8; ++i) {
                if ((c & 0x0F) == 0x03)
                    return 0x01;
                if ((c & 0x0F) == 0x0C)
                    return 0x04;
                c >>= 4;
            }
            return 0x00;
        }
        Ответить
        • Оптимизнём немного финальную проверку:
          c = ((c & 0xAAAAAAAAu) >> 1) & (c & 0x55555555u);
          if (c & 0x11111111u)
              return 0x01;
          if (c & 0x44444444u)
              return 0x04;
          return 0x00;
          Есть идеи как if убрать?
          Ответить
          • О, можно дальше закомпрессить биты:
            c = ((c & 0xAAAAAAAAu) >> 1) & (c & 0x55555555u);
            c = ((c & 0xFFFF0000u) >> 16) | (c & 0x0000FFFFu);
            c = ((c & 0x0000FF00u) >> 8) | (c & 0x000000FFu);
            c = ((c & 0x000000F0u) >> 4) | (c & 0x0000000Fu);
            return c;
            Всё нах, ни одного условия больше не осталось. Хоть в FPGA заливай.
            Ответить
    • Вообще, конечно, я всё-таки надеялся на универсальное решение для произвольного размера поля. В сущности, нам нужно просто проитерироваться по все горизонталям и всем вертикалям (ну и диагонали можно отдельным случаем прописать). А вот как это сделать красиво, а не двумя разными циклами — я так и не придумал.
      Ответить
      • > для произвольного размера поля

        Ну там лучше просто пробежаться в 8 сторон от последнего хода да посмотреть набралось ли сколько надо.
        Ответить
        • > в 8 сторон от последнего хода
          Хм, а и правда, просто, красиво и эффективно. Спасибо!
          Ответить
          • У j123123 вроде так и работает. Но я не вчитывался.
            Ответить
          • const int dx[8] = { 1, 1, 0, -1, -1, -1, 0, 1};
            const int dy[8] = { 0, 1, 1, 1, 0, -1, -1, -1};
            
            int c[4] = {0};
            for (int i = 0; i < 8; ++i) {
                int x = last_move.x, y = last_move.y;
                while (get(x, y) == who) {
                    c[i % 4] += 1;
                    x += dx[i];
                    y += dy[i];
                }
            }
            
            for (int i = 0; i < 4; ++i) {
                if (c[i] > length_to_win)
                    // текущий игрок подебил
            }
            Как-то так наверное.
            Ответить
            • За пределы доски вылез.
              Ответить
              • В бесконечных крестиках конец доски обычно конец тетрадного листа
                Ответить
                • Ок, в теории get(x, y) может уметь в бесконечность.
                  Ответить
                • Надо чтоб тороидальные крестики-нолики. В трёх измерениях.
                  Ответить
                  • > В трёх измерениях.

                    Казуальщина какая. В 26 измерениях из которых 22 закольцованы, а последнее -- время.
                    Ответить
                  • Тороидальные крестики-нолики привлекут избыточно внимания лектора
                    Ответить
                    • У меня когда то был сони-эрикссон (привет, Снаут) кнопочный, где были крестики нолики на 5 подряд, любимая игра на толкане тащемта
                      Ответить
              • > За пределы доски вылез.

                get() просто вернёт пустоту там и цикл остановится.
                Ответить
            • Тебе хоть евроцент заплатят за этот код?
              Ответить
              • Надо патреон завести.
                Ответить
                • Онлифанс же
                  Ответить
                  • Ну, https://www.twitch.tv/directory/all/tags/a59f1e4e-257b-4bd0-90c7-189c3efbf917, где всякие разные люди программируют и занимаются прочей околоайтишнёй, уже существует. Думаю, спрос на прямой эфир с программист(ом|кой) в программистских носочках будет ого-го какой!
                    Ответить
                    • Пойихалы
                      Ответить
                    • Наш исследовательский отдел провёл небольшое исследование в исследовательских целях и наткнулся на «https://onlyfans.com/[отключение индексации]programmer_girl». Тьфу, блин, всё, всё уже придумано до нас! Что за невезуха.
                      Ответить
                      • Т.е. ты предлагаешь, чтобы борманд! за деньги! распространял! свои дикпики! где-то ещё на других ресурсах???
                        Ответить
                        • Ну зачем же сразу так вульгарно! Можно для начала ограничиться скриншотами IDE с кодом.
                          Ответить
                          • > скриншотами IDE с кодом

                            Да ну, это ведь намного более личное, чем дикпики.
                            Ответить
                          • З.Ы. Ты ещё предложи снять дамп и показать бектрейсы.
                            Ответить
                            • Я медленно снимаю дамп, он слегка влажный и пахнет мной
                              Ответить
                              • s/мной/сегфолтом/
                                Ответить
                                • Почему сразу сегфолтом. Необязательно нужен сегфолт, чтобы поебаться. Даже айтишнику
                                  Ответить
                            • Охх, твой бектрейс такой большой, что не влезает в буфер обмена
                              Ответить
                              • кто-то давно кучу не чистил, я посмотрю
                                Ответить
                              • Мой программатор наполнил твою тесную 32-килобайтную флеш-память тёплой только что скомпилированной прошивкой.
                                Ответить
                              • это шутка про J2EE?
                                Ответить
                            • Зы
                              Ответить
                              • Пока читал коммент, случайно уронил свой резиновый фаллос в унитаз... Достать его мне стоило неимоверных моральных страданий.
                                Ответить
              • три рупии

                а чего добился ты?
                Ответить

    Добавить комментарий