Римляне приближались к Карфагену, и наконец, при Заме, в 5 переходах от Карфагена, сошлись обе армии (202 г.). Армия Ганнибала [из] 50 000 чел. построилась следующим образом: впереди 80 слонов, за ними две линии фаланг в 10 шеренг глубиной, по 12 000 воинов в каждой линии; это были менее надежные, союзные контингенты; в 300 шагах сзади стояла третья линия ветеранов, приведенных Ганнибалом из Италии, – 24 000; кавалерия расположилась на флангах: карфагенская – на левом, а нумидийская – на правом. Третья линия Ганнибала должна была играть роль резерва, т. е. поддержать первые атакой во фланг римлян или же, в случае разбития первых линий, вторично атаковать расстроенные после боя войска противника. Римская армия Сципиона состояла из 6 легионов (по 6200 чел. в каждом: 12 000 гастатов, 12 000 принципов и 6000 триариев), при ней было 12 000 легкой пехоты, 2700 конницы и 4000 нумидов Массинисы; всего 42 000 пехоты и около 8000 конницы. Войска Сципиона построились, по обычаю того времени, в три линии, но манипулы расположились не в шахматном порядке, а в затылок, для пропуска в интервалы слонов. Кавалерия Лелия стала на правом крыле, а Массинисы на левом.
Сражение началось движением вперед карфагенских слонов, но, устрашенные криком римлян, эти животные повернули назад, смяли карфагенскую конницу и привели ее в полнейший беспорядок. Римская кавалерия воспользовалась этим, стремительно ударила на карфагенскую и прогнала ее с поля сражения.
Предстоял бой пехоты. Сципион приказал гастатам сомкнуть интервалы к середине и, имея в полутораста шагах за ними принципов, повел атаку на первую Ганнибала. После упорного боя она была опрокинута и, думая, что вторая линия умышленно ее не поддержала, бросилась на карфагенян, но вскоре наступающие гастаты заставили их опомниться и обратиться на римлян; бой закипел с новым ожесточением, тогда Сципион приказал принципам, разделившись пополам, выйти на фланги гастатов и охватить карфагенян. Это решило участь первых двух линий армии Ганнибала; в страшном беспорядке они бросились назад, угрожая смять третью линию – ветеранов, так что Ганнибал приказал им встретить беглецов оружием.
Наступил решительный момент боя. Сципион, видя, что линия ветеранов Ганнибала длиннее фронта гастатов и может их охватить, приостановил наступление и, разделив вторую и третью линии (принципов и триариев) пополам, приказал им пристроиться к флангам гастатов в виде сплошной фаланги без интервалов. Теперь 30 000—35 000 римлян, фалангою в 10 шеренг глубины, двинулись на 24 000 ветеранов Ганнибала, сотрудников его славных походов, которые были подкреплены псилитами.