О ходе битвы имеются лишь общие, неполные летописные данные, поэтому многие вопросы, касающиеся действий войск противников на поле боя, остаются невыясненными или дискуссионными. Ясно одно: оба войска много маневрировали. Можно также утверждать, что основная борьба во второй фазе сражения развернулась на флангах. Крестоносцы нанесли главный удар по правому флангу союзников, состоявшему из литовско-русских хоругвей и татарской конницы. Легкая конница и татары встретили удар крестоносцев и побежали (по одним сведениям), но, скорее всего, пустились в за-манное бегство, выводя рыцарей под удар второй и третьей линий. Этот маневр, возможно, был позаимствован Витовтом у татар, а может быть, и у Дмитрия Донского, но применен им в других обстоятельствах. На Куликовом поле русские войска, таким образом, выводили ордынское крыло атаки под удар засадного полка, когда главные силы Мамая уже спешились. У магистра не было пехоты, и рыцари были на конях. Поэтому он мгновенно нарастил силу удара, вынудив хоругви второй и третьей линии войск Витовта отступить, а некоторые и побежать. В то же время обозначился успех польских хоругвей, и, казалось, наступило некое равновесие.
Магистр, однако, наращивал давление, и битва вступила в третью фазу. Правый фланг литовско-русских хоругвей оказался разорванным. Рыцари отбросили его к селу Ульново и взяли в окружение. Самый страшный удар крестоносцев, имевший целью расчленить союзные войска и разгромить их поодиночке, приняли Смоленская, Оршанская и Мстиславская хоругви (так называемые смоленские полки) под общим командованием князя Юрия Мстиславского. Находясь на стыке войск Ягайло и Витовта, яростно и умело отбиваясь от наседавшего противника, неся страшные потери, они стали пробиваться из окружения в сторону польской армии. В это время магистр нанес удар по польскому флангу и приостановил его наступательные действия. Литовско-русские хоругви продолжали вести тяжелый бой в окружении. Крестоносцы достигли литовско-русского лагеря. Часть войск Витовта укрылась среди резервных отрядов в лесу, а часть бросилась врассыпную, увлекла за собой крупные силы тевтонцев на своем левом фланге, которые непредусмотрительно пустились в погоню в северо-восточном направлении, нанося большие потери преследуемым войскам, но одновременно залезая в их оперативный мешок.
Наконец, смоленские хоругви ценой огромных потерь (одна из них была разбита полностью) сумели прорвать фронт окружения и пробиться к правому польскому флангу, а польские хоругви в свою очередь вошли в прорыв им на помощь. Витовт же на северном фланге вскоре сумел остановить наступление тевтонских рыцарей, ударив им в тыл силами резервных хоругвей, и добился окружения под Ульново значительного количества крестоносцев, большинство из которых там и погибли. Есть все основания полагать, что эта контратака литовско-русской конницы не была спонтанной, а, скорее всего, заранее спланированной Витовтом, как часть его плана организации сражения и разгрома противника. Особенно отличился в этом бою полоцкий воевода Иван Немира. Положение на литовско-русском фронте приобрело для рыцарей угрожающий характер. Фронт союзных войск в основном удалось восстановить, а битва перешла в четвертую фазу.
Эти события отвлекли силы крестоносцев от польского левого фланга, но ненадолго. Вскоре положение на нем резко обострилось, так как удар Ордена во фланг польской кавалерии принес успех. Основной бой сдвинулся от Ульнова к Людвигову. В ходе яростной кавалерийской битвы, во время которой сам великий магистр Ульрих фон Юнгинген трижды пробивался сквозь польские порядки, тевтонцы прорвались к самому Ягайло, а рыцарь Леопольд фон Кёкритц попытался даже убить польского короля, но тот отбился и сумел ранить нападавшего, а секретарь Ягайло добил его. Был ранен также командир чешского отряда Ян Жижка (позже непобедимый предводитель гуситов) — у него вытек глаз. Чехи запаниковали и стали отступать. Один из крестоносцев убил польского знаменосца. Красный штандарт с белым орлом беспомощно упал на землю. По рядам крестоносцев пронесся крик восторга и орденские «братья» хором запели победную орденскую песню Christ ist erstenden (Христос воскресе).