В 216 году при Каннах состоялось большое сражение, в ходе которого римская армия под командованием Варрона и Эмилия потерпела поистине сокрушительное поражение. Ганнибал умело построил свою армию и решительно атаковал римское войско. Используя свою многочисленную и маневренную легкую конницу, полководец окружил и уничтожил главные силы врага. В битве при Каннах пали около 50 тысяч римских воинов, не считая 6 тысяч пленных; карфагеняне же потеряли всего около 7 тысяч человек.
Однако блестящая победа карфагенской армии при Каннах не сломила республиканского Рима и не привела к распаду римско-итальянского союза, на что так надеялся Ганнибал. Его настойчивая просьба прислать из Карфагена подкрепление осталась без ответа. Он мог рассчитывать только на собственные силы, которые с каждым боевым столкновением с римлянами неумолимо уменьшались.
Не получив подкреплений из Карфагена, Ганнибал обратился за помощью к младшему брату, Гаструбалу, командовавшему карфагенскими войсками в Испании. Тот откликнулся на его призыв, но о перемещении войск Гаструбала стало известно римскому полководцу Клавдию Нерону. В 207 году римляне устроили противнику засаду у реки Метавр и разбили его.
В доказательство своей победы они прислали Ганнибалу отрубленную голову брата. Однако он и не думал покидать Италию, продолжая с большим упорством вести боевые действия. Тем временем тактика Рима, направленная на затягивание войны и истощение сил карфагенской армии на итальянской земле, стала давать свои результаты. Оторванность от тыловых баз поставила войска Ганнибала в крайне затруднительное положение.
В 204 году он получил известие о том, что римский полководец Сципион вторгся в Карфаген. Это заставило Ганнибала уйти из Италии и вернуться на родину. Постепенно Римская республика стала захватывать инициативу в войне. Римляне одержали ряд побед над карфагенянами и их союзниками в Сицилии, Испании и самой Италии. Карфагенский военный флот уже не был в состоянии вести войну на Средиземном море. Во время взятия римскими войсками сицилийского города Сиракузы был убит великий ученый Древнего мира Архимед.
Вернувшись на родину после 16 лет отсутствия, Ганнибал собрал новую армию и в марте 202 года сразился со Сципионом Африканским при Заме. Если раньше карфагенский полководец побеждал неприятеля за счет преимущества своей конницы, то на сей раз она уступила лучше организованной римской. В сражении при Заме армия Карфагена потеряла 10 тысяч человек, в то время как победители – всего 1500 человек. Разгромивший Ганнибала римский полководец получил тогда прозвание Сципион Африканский.