Warcaby w zmiennej long

0

Mamy na zaliczenie zrobić Warcaby tylko z użyciem zmiennej long - po 2 zmienne na gracza...
udało mi się chyba poprawnie rozpisać zmienne:

        Long white1 = 0b101110100101110110101111001101111011101111101101111111L;
	Long white2 = 0b101101001101101011101101101101101111101110000101110010L;
	Long black1 = 0b100010110100010100100010010100010000100001111100001101L;
	Long black2 = 0b100001011100001001100000110100001100100000010100000000L;
	char pawnWhite = '\u2659';
	char pawnBlack = '\u265f';
	char areaWhite = '\u2b1b';
	char areaBlack = '\u2b1c';
	char queenWhite = '\u2655';
	char queenBlack = '\u265B';

w 1 zmiennej jest zakodowane 6 pionków na 9 bitach wg klucza:
1 bit: czy na planszy (1 na planszy)
2 bit: czy królowka (0 pionek, 1 królowka)
3 bit: kolor (1 biały, 0 czarny)
4,5,6 bity - pozycja y
7,8,9 bity - pozycja x

i teraz przechodzimy do pytania:
jak podzielić ten zapis na poszczególne pionki i wyświetlić konkretny pionek na planszy?

0

Potrzebujesz masek bitowych i operacji przesunięć np jak chcesz wyciągnąć bity 5,6 i 7 to wygląda to mniej więcej (state & 0b1110000) >> 4) (mogę się gdzieś machnąć w przesunięciu o 1 bo od 10 lat tego nie robiłem). Przy programowaniu embedded małych mikrokontrolerów w C toki zapis to standard żeby ustawiać porty i flagi

0
noobek101 napisał(a):

w 1 zmiennej jest zakodowane 6 pionków na 9 bitach wg klucza:

Na marginesie dodam, że to całkiem sensowne kodowanie, ale nie wiem, czy jest sens tak kombinować. W Twoim schemacie mieszasz pionki między zmiennymi, bo teoretycznie możesz mieć biały pionek w czarnej zmiennej, ale wtedy jest niejasne, dlaczego zmienne są rozdzielone na white i black, skoro jest osobny bit do kolorowania pionka.

Prostszym sposobem jest zakodowanie tego jako zmienne whitePawns, whiteQueens, blackPawns, blackQueens, gdzie pojedynczy bit oznacza, czy bierka jest na planszy. Podejrzewam, że o to chodziło autorowi zadania.

Co innego, gdyby chodziło o warcaby polskie, wtedy Twoje podejście będzie lepsze, bo pozwoli na zakodowanie stanu gracza na trzech longach, a w moim potrzebujesz czterech. Przy czym da się zakodować szachy polskie na dwóch longach per gracz w taki sposób:

  • Najpierw zauważamy, że na planszy mamy tylko 50 pól (ignorujemy białe)
  • Potem dzielimy planszę na dwie połówki: górną i dolną. Numerujemy pola od 1 do 25. Na każdą pozycję potrzebujemy 5 bitów
  • Następnie kodujemy bierki z górnej połówki, potem dokładamy separator (5 bitów zerowych), a potem bierki z dolnej połówki. Efektywnie mamy 20 bierek po 5 bitów plus separator = 105 bitów. Zbicie bierki reprezentujemy przez zera, więc jak przy odczycie trafimy na drugi separator, to wiemy, że więcej bierek nie ma.
  • Potem dokładamy 5 bitów na informację, ile jest damek w górnej połówce, potem kolejne 5 na to samo dla dolnej połówki (zakładamy, że bierki kodowaliśmy tak, że najpierw damki).
  • Sumarycznie 115 bitów
0

Dodałbym tylko, że Java ma kolekcję do pracy na bitach, klasę BitSet - zyskujesz bardziej czytelny kod i kilka gotowych operacji bitowych (flip etc). Pod spodem też używa longów.

Tak na szybko przykład użycia:

        final short MOVE_FLAG = 4;
        final short POSITION_FLAG_START = 0;
        final short POSITION_FLAG_END = 3;
        long[] playerA = {0b11111111L};
        BitSet playerFlags = BitSet.valueOf(playerA);

        // get single flag
        System.out.println("player state = " + playerFlags.toLongArray()[0] + ", moving = " + playerFlags.get(MOVE_FLAG));
        playerFlags.flip(MOVE_FLAG);
        System.out.println("player state = " + playerFlags.toLongArray()[0] + ", moving = " + playerFlags.get(MOVE_FLAG));

        // get range of flags
        BitSet playerPositionFlags = playerFlags.get(POSITION_FLAG_START, POSITION_FLAG_END);
        System.out.println("player position = " + playerPositionFlags.toLongArray()[0]);
0

Taki mam wymóg zadania, sekwencja kodowania też jest narzucona...
wyświetlać ma w podanych unicode...
i limit po 2 zmienne long na gracza też jest odgórna...

dlatego tak rozpisałam pozycje pionków... nie mogę zrobić 12 zmiennych long na pionka

w zasadzie kolor zawsze będzie biały dla białych a czarny dla czarnych - więc to się juznie zmieni... zawsze na planszy będzie 12 pionków - tylko coniektóre będą zbite - więc się ich stan zmieni na 0 i nie zostaną wyświetlone na planszy (ale nadal będą zapisane w zmiennej long - więc długosć zmiennej nie będzie ulegać zmianie)

zmieniają się wartości - pionek, królowka (dość rzadko jednak)
i wartosci y,x... - te dane ulegają najczestszej zmianie

trzeba będzie znaleźć sposób żeby pionka z pozycji yyy,xxx przesunąc na nową pozycję yyy,xxx
(z całą walidacją czy ruch jest w ogóle możliwy i czy pionek faktycznie znajduje się na tej pozycji)

1 użytkowników online, w tym zalogowanych: 0, gości: 1