В 210 г. до н. э. Ганнибал нанес поражение римлянам во второй битве при Гердонии, а затем война шла в Апулии с переменным успехом. В начале следующего лета Квинт Фабий Максим осадил Тарент, хотя Ганнибал, стоявший в Бруттии, намеревался помешать ему. Марцелл, получивший задание отвлечь Ганнибала, преследовал его до Апулии, где возле Канусия произошло сражение, в котором победили римляне. Когда Ганнибал пришел к Таренту, то город уже был взят Фабием с помощью измены. В 208 г. до н. э. консул Тит Квинкций Криспин попытался захватить Локры, но Ганнибал помешал ему. Тогда Криспин объединился с консулом Марцеллом, чтобы дать Ганнибалу решающее сражение. Однако тот устроил римлянам засаду, в которой погиб один консул, другой был серьезно ранен. После этого Ганнибал попытался хитростью взять Салапию, но ему это не удалось: его замысел был раскрыт.
Свои надежды на продолжение успешной войны в Италии Ганнибал возлагал на соединение со своим братом Гасдрубалом, шедшим из Испании. Консул Гай Клавдий Нерон двинулся против Ганнибала и одержал победу при Грументе. Тем временем Гасдрубал уже был в Италии, но его письмо брату было перехвачено римлянами. Пользуясь ситуацией, два римских консула нанесли поражение войску Гасдрубала, а сам он погиб в бою. Карфаген не имел больше возможности направить войска на помощь Ганнибалу, и ему пришлось покинуть Апулию и Луканию, отступив в Бруттий.
В последние два года для победы в борьбе с Карфагеном Рим сумел собрать значительные силы. Вопреки традициям Римской республики, армия была пополнена заключенными рабами, выкупленными за счет государства. Командующий римской армией консул Публий Корнелий Сципион («Сципион Африканский») перенес театр военных действий в Африку, чтобы вырвать инициативу из рук карфагенской армии. Отличным трамплином для переброски войск в Африку стала Сицилия. В 204 г. до н. э. Сципион с 30-тысячной армией высадился на африканский берег вблизи города Утика.
Карфагенское руководство немедленно обратились к своему самому лучшему полководцу с просьбой вернуться из Европы и защитить свою страну. Летом 203 г. до н. э. Ганнибал получил приказ вернуться в Африку. «Уже без хитростей, уже открыто отзывают меня те, кто давно еще силился меня отсюда убрать, отказывая в деньгах и солдатах, – говорил полководец. – Победил Ганнибала не римский народ, столько раз мною битый и обращенный в бегство, а карфагенский сенат своей злобной завистью. Сципион не так будет превозносить себя и радоваться моему бесславному уходу, как Ганнон, который не смог ничего со мной сделать, кроме как погубить Карфаген, только бы погрести под его развалинами мой дом».
Битва при Заме, 202 г. до н. э.
Осенью 203 г. до н. э. с побережья Сицилии Ганнибал с 24-тысячной армией беспрепятственно отправился в Африку. Прибыв в Африку, Ганнибал вскоре организовал встречу с римским полководцем. Но из-за вероломства карфагенского правительства переговоры оказались безрезультатными (см. раздел 1.3). Стало ясно, что кровопролитие неизбежно.
Решающее сражение произошло при Заме в 202 г. до н. э. Римская армия насчитывала 20–25 тысяч пехотинцев и 6–8 тысяч конников, карфагенская – 35 тысяч пехотинцев, 2–3 тысячи конников и 80 слонов. Боевые слоны являлись грозной силой, но они были совсем недавно доставлены из Центральной Африки и поэтому плохо обучены. Таким образом, явного превосходства не было ни у одной из сторон: у римлян было преимущество в кавалерии, а у карфагенян – в пехоте.
Выбирая расстановку на поле боя, Сципион рассчитывал, что его пехоте придется столкнуться с большим количеством боевых слонов противника. Он специально построил пехотинцев таким образом, чтобы они не были лишены маневренности. В последней линии находились стрелки и лучники, а также вспомогательные войска с дротиками и горящими факелами. По замыслу Сципиона, в случае атаки слонов первая и вторая линии римлян должны были расступиться и дать слонам проход к последней линии, где они бы попали под плотный обстрел. Нумидийская конница построилась на флангах.