研究人員認為,跟隨漢尼拔前往非洲的軍隊大多由被迫服役的意大利人組成,他手下最得力的老兵已經在與羅馬的戰鬥中疲憊不堪;也有人認為漢尼拔此時還有很多經驗豐富的老兵。
無論如何,紮馬戰役打響的時候,漢尼拔有58000步兵,6000騎兵,80頭大象。西庇阿只有34000步兵,但他在騎兵方面有優勢(8700)。前202,10,19,兩個魏
偉大的統帥在迦太基和尤蒂卡之間的壹片平原上相遇,這就是軍事史上著名的紮馬戰役。
漢尼拔把步兵排成標準的三線排列。第壹個縱隊是輕步兵,後面兩個縱隊是重步兵。
大象又在步兵前面了。他的戰術很簡單:用戰象的沖擊在羅馬戰線打開壹個缺口,然後用騎兵支援的步兵插入缺口。
相比之下,西庇阿改進了傳統的羅馬布陣方式(步槍兵、主力兵、老兵依次排列成三列,每列10步兵旅,每個步兵旅有兩個百人旅)。他把每壹列的每壹個旅和另壹列的每壹個旅排在壹起,結果,他在步兵隊形中留出了壹段距離讓敵象通過。他部署了由Raeli uz領導的西西裏騎兵在左翼,馬西尼薩的努米底亞騎兵在右翼。
西庇阿的處置方法破壞了漢尼拔的計劃。當迦太基大象沖鋒時,它們沖進了羅馬隊伍中預留的缺口,不僅沒有殺死羅馬士兵,也沒有打亂他們的隊形。據記載,西庇阿還想出了對付戰象的其他辦法:羅馬軍隊中有人帶著角,當戰象沖過來時,就使勁吹,把許多大象嚇得驚慌失措,甚至發狂。沖進敵陣的大象又被步兵的劍刺傷了。盡管如此,戰爭的大象還是給羅馬步兵帶來了很多麻煩。此時,馬西尼薩和雷裏烏斯率領的羅馬騎兵在與迦太基騎兵的對抗中占據優勢,將對手趕出戰場,漢尼拔的步兵因此沒有希望得到騎兵支援。羅馬騎兵繼續追擊分散的迦太基騎兵,只留下雙方步兵在戰場上作戰。戰鬥異常血腥,雙方都無法占據明顯優勢。羅馬人奮力突破迦太基陣型的前兩列時,匯成壹條橫戰線,沖向漢尼拔的預備隊,卻被強大的老兵攔住。戰鬥壹度陷入僵局,但及時重返戰場的羅馬騎兵最終決定了壹切。羅馬騎兵從後方猛烈攻擊漢尼拔的軍隊,後者隨即崩潰。
紮馬戰役的結果標誌著第二次布匿戰爭的結束。迦太基的大多數領袖意識到他們的國家已經無力再戰,所以他們決定與羅馬媾和。據說漢尼拔在元老院還在鼓吹抗擊羅馬的時候,粗暴地把壹個迦太基長老拖下了講臺。另壹方面,以老卡托為代表的壹些強硬的羅馬人物,主張徹底摧毀迦太基,要求西庇阿將迦太基夷為平地。但西庇阿對迦太基采取了較為溫和的態度,僅以苛刻的條約結束了戰爭(根據這壹條約,迦太基幾乎被完全解除武裝並支付巨額賠款,未經羅馬同意不得向其他國家宣戰)。而且按照西庇阿的意願,漢尼拔實際上成為了迦太基的政治首腦。與他對敵人的仁慈相反,西庇阿對意大利叛徒很殘忍:來自拉丁城市的人被斬首,如果是羅馬人,會被釘死在十字架上。