В 217 году до н. э. на берегах Тразименского озера произошло сражение между армией Ганнибала и 40-тысячным войском римского консула Фламиния. Римляне попали в засаду, коварно устроенную карфагенянами неподалеку от Тразименского озера. Армия во главе с Фламинием выступила в путь в предрассветном тумане, не произведя разведки. Балеарские стрелки, африканская пехота и пешие галлы неожиданно напали с гор на колонну римлян. В результате 15 тысяч римских легионеров, в том числе и Фламиний, погибли. Остатки армии разбежались или были уничтожены преследователями. После сражения победители опустошили плодородную Кампанию, а ее население бежало в Рим.
Ганнибал продолжил наступление на юг Апеннинского полуострова. В столкновениях с римлянами его армия неизменно демонстрировала слаженные действия пехоты и конницы, да и противостоять боевым слонам римляне так и не научились.
В 216 году до н. э. произошла крупная битва при Каннах, в которой римские войска под командованием Варрона и Эмилия потерпели сокрушительное поражение. Ганнибал, умело построив свою армию, решительно атаковал римские легионы (карфагеняне были выстроены в форме серпа, в центре которого находилась пехота, а по краям — африканская конница). Используя маневренную легкую конницу, полководец окружил и уничтожил главные силы неприятеля. В битве при Каннах погибло около 50 тысяч римских воинов и 6 тысяч были взяты в плен; карфагеняне же потеряли 6 тысяч человек.
После разгрома римской армии Ганнибалу представилась прекрасная возможность пойти на Рим — он находился всего лишь в 130 километрах и впереди не было значительных сил римлян, — но полководец ею не воспользовался. Когда же его войска появились недалеко от Вечного города, была уже вновь сформирована многочисленная римская армия.
Победа карфагенской армии Ганнибала при Каннах не сломила республиканский Рим и не привела к распаду римско-итальянского союза, на что очень надеялся полководец. Его обращение к совету старейшин с настоятельной просьбой прислать из Карфагена подкрепление осталось без ответа. Он мог рассчитывать только на собственные силы, которые после каждого боевого столкновения с римлянами ощутимо уменьшались.
Не получив подкреплений из Карфагена, Ганнибал обратился за помощью к младшему брату Гасдрубалу, командовавшему карфагенскими войсками в Испании. Тот откликнулся на его призыв, но о переходе войск Гасдрубала стало известно римскому полководцу Клавдию Нерону. В 207 году до н. э. римляне устроили засаду у реки Метавр и разбили карфагенян, а в доказательство своей победы отрубили Гасдрубалу голову и послали Ганнибалу.
Но уйти из Италии и вернуться на родину Ганнибала заставило полученное в 204 году до н. э. известие о том, что римский полководец Сципион вторгся в Карфаген. Постепенно Римская республика перехватила инициативу в войне. Сенат, чтобы увеличить численность римской армии, объявил набор в нее годных для военной службы свободных граждан, начиная с 17-летнего возраста. Кроме того, государство выкупило 8 тысяч молодых рабов, пообещав им свободу, если они вступят в армию.
Впоследствии римляне одержали ряд побед над карфагенянами и их союзниками в Испании, на Сицилии и в самой Италии. Карфагенский военный флот уже не мог вести войну в Средиземном море. Во время взятия римскими войсками сицилийских Сиракуз был убит великий ученый древности Архимед.
Ганнибал, вернувшись на родину после 16 лет отсутствия, собрал новую армию. В марте 202 года до н. э. у города Зама эта армия сразилась с войсками под командованием Сципиона. Если раньше полководец карфагенян побеждал врагов за счет преимущества конницы, то в этой битве она уступила лучше организованной римской. Более того, римские легионы теперь научились бороться с боевыми слонами — они обратили слонов противника в бегство, и те смешали ряды своей, африканской, пехоты. В результате сражения при Заме армия Карфагена потеряла 10 тысяч человек, в то время как римляне — всего 1500 воинов. Разгромивший Ганнибала римский полководец Сципион получил тогда прозвище Африканский.
В 201 году до н. э. Римская республика и Карфаген заключили мир, хотя Ганнибал Барка настаивал на продолжении войны. Условия договора были крайне тяжелыми для побежденных. Можно сказать, что Вторая Пуническая война закончилась полным поражением Карфагена: он отдавал Риму весь свой флот и в течение 50 лет должен был выплачивать победителю большую контрибуцию. Все владения Карфагена вне Африки достались Римской республике. Африканская Нумидия стала независимой. Рим получил полное господство в Средиземноморье.
Ганнибал до 196 года до н. э. управлял Карфагеном. Великий полководец мечтал возобновить вооруженную борьбу с ненавистным ему Римом. Заподозренный римлянами в подготовке новой войны и потерявший доверие сограждан, в почтенном возрасте он был вынужден бежать из родного Карфагена, защите которого от врагов посвятил всю свою жизнь.