大約1 000米以外,羅馬軍隊按照慣例排出三條陣線。瓦羅打破常規,讓羅馬的連隊方陣排得極其厚實,每行10人,有16行縱深,方陣之間的空隙也小了許多。瓦羅排出如此大縱深的陣形用意明顯,就是想利用羅馬的優勢兵力突破漢尼拔的中央陣營。瓦羅親率四千騎兵在羅馬步兵方陣的左側,麵對三千努米底亞騎兵,而鮑路斯率領兩千騎兵在右側,和七千西班牙及高盧騎兵對陣。兩支軍隊不約而同地在陣前部署輕裝步兵組成的散兵線。
意大利的夏天炎熱幹燥,強勁的西南風卷起漫天的塵土撲麵而來,讓羅馬士兵睜不開眼。
列陣完畢的羅馬大軍頂風前進。羅馬士兵身披猩紅色鬥篷,打磨得鋥亮的頭盔在正午的太陽下閃閃發光,頭盔上紅色的羽冠高高聳立,從迦太基陣地的山坡上遠遠望去,羅馬大軍就像湧動的紅色海洋。七萬士兵排著密集的方陣,邁著整齊的步伐,威風凜凜,穩步前進,和迦太基陣營裏上躥下跳、大呼小叫的高盧士兵形成鮮明對比,給人以強烈的視覺衝擊和心理震撼。
羅馬軍隊前進到大約300米的距離時,兩軍的散兵線開始交火。迦太基巴利阿裏輕步兵用彈弓發射的鉛彈如暴雨一般打在羅馬士兵的盾牌和盔甲上,而羅馬輕步兵以標槍的攢射還以顏色。散兵的交鋒隻持續了一小會兒,就各自撤回本陣,將主戰場讓了出來。羅馬的步兵方陣繼續以令人窒息的整齊步伐慢慢逼近,直到30米的距離停了下來,開始投擲標槍。
羅馬軍隊密集的標槍齊射給迦太基前沿的高盧士兵造成不小的傷亡。標槍投擲完畢以後,羅馬的步兵方陣突然發出驚天動地般的呐喊聲猛衝上來,在一片震耳欲聾的盾牌撞擊聲中同高盧士兵殺在一起。
雙方前排的士兵以盾牌相抵,彼此近在咫尺,用短劍從盾牌下麵猛刺對手,後麵的士兵則拚命向前推擠。羅馬方陣的厚度這時發揮效用,高盧士兵抵擋不住其強大的衝擊力,不得不向坡上後退。
羅馬軍隊的陣形由整齊的長方形逐漸變成楔形,而連隊方陣結構此時已經完全被打亂。
在雙方步兵接戰的同時,兩側的騎兵也發生激戰。迦太基右翼的三千努米底亞騎兵和這一側的四千羅馬騎兵旗鼓相當,戰況膠著;而左翼的七千西班牙和高盧騎兵輕易地擊潰了對麵的兩千羅馬騎兵。統帥這一側騎兵的羅馬執政官鮑路斯剛一開戰就被巴利阿裏輕步兵發射的鉛彈擊中負傷,不得不下馬,他的衛兵下馬照顧,其他的騎兵以為這是個命令,也都紛紛跳下馬來,結果被迦太基騎兵衝得七零八落。鮑路斯在衛兵的拚死保護下撤到羅馬步兵陣線的後麵。掃清羅馬右翼以後,西班牙和高盧騎兵從羅馬軍陣後麵繞到羅馬軍陣的左翼,夾擊這一側的四千羅馬騎兵,很快將其擊潰。
此時主戰場上戰況又有新的進展。迦太基陣線兩端的西班牙步兵尚能堅守陣地,但中間的高盧步兵且戰且退,已經退到兩個利比亞步兵密集陣的側後。利比亞步兵方陣迅速掉轉頭來麵對突破進來的羅馬軍隊,左右兩邊分別和西班牙及高盧部隊銜接起來,這樣迦太基陣線變成一個巨大的U 形,將羅馬大軍三麵包圍。
高盧士兵此時也停止退卻,與兩側的西班牙和利比亞步兵一起攻擊前進。由於受到來自三麵的擠壓,羅馬軍陣裏的空間越來越小,最後士兵們摩肩接踵,擠得水泄不通,個個連短劍都已經舉不起來。羅馬左翼騎兵被擊潰以後,努米底亞騎兵前去追擊,而七千西班牙和高盧騎兵來到羅馬軍陣的後麵,完成了對羅馬大軍的四麵包圍,戰役發展到此時已經變成一場屠殺。
雖然敗局已定,但羅馬士兵仍然鬥誌頑強,個個死戰到底,因而戰鬥又持續了好幾個小時。
隨著越來越多的羅馬士兵倒下,包圍圈越來越小,終於一切都結束了。在不到一平方公裏的戰場上,羅馬人伏屍五萬多具,被俘四千多人。
瓦羅在戰役關鍵時刻逃離戰場,鮑路斯選擇和他的士兵共命運,力戰而死。僥幸逃生的羅馬士兵躲進兩座營壘裏,但隻堅守了一天就被漢尼拔大軍攻破,兩千多人陣亡,一萬五千人投降。坎尼戰役羅馬共損失七萬兩千人,其中包括兩萬戰俘。迦太基方麵陣亡六千人,絕大多數是高盧士兵。
羅馬史學家李維寫道:“世界上還沒有哪一個民族,在經受坎尼之戰這樣巨大的打擊以後仍然能夠屹立不倒。”坎尼戰役使羅馬喪失了五分之一的青壯年,而貴族階級更是大為凋零。
陣亡的五萬羅馬士兵中間,羅馬騎士團成員達數千人,迦太基士兵從羅馬陣亡將士手上取下大量象征貴族身份的戒指,足足盛滿了3個大籮筐。
很多羅馬參議員同時也是羅馬軍團將領,羅馬元老院一共300個席位,坎尼戰役以後出現的空缺多達177個。
總結坎尼戰役,羅馬軍隊可以說毫無戰術可言,雖然擁有優勢兵力,但卻沒有充分利用,如同蠻牛一樣一頭撞進漢尼拔的陷阱。一些史學家指出羅馬軍隊的兵力優勢其實是一個負擔,因為羅馬的將領基本上都隻有指揮軍團級別戰役的經驗,根本不知道如何指揮大兵團作戰。羅馬急需一位能和漢尼拔相匹敵的戰役指揮大師。從坎尼僥幸逃生的羅馬貴族中,有一個名叫西庇阿(即大西庇阿)的19歲青年,他將在數年以後成為羅馬的救星,力挽狂瀾,為羅馬最終贏得第二次布匿戰爭。