Эту непростую ситуацию отлично понимал великий полководец, но совершенно не осознавал карфагенский сенат. И под давлением политиков Ганнибал вынужден был согласиться определить судьбу войны в последнем, решающем сражении. Осенью 202 года до н. э. обе армии заняли боевые позиции недалеко от местечка Зама, в ста-ста пятидесяти километрах западнее Карфагена.
На поле боя Сципион поставил впереди манипулы гастатов, на некотором расстоянии один от другого, за ними – принципов, но не напротив промежутков в передних рядах, а за самими гастатами, чтобы иметь возможность пропустить через эти интервалы вражеских боевых слонов. Последними стояли триарии – испытанные ветераны. Манипулы триариев были немногочисленны, каждый состоял всего из одной центурии, но это была грозная сила, потому что в бою один ветеран стоил нескольких молодых солдат. Конница построилась на флангах. Особенно сильной была ее нумидийская часть, так как нумидийцы умели маневрировать с невероятной быстротой. Они утомляли неприятеля беспрерывными атаками, нападая со всех сторон. Карфагеняне выдвинули слонов, отряды наемников и легкую пехоту вперед, а вторую линию, в основном вновь набранное карфагенское ополчение, расположили в двухстах метрах за первой. Ганнибал решил отвлечь с поля сражения конницу противника, а затем окружить римскую пехоту. В случае неудачи он рассчитывал отвести карфагенскую армию в укрепленный лагерь. В третьей линии стояли ветераны Ганнибала.
Бой начали карфагеняне одновременной атакой кавалерии с флангов и слонов в центре. Римская кавалерия, более многочисленная и сильная, конечно, отбросила конницу карфагенян и бросилась в погоню, быстро исчезнув из поля зрения. Так расчет Ганнибала удался, и численный перевес на поле боя перешел к нему. В это время в центре римлян атаковали слоны. Но Сципион назначал для борьбы с ними специальных метальщиков, которые метали в слонов дротики и производили сильный шум с помощью труб и рожков, пугая животных. В результате слоны повернули назад и стали топтать свою же пехоту. Ганнибал продолжил пехотную атаку в центре. Но первую линию войск Ганнибала составляли многочисленные отряды наемников; они не сумели выдержать рукопашной борьбы с легионерами, а также неожиданной атаки собственных отступающих слонов, и быстро бежали, обтекая фланги двигавшейся вслед за ними второй линии карфагенской армии.
Здесь шли хорошо вооруженные фаланги карфагенских граждан и македонян – союзников Карфагена. Копьеносцы второй линии армии Ганнибала разогнали бегущих перед ее фронтом наемников и нанесли сильный удар гастатам. Римская пехота приостановилась. При этом Ганнибал начал охватывать фланги противника своей третьей, самой сильной линией, состоящей из ветеранов, сражавшихся с ним пятнадцать лет в Италии. Этот прием Ганнибал применял во многих сражениях; выдвижение и охват флангов противника отборными частями пехоты всегда обеспечивали ему успех. Но Сципион сделал почти одновременно аналогичный ход, то есть выдвинул на фланги своих принципов (воинов второй линии) и триариев (воинов-ветеранов третьей линии). Это были равные противники. Завязалось кровопролитное фронтальное столкновение пехоты. Стороны были почти равны по численности и воодушевлению, а также по вооружению и храбрости, поэтому «исход битвы долгое время оставался неясным, ибо сражавшиеся считали своим долгом держаться на своих местах до последнего издыхания», – писал Полибий. Но в этот момент после преследования противника вернулась римская конница. Конники Масиниссы быстро сориентировались на поле боя и неожиданно ударили в тыл карфагенянам. Это решило исход сражения.