公元前205年5月,刘邦乘项籍深陷于齐国,无力抽身的机会,率领诸侯联军56万一举攻占西楚都彭城。短暂的胜利是刘邦失去理智,天天与诸侯们喝酒庆祝。项羽闻之,急率轻骑兵3万回袭彭城,联军无备,一时被杀十万,溺水淹死十万,刘邦仅率数十骑逃脱,以汉为首的反楚联盟瓦解。
同年6月,刘邦率部退到荥阳,一路收集败兵,并派韩信于萧索之间击败了楚追兵,得以喘息,稳住了阵脚,遂重整军队,依托关中基地和有利地势与项羽长期抗争。7月,一直负隅顽抗的章邯终于兵败自杀,刘邦完全解除了后顾之忧;且在逃往荥阳前便派人说服英布反楚,联络彭越扰楚后方;派韩信开辟北方战场,攻魏俘魏王豹,破代,灭赵杀陈余。公元前205年冬,项羽发动反攻,围困荥阳,形势十分危急。刘邦用陈平反间计,使项羽怀疑范增,不用其谋,迫使范增怒而归乡。刘邦又派纪信装扮成自己去楚军诈降,乘机逃出荥阳。项籍加紧围攻荥阳,并夺取成皋。
为了减轻楚军对荥阳的压力,刘邦率军经武关、宛(今南阳)、叶(今叶县南),想引诱项籍南下。为配合汉军行动,此时韩信也率军到达黄河北岸,声援荥阳。彭越正在进攻下邳 (今江苏邳州南)。项籍被迫率军回救,刘邦乘机收复成皋。公元前204年7月,项籍以凌厉攻势拔荥阳,再夺成皋。
刘邦一面命汉军在巩县一带坚守,阻击楚军前进,一面命韩信组建新军击齐,派人入楚腹地协助彭越进攻睢阳县、外黄县(今民权县)等地,再次迫使项羽回救。公元前204年11月,刘邦用计再次收复成皋(今荥阳汜水镇西北),斩杀了项羽大将曹咎。
项籍在击败彭越后,寻汉军主力决战不成,屯兵广武(今荥阳北)与刘邦形成对峙。不久,韩信在潍水之战中歼灭齐楚联军,完成对楚侧翼的战略迂回,又派灌婴率军一部直奔彭城。项籍腹背受敌,兵疲粮尽,遂与汉订盟,以鸿沟为界,中分天下,东归楚,西归汉。公元前203年10月,项籍引兵东归。
楚、汉订盟后,刘邦本想退兵,在张良、陈平提醒下,下令全力追击楚军。公元前203年11月,两军战于固陵(今淮阳西北),项羽小胜。公元前202年1月,刘邦以封赏笼络韩信、彭越、黥布等,垓下一战重创楚军。
公元前202年1月,刘邦、韩信、刘贾、彭越、英布等各路汉军约计70万人与10万久战疲劳的楚军于垓下(今安徽灵璧县南)展开决战。汉军以韩信率军居中,将军孔熙为左翼、陈贺为右翼,刘邦率部跟进,将军周勃断后。
韩信挥军进攻,采用诱敌深入战术,前军先诈败,信引兵后退,命左、右翼军包抄攻击楚军后部步军。楚军久战疲劳后军迎战不利,汉军将楚后军与项羽前军骑士分割两半,韩信再指挥全军反击,楚军大败,阵亡四万余,被俘两万,被打散两万,仅剩不到两万伤兵随项羽退回阵中。
后楚军退入壁垒坚守,被汉军重重包围。楚军兵疲食尽。韩信命汉军士卒夜唱楚歌,歌云:“人心都向楚,天下已属刘;韩信屯垓下,要斩霸王头!”。
致使楚军士卒思乡厌战,军心瓦解,项羽只有率800人突围至乌江(今安徽省和县境),这时项羽身边只剩下28骑了,一亭长愿带项羽逃至江东重振霸业,遭项羽拒绝。项羽带着28骑大战汉军,最后全军覆没,项羽不愿被俘受辱,于是在乌江自刭而死。