瓦羅這樣安排有非常務實的考慮。羅馬軍隊雖有8個軍團,但4個剛剛組建,2個組建不到一年,隻有2個軍團是久經沙場的部隊。這8個軍團集結不到一個月,根本沒有時間演練隊形和戰術。瓦羅的排兵布陣,正是針對這些弱點。羅馬軍隊每一個百人隊方陣5x12的排列如同縱隊行軍,非常適合缺乏訓練的新兵;深厚的陣型突出“人山人海”的氣勢,增強對敵威懾力,也極大鼓舞了己方士氣。這個陣型優缺點都很突出。優點是正麵攻擊力非常強勁,一旦衝起來便勢不可擋;缺點是笨拙擁擠,缺乏應變能力。瓦羅的戰役部署體現了清醒理智的權衡取舍,雖然比不上漢尼拔出神入化,但也絕非愚蠢無知。
根據兩位古典史家的記載,羅馬參戰總兵力7萬6千人,其中包括5萬5千重裝步兵,1萬5千輕步兵,以及6千騎兵。瓦羅明白己方的騎兵無論數量還是質量都不如對手,因此在兩翼采取守勢。左翼是2400羅馬騎兵,排列出每行300騎、8行縱深的密集戰陣,正麵寬僅400米;右翼是3600盟邦騎兵,占據大約600米的戰線。兩位執政官深知己方兩翼的騎兵將經受嚴峻考驗,因此打破常規,親臨兩翼騎兵部隊督戰,其中瓦羅坐鎮左翼,保盧斯指揮右翼。羅馬中路的步兵陣列由代理執政官塞維利烏斯和亞第利烏斯統領。瓦羅顯然希望羅馬騎兵能夠抵擋對方進攻,為羅馬步兵衝破敵軍陣列贏得時間。
瓦羅的排兵布陣給漢尼拔出了一道難題。此戰羅馬軍隊主動選擇戰場,漢尼拔沒有機會埋伏奇兵;戰場地形狹長,夾在河流和山巒之間,漢尼拔的騎兵缺乏迂回包抄的空間;迦太基戰象在特雷比亞戰役以後相繼病死,因此漢尼拔很難從正麵擊破羅馬軍團厚實無比的密集戰陣。平心而論,漢尼拔此前雖然贏得兩次戰役,但都是依靠出奇製勝,步兵方陣硬碰硬的正麵較量中羅馬軍隊每次都占了上風。瓦羅的戰術意圖非常明顯,那就是迫使漢尼拔迎接羅馬軍團的正麵衝擊,打一場羅馬人最擅長的步兵陣戰。
漢尼拔得知羅馬軍隊列陣挑戰,立刻決定應戰,他派出輕步兵先過河掩護大部隊,自己率領主力分兩路迅速過河,搶占坎尼城東北方向的高地。漢尼拔的參戰兵力大約5萬人,其中步兵4萬,騎兵1萬。同羅馬大軍相比,漢尼拔的步兵處於絕對劣勢,4萬人當中有1萬8千是高盧雇傭兵,久經沙場的利比亞步兵隻剩下1萬人,另外還有大約6千西班牙步兵,以及6千輕步兵。漢尼拔的殺手鐧是騎兵,無論是驍勇善戰的高盧、西班牙騎兵,還是神出鬼沒的奴米底亞騎兵,都讓羅馬人望風膽寒。
針對羅馬大軍中路突擊的進攻態勢,漢尼拔必然要利用自己的騎兵優勢,在兩翼大做文章。擺在漢尼拔麵前的難題,是如何部署步兵陣線,以保證自己的中路不被敵軍衝垮。在這種情況下,一個辦法是中路回收,兩翼突出,形成一個淺碟型戰陣。十年以後西庇阿在伊利帕戰役中,就是這樣排兵布陣的。然而淺蝶形戰陣的致命弱點是缺乏防守彈性,拖後的中路不能後退一步,否則整個陣型就會崩潰。伊利帕戰役中的西庇阿是進攻一方,因此沒有這個問題。
漢尼拔不愧是古典時代首屈一指的名將,他拿出的對策卻是中路突前的新月型戰陣。漢尼拔在中路部署了2萬4千重裝步兵,其中高盧步兵和西班牙步兵交錯排列。漢尼拔這樣安排顯然是期望韌性十足的西班牙士兵彌補高盧士兵缺乏耐力的弱點。漢尼拔最可靠的1萬利比亞步兵分別部署在中路陣線的兩側,排列成窄正麵、大縱深的奇怪陣型。顯然在漢尼拔的戰役構想中,利比亞步兵將從兩側夾擊突破進來的羅馬步兵。波利比烏斯記載,整條步兵陣線排列完畢以後,漢尼拔帶領中路的高盧和西班牙步兵穩步前進,中央部分的方陣前進最遠,兩側各個方陣逐次後置,形成一個新月形。
漢尼拔的戰術原則,就是想方設法削弱羅馬軍團的正麵攻擊力,然後從側背尋找破敵機會。此前的特雷比亞戰役,漢尼拔誘使羅馬軍隊涉渡冰冷湍急的河流,消耗他們的體力;特拉西米尼戰役,漢尼拔巧妙設伏,根本不給羅馬軍團正麵強攻的機會。此戰漢尼拔在背風的高坡上布置一個前凸的新月形戰陣,這樣迫使羅馬步兵頂風爬坡進攻,而中路陣線有足夠的空間且戰且退,最大限度地消耗羅馬軍團的衝擊力,也為兩翼騎兵突破敵陣贏得時間。然而為了取得同羅馬步兵戰陣一樣的寬度,漢尼拔不得不削減新月形戰陣的厚度。迦太基中路陣線大約隻有15行縱深,而且沒有二線部隊支援,因此將經受嚴峻考驗。
漢尼拔在自己的左翼集中了7,000高盧和西班牙重騎兵,對陣保盧斯率領的羅馬右翼2400騎兵。3000奴米底亞騎兵出現在右翼,對陣羅馬左翼的3600聯盟騎兵。漢尼拔顯然將突破點放在左翼,期望占據壓倒優勢的高盧、西班牙騎兵迅速衝垮羅馬右翼騎兵陣線,打開局麵。奴米底亞輕騎兵是絕佳的遊擊部隊,並不擅長衝鋒陷陣,因此他們的任務是吸引羅馬左翼騎兵的注意力,使其無暇他顧。
雙方花費了幾個小時才布陣完畢。坎尼城東北方向的這塊不足5平方公裏的戰場上,聚集了將近13萬士兵和16,000匹戰馬,雙方將士都下定決心以死相拚。戰場周圍的四個營地裏,還有上萬士兵和不計其數的奴仆、工匠、商販等等扒著寨牆翹首眺望,都不願錯過這場盛況空前的大決戰。
正午時分,羅馬大軍在一連串嘹亮的號角聲中頂風前進。行進中的羅馬軍團步伐整齊,鴉雀無聲。漢尼拔矗立在迦太基中路陣線後麵的山坡上,泰然自若地注視著羅馬大軍步步逼近,他嚴令部下各就各位,不得輕舉妄動。羅馬大軍很快抵近迦太基陣前數百米,兩軍部署在前沿的輕步兵很快接戰,互射標槍。迦太基輕步兵行列中的數千巴萊爾彈弓兵急速施射,一時彈如飛蝗呼嘯而至。羅馬兩翼的騎兵部隊是巴萊爾彈弓兵的重點打擊目標,遭受石彈密集攢射,不少戰馬中彈受傷,隊形開始散亂,而坐鎮右翼的執政官保盧斯被一枚石彈擊中落馬,喪失指揮能力。
漢尼拔看到戰機出現,立刻命令兩翼騎兵出擊。左翼的7千高盧、西班牙重騎兵排列密集隊形,衝向敵陣。羅馬右翼騎兵不甘示弱,策馬迎擊。古典時代的騎兵衝鋒講究隊形嚴整、穩步前進,跟中世紀騎兵的高速對衝大相徑庭。兩軍騎兵接敵之前先投擲標槍,然後拔出刀劍,逼近格鬥。於是一場激烈殘酷的騎兵混戰在羅馬陣線的右翼爆發。
李維記載:“雙方騎兵迎頭而上,直至人馬擠成一堆動彈不得,士兵相互拉扯扭打,都試圖將對手拽落馬下。”波利比烏斯的記載更加栩栩如生:“左翼的高盧、西班牙騎兵同羅馬騎兵陣列相撞,接下來的混戰非常野蠻,根本見不到騎兵慣常的迂回扯動,雙方一旦接敵便扭打到一起,紛紛跳下馬來捉對廝殺。羅馬騎兵個個視死如歸,勇猛拚搏,但迦太基騎兵最終占了上風,在混戰中殺死了絕大多數敵人,然後沿河追趕殘敵,將他們毫不留情的砍倒。”
事實上羅馬右翼短暫抵抗以後便潰不成軍,而且隻有排在前列的羅馬騎兵參加了戰鬥。李維記載,整個戰役羅馬騎兵陣亡1300人,將近一半逃生,並非波利比烏斯記載的那樣“個個視死如歸,勇猛拚搏。”鑒於羅馬騎兵絕大多數是貴族出身,自詡國家棟梁、社會精英,這樣的表現實在說不過去。
在羅馬左翼,3000奴米底亞騎兵向3600聯盟騎兵發起攻擊。這一側的地形相對開闊,奴米底亞騎兵裝備輕便,機動靈活,可以輕易登上山坡,兩麵夾擊敵軍。奴米底亞騎兵展現出截然不同的戰術,他們以鬆散隊形逼近敵陣,投擲標槍以後迅速後撤,如此循環往複,進退如風,不斷施加壓力。波利比烏斯記載:“攻擊羅馬左翼騎兵奴米底亞人,因為其獨特戰法,沒有占到便宜,也沒有遭受傷亡。但他們從多個方向不斷攻擊,吸引對手的注意力,使其無法發揮作用。”
這種僵持局麵並沒有持續多久。迦太基左翼騎兵擊潰對手以後僅僅稍作追擊,便重新整隊,繞過整個羅馬戰陣的後方,突襲羅馬左翼聯盟騎兵的側背。羅馬左翼很快崩潰,四散奔逃。大概就是這個時候,執政官瓦羅在50名騎兵的保護下逃離戰場。羅馬戰陣失去了兩翼騎兵的掩護,似乎處於岌岌可危的境地。然而指揮步兵陣列的羅馬將帥毫不掛懷,因為羅馬軍團已經勝利在望。