第二天東方泛白之時,兩軍便開始列陣待戰了。
城濮一帶地形複雜多變,既有可以進行大規模的車戰、步戰的平原,也有植被茂盛的、可以埋伏奇兵的丘陵和高低不平的台地溝壑。
楚軍方麵,成得臣以西廣、東宮衛隊和若敖氏六百人為中軍,鬥宜申率左軍,鬥勃率右軍,陳、蔡兩國軍隊同歸鬥勃指揮。晉國方麵的三軍則完全打亂了部署,晉文公沒有親自參加戰鬥,而是退到附近的山頂上“憑欄觀看”。
子玉叫道:“聽我的命令!今日之後就不會再有晉國了!”他命右軍首先發動進攻。右軍雖然人數最多,戰鬥力卻最弱。陳、蔡兩軍的加入,解決了很多沒有他們參戰時不會出現的麻煩。右軍出擊的目的隻是試探敵人的戰鬥力,並把晉下軍引出來。
楚人的想法是:一旦晉下軍攻勢過猛,右軍就立即主動撤退,然後中軍就會出擊,與右軍夾擊敵人。這是一個相當大膽的策略,子玉敢於冒這個險,是因為他料定晉中軍擔負著保衛晉文公的重任,必然不敢輕易出動,那麼楚軍就會抓住時機擊潰下軍。下軍一旦潰敗,楚三軍壓上,晉國必敗無疑。
但是晉軍的戰法從開始到結束都不是楚國人想象的那樣。首先,晉文公沒有出戰,他帶著衛隊退到軍營後方的高地上。其次,晉國中軍的一半和下軍的一半被調到右翼,用來加強上軍的力量。這樣一來中軍就隻剩下一半的兵力,下軍也是不完整的。但是晉軍在調動時很好地掩飾了自己的動作,楚國對此毫不知情。最後,晉人把齊師調到左翼,把秦師調到右翼;這個行動卻是公開進行的。
楚右軍推進到離晉下軍不遠的地方時,胥臣的半個下軍和齊師出擊了。胥臣這些天一直在搜集虎皮,當他感覺虎皮數量還是太少時,就在一些布匹上繪製虎皮的條紋並做了一些假虎頭。臨戰時,他把虎皮蒙在最前排戰車的馬背上,把虎頭固定在馬頭上。
晉國的戰馬已經訓練得不怕虎皮了,但是敵人的戰馬看見一排惡虎駕著戰車飛奔而來,頓時驚駭不已,不停地“恢恢”驚叫,或者盤旋打轉,或者掉頭衝向自己的步兵方陣。
楚右軍馬上亂成一團:步兵看到敵人時,雙方的距離還很遠,但是頃刻間前麵的車兵(步兵沒想到戰馬出了問題)就像見到鬼一樣掉頭,駕車向自己的陣列衝過來了。一些戰車衝進來撞死撞傷很多人,直到車輪為屍體所阻才停下來。
晉軍頓時群情振奮,高聲呐喊衝進楚軍。鬥勃的戰車已經撞散了架,軍旗倒了,軍鼓也被踩碎了;鬥勃在人群中被湧來湧去,他發的命令根本傳不出去。
軍官找不到主帥,士兵找不到長官,也找不到自己的旗幟;到處都是呼喊聲,士兵們擠在一起,什麼也聽不清,什麼也看不見。混亂不堪的右軍再也無法組織起有效防禦,就這樣潰敗了。
鬥宜申的左軍也出擊了,這是一支注定要全軍覆沒的軍隊,因為他們即將麵對的是晉國的兩個軍再加上秦師。右軍雖然敗得很窩囊,但是絕大部分軍士都能得以生還,而左軍除少數人外都被殺或者被俘了。
當左軍向前挺進的時候,他們發現敵人似乎躁動不安。雙方接觸了片刻,敵人就發生了混亂,繼而爭先恐後地逃走了。子西登高一望,看到狐毛載著軍旗奪路而逃,而且在更遠處煙塵蔽日,似乎有大批的敵軍正在逃跑——實際上隻是欒枝和車兵們在戰車後掛上樹枝飛馳狂奔造成的假象。