Siły po obu stronach były wyrównane, gdyż większa liczebność wojsk polskich zrównoważyła lepsze uzbrojenie i wyszkolenie wojsk krzyżackich.
Jak podaje Jan Długosz, przed rozpoczęciem batalii trzystu najemnych żołnierzy czeskich wycofało się bez wiedzy króla z pola bitwy. Zawrócili jednak, gdy podkanclerzy Królestwa Polskiego, napotykając ich na swojej drodze, wypomniał im strach przed wojskami zakonnymi. Mimo to podczas bitwy, najemnicy z Czech i Moraw z chorągwi św. Jerzego, ponownie opuścili plac boju pod namową swojego dowódcy Jana Sarnowskiego. Również tym razem dostrzegł ich Mikołaj Trąba i oskarżył Jana o zdradę pozbawiając go dowództwa nad chorągwią.
W przebiegu bitwy można wyróżnić trzy fazy:
na początku bitwy lekka jazda tatarska rozpoznała walką umocnienia krzyżackie na polu bitwy (wilcze doły).
II faza bitwy rozpoczęła się późnym przedpołudniem atakiem jazdy krzyżackiej, która odepchnęła w zażartej walce wojska litewskie (40 chorągwi) pod wodzą wielkiego księcia Witolda w kierunku gęstego lasu. Ta tzw. ucieczka Litwinów, zgodnie z niektórymi wersjami pozorowana, związała w pościgu poważne siły zakonne, które wróciły na główne pole bitwy, pewne zwycięstwa, już po jej rozstrzygnięciu.
w III fazie nastąpił decydujący atak polskiej ciężkozbrojnej jazdy (50 chorągwi), która rozerwała zasadniczy korpus sił krzyżackich oraz umożliwiła przeprowadzenie decydującego ataku lekkiej jazdy i ukrytej w zaroślach i lesie piechoty.
Bój trwał sześć godzin. Przewagę na placu boju miały praktycznie cały czas (oprócz fazy II, kiedy nieco zaskoczone siły zbrojne unii polsko-litewsko-ruskiej dały się zepchnąć do defensywy) wojska dowodzone przez króla Polski.