Pierwsza połowa jest jedna, druga połowa jest inna. Możesz to sobie rozbić na dwie niezależne pętle wewnętrzne (jedną do rysowania pierwszej, a drugą do drugiej połowy); możesz w ramach wspólnej pętli dokonywać sprawdzenia — czy aktualny iterator (u ciebie — b
) jest większy czy nie od połowy rozmiaru (u Ciebie — p
). To pierwszy warunek. Drugim jest to, żeby się zamieniały co wiersz — w wierszach parzystych masz jeden wzór, w nieparzystych przeciwny.
Jeśli nie wiesz, jak to od razu zapisać ładnie, możesz rozpisać sobie najpierw wszystkie cztery przypadki — parzysty wiersz, pierwsza połowa; parzysty wiersz, druga połowa; nieparzysty wiersz, pierwsza połowa; nieparzysty wiersz, druga połowa. A potem, jak już to Ci będzie działać, odpowiednio spiąć te warunki, dla krótszego i czytelniejszego kodu.