這時,趙將司馬卬正要渡過黃河進入函穀關,沛公就北進攻打平陰,切斷黃河渡口。向南進發,在雒陽東麵交戰。戰鬥不順,沛公回到陽城,集中軍中的騎兵,與南陽郡郡守戰於犫,打敗了軍。攻取南陽郡的城邑,南陽郡郡守逃走,退守宛縣。沛公引兵繞過宛城西進。張良進諫說:“沛公你雖然急於打入函穀關,但秦兵還很多,又據守險要。如今不拿下宛城,宛城守軍從背後攻擊,強大的秦軍在前麵阻擋,這是一種危險的戰術。”於是沛公就在夜間率兵從另外一條道路返回,更換了旗幟。
天亮時,他就把宛城包圍了三層。南陽郡郡守想要自殺。他的舍人陳恢說:“死的還早。”他就翻過牆去見沛公,說:“我聽說閣下接受楚懷王的約定,先攻入鹹陽的稱王關中。現在閣下停留守在宛城。宛城是大郡的治所,連城數十,口多糧足,官吏和民眾認為投降肯定被處死,所以都登城固守。如果足下整天地留在這裏攻城,士卒死傷的一定很多;如果引兵離開宛城,宛城守軍自然跟蹤追擊。足下向前則失去先入鹹陽的約定,後退又有強大的宛城守軍為患。為足下設想,不如明約招降,封南陽郡守官爵,讓他留守,足下帶領宛城士卒一道西進。許多沒有攻下的城邑,聽到這個消息,爭先打開城門,等待足下,足下可以通行無阻。”沛公說:“好。”就以南陽郡守為殷侯,封給陳恢一千戶。引兵西進,沒有不降服的。到達丹水,高武侯鰓、襄侯王陵在西陵投降。回軍攻打胡陽,遇到番君的別將梅鋗,與他一起,迫使析縣、酈縣投降。沛公派遣魏人寧昌出使秦關中,使者沒有回來。這時章邯已經帶領全軍在趙地投降項羽。
起初,項羽和宋義北進援救趙,等到項羽殺死宋義,代替他為上將軍,許多將領和黥布都從屬項羽。打垮了秦將王離的軍隊,使章邯投降,諸侯都歸附了他。等到趙高已經殺了秦二世,派人來見沛公,想要定下約定瓜分關中稱王。沛公以為是詐騙,就采用張良的計策,派酈生、陸賈去遊說秦軍將領,用甜頭引誘,趁機襲擊武關,攻破關口。同時他又和秦軍在藍田南麵交戰,增設疑兵,多樹旗幟,所經過的地方不許擄掠。秦國的群眾很高興,秦軍懈怠了,因此大破秦軍。又在藍田北麵接戰,再次打敗秦軍。乘勝追擊,徹底打垮了秦軍。
漢元年十月,沛公的軍隊先於各路諸侯到達霸上。秦王子嬰素車白馬,用絲帶係著脖子,封了皇帝的印璽和符節,在軹道旁投降。將領們有的主張殺死秦王。沛公說:“當初楚懷王派遣我,就是因為我能寬大容人。況且人家已經降服,又殺死人家,不吉利。”於是就把秦王交給了官吏,向西進入鹹陽。沛公想要留在宮殿中休息,樊噲、張良勸說後,才封閉了秦宮的貴重珍寶、財物和庫房,把軍隊駐紮在霸上。
沛公召集各縣的父老、豪傑說:“父老們苦於秦朝的嚴刑峻法已經很久了,誹謗朝政的要滅族,相聚議論的要在街市上處斬。我和諸侯們約定,先入關的在關中稱王,我應當稱王關中。同父老們約定,法律隻有三章:殺人的處死,傷人和搶劫的處以與同犯罪相當的刑罰。其餘的秦朝法律全都廢除。官吏和百姓都要安居如故。我所以到這裏來,是為父老們除害,不會有欺淩暴虐的行為,不要害怕。我所以回軍霸上,是等待諸侯們到來製定共同遵守的紀律。”沛公派人與秦朝官吏在縣城鄉間巡行,告諭百姓。秦地的百姓大為高興,爭先恐後地拿出牛羊酒食款待士兵。沛公又謙讓不肯接愛,說:“倉庫的穀子很多,不缺乏,不願讓百姓破費。”百姓更加高興,惟恐沛公不做秦王。
有人勸沛公說:“秦地比天下富足十倍,地勢好。如今聽說章邯投降了項羽,項羽就給了雍王的封號,在關中稱王。現在即將來到關中就國,你沛公恐怕不能占有這個地方了。應趕快派兵把守函穀關,不讓諸侯軍進來,逐漸征集關中兵,以加強實力,抵抗諸侯兵。”沛公讚成他的計策,照著做了。
十一月間,項羽果然率領諸侯軍西進,想要入關,而關門閉著。聽說沛公已經平定關中,項羽大怒,派黥布等攻破了函穀關。十二月間,就到了戲水。沛公左司馬曹無傷聽說項王發怒,要攻打沛公,派人告訴項羽說:“沛公想要稱王關中,令子嬰為相,珍寶被他全部占有了。”打算以此求得封賞。亞父勸項羽進攻沛公。當時項羽飽餐士卒,準備明日會戰。這時項羽兵四十萬,號稱百萬。沛公兵十萬,號稱二十萬,兵力敵不過項羽。恰巧項伯要救張良,夜間去見他。(回來後,)用道理勸說項羽,項羽取消了進攻沛公的計劃。沛公帶來了一百多騎兵,飛奔至鴻門,來見項羽,表示歉意。項羽說:“這是你沛公左司馬曹無傷向我說的。不然,我項羽何至於做這樣的事。”沛公因為樊噲、張良的緣故,得以脫身返回。回來後,他立刻殺了曹無傷。
項羽向西進軍,屠殺無辜,焚毀鹹陽秦宮室,所過之處,無不遭到摧殘破壞。秦地的百姓大失所望,然而心裏恐懼,對他不敢不服從。
項羽派人回去報告楚懷王,楚懷王說:“按照原來的約定辦。”項羽怨恨楚懷王不肯讓他與沛公一起西進入關,而派他北上救趙,在天下諸侯爭奪稱王關中的約定中落在後麵。他就說:“懷王,是我家項梁所立,沒有什麼功勞,憑什麼主持約定。本來安定天下的,是諸位將領和我項籍。”就假意推尊楚懷王為義帝,實際上不聽從他的命令。