费边的战略虽然正确,但在元老院和广大罗马老百姓那里却不得人心。原来,汉尼拔对自己的弱点也是了如指掌,所以他并不急于攻打重兵防守,固若金汤的罗马城,而是率军一路南下,一边掠夺沿途富饶的粮食产区,一边策动罗马人的盟友附庸造反,和自己联手。这就搞得各地罗马官员和老百姓怨声载道,各种求救和控诉文书像雪片一样送到了元老院。费边的老成持重,被歪曲为怯懦和昏庸,最终迫使他黯然下野;而新上台的执政官,是一位善于操控民意的煽动家,叫瓦罗,核心主张就是立刻和汉尼拔一决胜负;当然,为了保险起见,另一位上任和瓦罗搭档的执政官,是元老院内稳健派亲自挑选的保卢斯。保卢斯出身罗马最显赫的埃米利乌斯家族,人望很高,老成持重,元老院希望他能够给血气方刚的瓦罗充当顾问,以及“安全阀”。为了给瓦罗和保卢斯凑够足够的兵力对付汉尼拔,罗马可以说是来了个总动员,一共拼凑了16个军团,8个由罗马公民组成,8个来自意大利境内的盟邦。如果按照每个军团满编上限5000人到6000人来计算,这是一支人数达到8万甚至更多的大军。此时,汉尼拔正率军驻扎在意大利南部的阿普利亚地区,从地图上看,这里是意大利半岛这只“皮靴”的“靴子跟”。阿普利亚自古就是整个意大利的“粮仓”,是一片土地肥沃的平原,汉尼拔可以在这里获得足够的粮食与补给。另外,汉尼拔也急于在这里夺取一个海港,从而打开一条海上交通线,让自己的远征军得到来自北非迦太基本土的援助。

由于汉尼拔的远征军停止了行进,所以急于求战的瓦罗,不顾保卢斯的劝阻,率领全军追了过来,在小镇坎尼附近和汉尼拔正面对峙。瓦罗认为,这里一望无际的平原,最利于自己兵力占据优势的大军展开,一决雌雄。公元前216年8月2日,坎尼会战正式打响,根据著名军事历史学家德尔布吕克的统计,为了彻底打败汉尼拔这个心腹大患,罗马在坎尼投入了数量压倒对手的重兵,包括5.5万名重装步兵,8000到9000名轻装步兵,还有6000骑兵,总兵力为7万。而在汉尼拔麾下,则有大约3.2万重装步兵,8000名轻装步兵与弓箭手、投石兵,以及1万骑兵,兵力为5万。虽然总兵力不占优势,但汉尼拔比对手拥有更多的骑兵,这也成了他赢得这场决战的一个重要优势。

罗马人的战略很简单,就是利用自己的兵力优势,尤其是罗马重装步兵的冲击力,组成一个坚固厚实的大方阵,来个中心开花,直指汉尼拔军队的中央,加以粉碎;两位执政官瓦罗和保卢斯分别指挥骑兵,保护罗马步兵方阵的左右翼。相比之下,汉尼拔的布阵和战略则相对复杂巧妙得多:在他的指挥下,迦太基军队布成了一个弯月形,中央向前突出,两翼滞后。而中央部分的兵力,被汉尼拔刻意安排得非常薄弱,大多是来自西班牙的凯尔特人,以及新近招募来的高卢武士,目的是诱使罗马大军在中央轻易突破;汉尼拔最为信赖,跟随自己最久的北非利比亚重型步兵,则被安排在阵型的最后,随时机动支援。和罗马人一样,在这个弯月阵型的两端,汉尼拔分别布置了骑兵,包括努米底亚轻骑兵和高卢重型骑兵,他们的任务是,在莽撞的罗马大军从中央突破后,从两翼包抄,把对方装进汉尼拔精心设计的“口袋包围圈”。果然,战斗开始后,一切都在按照汉尼拔的部署和推演进行:占据兵力和装备优势的罗马重步兵不顾一切地试图突破迦太基军队的中央,而迦太基军队则按照汉尼拔的指令,中央退却,两翼向前包抄,于是罗马军队像是着了魔一般,自己拼命往汉尼拔的口袋里钻。当战况陷入胶着状态时,汉尼拔命令弟弟哈斯德鲁巴指挥数量和战斗力都占优的高卢重骑兵出击,首先击溃了保卢斯指挥的罗马骑兵,然后向罗马步兵方阵的后方开始迂回;随后,精锐的利比亚重型步兵,也紧随跟上,开始袭击罗马军队的侧翼。

一瞬间,整个罗马军团陷入了慌乱,他们发现,自己刚刚还在一往无前地推进,转瞬之间却落入了三面包围,包围圈还在慢慢地缩小。不久之后,罗马军队的左翼骑兵也崩溃了,踌躇满志,却又从没上过战场的瓦罗哪里见过这种情景,直接抛下军队,逃之夭夭。于是,汉尼拔如愿以偿,罗马军队四面受敌,军心不稳:由于天气炎热,身披重型盔甲的罗马士兵在拥挤的方阵里很快感到了疲惫,甚至窒息;空间的狭窄,让罗马士兵熟悉的三线列阵型也无法维持,甚至不能扔出手上的投枪杀伤敌人;几乎所有人,都因为慌乱和求生欲,开始盲目地向方阵中心挤去,试图用外围同伴的身体来抵挡迦太基军队手中的长矛,以及射出的弓箭、石块和标枪,战斗变成了一边倒的屠杀。

最终,在第二天清晨打扫战场时,汉尼拔发现,坎尼附近的平原几乎变成了一座大坟场:估计有6万名左右的罗马人战死,俘虏超过了1万人。在战死的罗马人中,包括执政官保卢斯,超过70位罗马元老院成员,以及 48名罗马军团指挥官中的29人。许多奄奄一息的罗马人甚至主动要求迦太基士兵用兵器切开自己的颈动脉,了结自己的生命。坎尼之战,是汉尼拔,乃至整个迦太基帝国在布匿战争中最为辉煌的巅峰。然而,作者欧康奈尔说,当胜利的欢呼还回荡在战场上的时候,汉尼拔的心中就充满了对于战争前景的疑惑与不安:强硬的罗马元老院,拒绝了汉尼拔提出的休战,以及赎回战俘的提议,彰显了罗马将不惜一切代价作战到底的决心;在这一年随后的日子里,更多不利的消息陆续传来,除了加普亚,意大利南部的各城邦和民族,都拒绝与汉尼拔合作,选择站在罗马一边;而在遥远的西班牙,一支罗马远征军已经抵达,准备釜底抽薪,彻底摧毁汉尼拔的大本营与根据地。13年后,也就是公元前203年,汉尼拔被迫在突尼斯境内的扎马,与入侵迦太基本土的罗马军队决战,结果大败,迦太基不得不与罗马签订了苛刻的城下之盟,从地中海强国彻底沦为了罗马的附庸城邦;而汉尼拔,则由于罗马的压力,被迫离开了祖国,开始了漫长的流亡生涯。最终,在公元前183年,已经流亡到比提尼亚王国,也就是今天土耳其境内的汉尼拔,不甘落入死敌罗马之手,毅然服毒自杀,享年64岁,37年后,迦太基被罗马灭亡。