当汉尼拔决定在冬天前离开被他破坏殆尽的坎帕尼亚时,他发现所有的退路都已被罗马军封住。汉尼拔用计使罗马军相信他将从森林逃脱,在罗马军转移把守地时,汉尼拔占下出路,使全军在未受阻碍之下离开当地。虽然当时费边就在咫尺之外,顾虑汉尼拔的诡计,他选择按兵不动。当汉尼拔安全的离开坎帕尼亚并在普利亚平原找到过冬基地的消息传到罗马之后,费边的声望严重受挫,不久之后他的任期届满,他的军权随之回到罗马执政官手上。
公元前216年春天,汉尼拔先发制人的的攻下了罗马人在普利亚平原的补给重地坎尼(Cannae),截断其对罗马的粮食供应。此时罗马元老院选出了两位新的执政官特林提阿斯·发罗(GaiusTerentiusVarro)与伊密略·鲍鲁斯(LuciusAemiliusPaullus),并为了将汉尼拔彻底铲除,动员了罗马共和国史上最庞大的一支联军,估计人数最高上至十万。
亟欲与汉尼拔一决高下的罗马众军团在两位执政官带领下南行至普利亚,在奥凡托河(AufidusRiver)左岸找到他之后,于距其六英里之处扎营。罗马人将两只军队合并为一,两位执行官轮流隔日掌管指挥权。其中一位执政官发罗是个生性鲁莽傲慢的人,并一心渴望及早打败汉尼拔。汉尼拔利用这个特点,派骑兵骚扰罗马军营并干扰其水源供应,被激怒的发罗在次日轮到他掌权时,动员全军誓与汉尼拔一决胜负。
汉尼拔在此战中使用了其举世闻名的新月形战术,在战斗初期将军队部署成中锋凸起的阵形,以引诱罗马军集中攻打其中锋。面对占人数优势的罗马步兵,汉尼拔的中央步兵不久便节节后退,不疑有诈的罗马军涌入迦太基阵形中部,欲将其中锋击溃之后反抄其左右两翼。至此迦太基军阵形变成了凹陷的弦月状,将罗马主力包围在其中,其中锋并开始了顽强的反击。迦太基优势的骑兵在击溃罗马骑兵之后,在此时转头猛击罗马步兵的后方,至此汉尼拔成功的以较少的兵力彻底包围了人数为其两倍以上的罗马军。
罗马军彻底惨败。据不同资料的估计,罗马人在此役中死亡与被俘虏的人数大约有五到七万人。死亡者名单上包括了罗马执政官鲍鲁斯(另一执政官发罗成功逃回罗马),前任两位执政官,两位财务官,共和国四十八名军团司令官中的二十九人,以及八十位元老院议员(约为罗马共和国政府25%~30%的成员)。
此战成为古罗马历史上最惨痛的败北,亦为全球史上在单日中伤亡最严重的战役之一。
坎尼战役之后,罗马人才了解到费边的睿智,从此之后再也不与汉尼拔正面交锋,改回使用被动的消耗战。
罗马在此战中的惨败动摇了它在意大利南部的联盟,西西里岛上的希腊城邦纷纷起义造反,汉尼拔随与锡拉库萨(Syracuse)新国王希尔奥尼莫斯(Hieronymous)结盟。巴尔干半岛上的马其顿(Macedon)国王腓力五世(PhilipV)亦向汉尼拔传书表达支持,并向罗马展开了第一次马其顿战争。许多人相信汉尼拔若是在此时得到迦太基在人力与器械上的增援,他极有可能成功的攻下罗马城。
但事与愿违,虽然同年中,意大利第二大城市卡普阿(Capua)倒戈投入汉尼拔阵营,汉尼拔并随之以此城作为他的新基地,但由始至终只有少数意大利城邦加入他的行列,罗马在意大利的联盟仍屹立不垮。意大利战争至此陷入了一场僵局,罗马人了解到要打败汉尼拔,唯一的方法是充分的使用费边的消耗战略。罗马人不给汉尼拔任何与其正面交锋的机会,并不断派出小部队骚扰敌军,旨在耗尽汉尼拔的精力,动摇其军心。皆下来的几年内,汉尼拔在意大利南部进行了一系列成效不彰的军事行动。
仰仗地方城镇低效率的补给,缺乏能独当一面的将领,迟迟等不到迦太基的援军,无法取得与罗马相抗衡的资源等等因素,使得进军罗马城的希望越来越渺小。虽然在此期间汉尼拔仍与罗马打了几场显著的胜仗,于公元前212年彻底摧毁两支罗马军队,并在公元前208年的一场战役中杀死了两名罗马执政官,但他至终无法取得任何关键性的胜利。
公元前212年,汉尼拔攻下塔朗多(Tarentum),但无法成功占领控制其港口。此时双方的优势已渐渐转向罗马。
罗马在两次围城后于公元前211年夺回卡普阿,占领锡拉库萨,并在西西里岛上摧毁了一支迦太基军队,平定了当地的起义。同时并与希腊本土的艾托里亚联邦(AetolianLeague)结盟对付马其顿的腓力五世,腓力在遭到四面围攻之后不久便向联军臣服。
公元前210年汉尼拔再次展现其战略天分,在普利亚地区Herdonea之处重挫罗马军,并于公元前208年在LocriEpizephyri围城战中摧毁另一支罗马部队。但罗马在这段时间内已渐渐夺回各地失去领土,并在公元前209年内攻下塔朗多,至此汉尼拔几乎丧失了其对意大利南部的控制。
公元前207年,汉尼拔再次进军普利亚,并在此等待与其二弟哈斯德鲁巴·巴卡(HasdrubalBarca)从西班牙带来的援军会合之后一起进军罗马城。哈斯德鲁巴不幸的在意大利北部Metaurus被罗马军击败身亡。得此消息后,汉尼拔退至Bruttium,并在此度过他在意大利半岛上的最后几年。期间汉尼拔三弟MagoBarca在利古里亚行动的失败(205BC—203BC),及与马其顿国王腓力五世谈判的破裂,为汉尼拔征服意大利的计划鸣起丧钟。
于公元前203年,在意大利征战将近十五年后,汉尼拔被迦太基政府召回北非,以对抗由大西庇阿(Scipio,公元前218年落败在汉尼拔手下的西庇阿之子,与其父同名)率领入侵迦太基的罗马远征军。
在汉尼拔尚未回迦太基前,大西庇阿率军入侵北非,迦太基政府内的主和派打算与罗马商讨休战协议。主战派召回汉尼拔,恢复了民众对战争的支持,汉尼拔被任命为军队统帅,掌管由非洲军与汉尼拔从意大利所携佣兵组成的联军。
公元前203年,汉尼拔与大西庇阿在和平谈判中首次会面,尽管他们互相仰慕对方的军事才华,在罗马坚持指责迦太基违背第一次步匿战争后的合约之下,谈判宣告破裂。不久双方进行了关键性的扎马战役。
扎马战役与第二次步匿战争中其他战役最大的不同点,在于迦太基在步兵数量上占了优势,反之在迦太基前盟友东努米底亚王Masinissa倒戈加入罗马阵营之后,罗马军首次拥有了骑兵优势。虽然逐渐年老的汉尼拔在多年征战意大利之后身心俱疲,但整体来讲迦太基仍然占有数量上的优势,并拥有为数八十的战象。
罗马的优势骑兵在战斗开始不久便击溃迦太基骑兵并一路追出战场,而大西庇阿设计的战术阵形轻易的化解了汉尼拔象兵的威胁。即使如此,双方仍进行了一场硬战,战情甚至一度显示汉尼拔即将获胜,但大西庇阿适时的重整其部队,与全胜调头归来的罗马骑兵向迦太基军前后同时进击。迦太基军的阵线至此崩溃,据估计此战迦太基损失了31000人,另有15000人受伤,而罗马军总共只损失了1500人。
迦太基在此役战败后对汉尼拔的军事能力失去了信心,于是随即向罗马投降,正式结束第二次步匿战争。战后罗马向迦太基定下了极为苛刻的条款,除了巨额战争赔款之外,迦太基失去了所有海外领土,海军解散至只剩下十艘防海盗的军船,并从此不得在未经罗马许可下建立军队。
四十六岁的汉尼拔在此时开始了他的政治生涯,并证明他在内政上的能力不亚于他的军事才华。战后他先低调行事了一阵子,但迦太基政局的腐败使他不久之后便出头予以整治,他被选为行政官后恢复了这个职位的威信,并进行了一系列成效显彰的改革,使得迦太基可望在不大幅增加税收的情况下分期付清对罗马的战争赔款。
扎马战役之后七年,罗马人开始顾虑迦太基人复苏的经济会对他们再次造成威胁,要求迦太基政府交出汉尼拔。汉尼拔为此自愿流放离开迦太基。他首先拜访了迦太基的故乡腓尼基的泰尔城(Tyre),随之旅行至Ephesus,被准备向罗马开战的塞琉西国王安条克三世奉为上宾。
汉尼拔不久便发现安条克的军队无法与罗马军的力量抗衡,因此建议他派遣舰队登陆意大利南部,并自愿率领这批军队。但听信内臣进言后的安条克三世不愿将任何重要职位交给汉尼拔,因此未予采纳。据斯特拉博(Strabo)与普鲁塔克(Plutarch)所记,在这段期间内他亦花了一段时间在亚美尼亚宫廷中,帮国王阿尔塔克西一世兴建新首都Artaxata。
公元前190年,汉尼拔受命指挥安条克的舰队,但在西底(Side)被罗马的盟军击败。安条克在连串战役中败给罗马之后,有意向罗马人求和并交出汉尼拔,因此汉尼拔逃至克里特(Crete)岛,但不久便再次返回小亚细亚,投靠当时正与罗马盟国帕加马(Pergamum)交战的比提尼亚(Bithynia)国王普鲁西亚斯一世(PrusiasI)。汉尼拔在这场战争中为普鲁西亚斯立下战功,再次让罗马人决心使其就擒。在罗马的要求下,普鲁西亚斯同意将其交出,但决心不落入罗马人手下的汉尼拔至此服毒自尽。
其死亡的正确年代仍受到争议,但历史学家李维的著作似乎暗示汉尼拔与小其十二岁的大西庇阿同于公元前183年过世,享年六十四岁。