武德五年正月,李世民率领大军来到获嘉(今河南修武附近),刘黑闼带兵数次挑战都被唐军所败。刘黑闼于是放弃相州,退保肥乡一带。唐军攻克相州之后,进军肥乡,在洺水岸边筑起联营进逼刘黑闼。
另一边,李世民命幽州总管罗艺在刘黑闼后方猛攻,以吸引刘黑闼主力北上前去还击罗艺。调虎离山之计奏效后,李世民带领唐朝大军直扑刘黑闼的老巢——洺水城。
唐将程名振为唐军先锋,他命人架起六十面大鼓,鼓声巨大,城中感到地动,屋檐的瓦片甚至都被片片振落。守城的范愿感到唐军势大,深知以自己的少量兵力很难固守洺州城,只好急派亲兵报告刘黑闼,让他率领大军回援。
刘黑闼心知洺水城不能有失,于是交给弟弟刘十善一万兵力继续攻打罗艺,而他自己亲率主力还攻洺水城。刘黑闼还未赶回,刘十善就被罗艺击败,伤亡八千余人。刘十善不得已逃归刘黑闼大军之中。
此时,李世民派遣大将王君廓带领五千兵马与洺水城中投降唐军的刘黑闼旧将共守洺州城。随着刘黑闼带兵来攻,李世民又派遣秦叔宝领五千兵马前往邀击,不料被刘黑闼所败,好在唐军还有伏兵,双方战至日暮,刘黑闼终于败走。
武德五年二月中,趁着刘黑闼大军南驱洺州城,北部空虚之际,唐军攻克了邢州、井州二州。不久,罗艺相继攻克定、栾、廉、赵四州,擒获刘黑闼的尚书刘希道,遂领军南下,与李世民形成对刘黑闼的南北夹击之势。
至此,唐军与刘黑闼的主战场全部转移到了洺州城的攻防与夺取,所以洺州城的得失开始成为此战的关键。
洺州城四周有宽约五十米,深达一米多的护城河,一旦拉起吊桥,很难攻克。刘黑闼就命士兵在城东北修筑甬道,用以攻城。因为刘黑闼的兵力明显占优,一旦甬道修成,如果唐朝大军不能驰援,必将陷落。
此时,瓦岗旧将罗士信请求代替王君廓去守城。李世民于是在洺水城南的高坡之上用旗语通知王君廓,让他出城,王君廓出城突围之际,罗士信顺势进城。
刘黑闼修好甬道之后,带领大军昼夜不停地攻击,守城的唐军士兵连日作战不得休息,疲惫不堪。此时,天降大雪,雪深数尺,大地白茫茫一片,车马不行。向外派出的数路求援信使竟然被大雪所困,不是在大雪中迷失方向转而被刘黑闼所擒拿,就是兜转一圈不得已又回到了城中。
刘黑闼仰仗人多势众,昼夜不停地连番攻八城天,唐军士兵困乏已极无力抵抗,洺州城终于被其攻克,守将罗士信被擒。刘黑闼听说罗士信作战勇猛,想要招降他,罗士信大骂不已,遂被刘黑闼杀害,死时年仅二十岁。
至二十九日,唐朝大军终于清理了道路上的积雪,前来夺回了洺水城。刘黑闼力敌不能,只好撤出洺州城,再回北部州郡组织人马复夺洺州城。罗士信因感念自己的旧主裴仁基,李世民将他的尸身收容之后,将他葬在了邙山下裴仁基的坟墓旁边。
值得一提的是,此时年轻的罗士信还收养了一名两岁多的孩童,这个孩童正是裴仁基的遗腹子。当初罗士信之所以比秦琼、程咬金晚一些投奔大唐,正是因为这个孩童。这个孩童名叫裴行俭,李世民感念罗士信为人忠勇恩义,亲自将裴行俭抚养长大。几十年后,大唐的版图急速扩张,裴行俭也在对西突厥的作战中数次大胜,成长为初唐时期的一代军神,儒将的典范。不得不说,罗士信的忠魂不灭,在裴行俭身上得到了寄托,这就是所谓的薪尽火传吧!
这边,刘黑闼由于不甘失败,又从冀州、贝州、沧州、瀛洲各处征兵征粮,水陆并进。李世民派大将程名振焚毁其运粮的舟车,断绝其粮道。双方开始进入相持阶段。
当此之时,颉利可汗与高开道、苑君璋合兵一处,准备南下并州,大唐并州总管刘世让屯兵雁门关拒敌。大唐此时在河北、江南用兵,没有多余的兵力与突厥大战,于是派遣使者以重利贿赂颉利可汗,并答应通婚和好,颉利可汗才撤回了雁门关下的军队。
唐军与刘黑闼相持六十余日,刘黑闼缺粮,于是数次挑战。他先是派军队夜袭李世绩大营,李世民带兵前往营救,不想反为刘黑闼包围,尉迟敬德带领敢死之士突入重围将李世民救出。
李世民估计刘黑闼粮尽之后,必然寻求决战,于是命人在洺水上流填堰筑坝,并嘱托守堰将领:“我与贼兵激战之日,贼兵半渡之时掘开堤坝。”
武德五年三月二十六日,刘黑闼率领步骑两万余人前来唐军营垒挑战,李世民率领玄甲军迎战,很快就大败其前锋骑兵,又乘势蹂躏其步兵。刘黑闼率领余众殊死搏斗,自午时高阳到黄昏夜幕,战斗数十回合,刘黑闼渐渐力不能支。
李世民带领部队撤出战场,此时洺水决堤,大水深达数丈,刘黑闼余众被大水冲散,许多人马就此做了水鬼,成了鱼虾的晚餐。此战,唐军斩首万余,淹死者数千,刘黑闼与范愿、王小胡等人只带领二百余骑兵逃往突厥。
武德五年四月,李世民领唐朝大军南下攻击徐圆朗,连下十余城。此时,江淮一带的杜伏威也在积极扩充地盘,听说唐朝大军已经平定刘黑闼,心中大惧。
此时颉利可汗已经巩固了汗位,兵强马壮。有人报告李渊,说杜伏威暗中与颉利可汗联络,准备寻机叛唐。杜伏威为了摆脱嫌疑,请求亲自前往长安,自辩清白。
李渊担心的正是杜伏威反水,看到杜伏威请求入朝,于是他命令李世民将大军指挥权交给淮安王李神通、行军总管任環、李世绩等人继续征讨徐圆朗,而李世民与杜伏威一同入朝,返回长安。
李世民原本想彻底平定山东河北一带,再回朝。但此时,据报,頡利可汗准备带领两路兵马大举攻唐,一路入侵雁门关,另一路自贺兰山南下已经兵驱原州(今平凉)。面对如此紧急的军情,李世民只好听从李渊的命令与杜伏威一起前往长安,向父皇复命的同时,积极整兵防守长安。