元璋取得浙东后,他的领土东、北两面与张士诚相接,西邻陈友谅,东南邻方国珍,南邻陈友定。在这些敌国中,方国珍、陈友定志在保土割据,并无远大企图。张士诚最富,占有江、浙沿海地区,战略上对元璋威胁不大,而他又对元朝首鼠两端,没有多大雄心。陈友谅最强,雄居上游,而且野心勃勃,是最危险的敌人。
陈友谅原是徐寿辉手下大将倪文俊的部下,后来他杀死倪,挟制徐,极力扩张地盘。1360年6月,陈友谅挟徐东下,用水军猛攻太平,元璋的养子朱文逊、骁将花元战死。友谅得太平,以为应天唾手可得,便杀了徐寿辉,自称皇帝,国号汉,改元大义。他派使者与张士诚相约,东西夹击应天,瓜分朱元璋的领地。友谅的水军阵容浩大,战舰遮天蔽江而下,应天大震。
刘基到应天后,元璋曾征求他对军事形势的意见,他认为最危险的敌人莫过陈友谅。友谅势力最强,版图最大,又据我上游,因此必须先集中力量消灭他。友谅势力虽强,但杀君胁众,剽悍不怕死,不惜让人民为他陪葬,部众离心,人民疲敝,不难战胜。上游无事,张士诚势孤,可一举而定。然后北取中原,可成王业。元璋听了极为赞赏。
陈友谅东下的警报传来,元璋召刘基商讨对策。刘基认为不能逃避,必须决一死战。我方力量有限,要避免两线作战,关键是要争取主动,集结主要兵力,先给主要敌人陈友谅以迅速沉重的打击,则张士诚不敢轻举妄动。
争取主动的办法是诱敌深入,制造战机。元璋的部将康茂才和陈友谅是老朋友,茂才的仆人也曾侍候过友谅。茂才于是修书一封,让仆人带着偷跑到友谅军营,说他愿意做内应。他守的是江东桥。从长江到应天西城墙有条三叉江,江东桥就在这条江上。当友谅进攻时,他就把这座木桥吊起来,让友谅的军舰直达应天城墙下,施展特有的军舰攻城术,并约好接应信号。
元璋得到康将军仆人的回信,一面调胡大海进取广信,抄陈友谅的后路,一面按友谅的进军路线设下埋伏,并连夜将江东桥改造成石桥。一切准备停当,只待友谅自投罗网。
6月23日晨,陈友谅率舰队赶到江东桥,发现桥是石头的,知道上了当,于是向长江返航,并直驶龙湾(南京沿江六渡口之一),在那里弃舟登陆,然后在开阔地上整编队形。元璋在卢龙山(狮子山)俯瞰着一切。当汉军进入预定的伏击圈,便挥旗发兵,顿时伏兵四起,战鼓雷鸣,将汉军团团包围。汉军被打得七零八落,逃到江边,却发现已经退潮,许多舰只搁浅在泥滩上。这一仗,汉军留下2万具尸体,7千名俘虏,百余艘大舰,数百艘小船。元璋乘胜收复太平,攻下安庆,取信州、袁州(江西宜春)。
陈友谅逃到九江,重整旗鼓,次年(1361年)8月,又攻下安庆。元璋于是亲统已占优势的水军溯江而上,沿江乘风而下。陈友谅逃到武昌。元璋的军队于是攻克江西其他州县。
正当元璋与陈友谅鏖战的时候,中原的形势发生了很大变化。红巾军由于内部分裂,从全盛走向失败。而元军在击败红巾军后,也陷入军阀混战的局面。
1362年9月,元将扩廓帖木儿的部队包围红巾军在山东的据点益都,刘福通自安丰(今安徽寿县)赴援,遭失败。1363年2月,张士诚派将吕珍率兵围安丰,刘福通向元璋告急。元璋认为如果安丰失陷,则张士诚的气焰会愈益嚣张,不能不救。刘基却反对:第一,大兵不当轻出,万一陈友谅乘虚来攻,便进退无路;第二,救出小明王,当发放何处?是让他继续当皇帝,还是关起来,或者杀掉?若是后者,根本没有救援的必要,若是前者,简直就是自讨没趣,找个顶头上司来管自己。但元璋还是不顾反对去救安丰了。原因可能是无论信仰或名分,他都是韩林儿的部下,不救君上,也是不仁不义的事情,在红巾军将士中会失去威信。不过,待元璋赶到,吕珍已击杀刘福通,元璋力战,救出韩林儿,安置在滁州。
当元璋出兵救安丰的时候,陈友谅果然乘虚进攻。6月5日,汉军大兵围洪都(南昌),同时占领了吉安、临江、无为州。东友谅制造了数百艘大军舰,上下3层,层层都可跑马。船尾高耸,可以当作攻城的云梯。这次他是孤注一掷,将家小百官都装在船上,空国而来,号称60万。不过,在洪都他的军舰攻城术已不能发挥作用。元璋取洪都后,鉴于太平失守的教训,将城墙改筑,往河岸上后退了30步,这样,陈友谅的部队就不能借助军舰的优势直接攻城,而是必须舍舟登岸,采用陆战,这便增加了攻城的难度。汉军用尽了各种攻城的办法,洪都守将朱文正也用尽了各种守城的办法,在被围的85天中,付出了巨大的牺牲,最终未让敌人前进一步。
在洪都被围70多天的时候,城内的粮食、军备物资都将用完,但应天还丝毫不知消息,朱文正便假装答应投降,使汉军放松了攻势,乘机派出信使告急。
8月15日,朱元璋亲率水陆军20万自应天赴援洪都。25日抵达湖口,布置军队扼守鄱阳湖通往长江的水道,绝断陈友谅的退路。陈友谅得知元璋援军到了,便撤去围城的部队,入湖迎战。从两军的形势看,汉军在人数和船只的体积方面优于元璋的部队,但元璋在士气、后勤、内部团结方面占有明显的优势。
鄱阳湖水战,从8月29日开始,到10月3日结束,持续了36天之久。元璋取胜的战术在于他充分发挥了小船灵活的长处,对汉军进行了有效的火攻。战斗中,元璋的旗舰搁浅,差点让汉军俘虏。最后,陈友谅被乱箭射死,汉军失去主帅,全军崩溃,部将张定边载着友谅的尸首和太子陈理乘夜色逃回武昌。元璋后来与刘基谈论这次战役说:“我真不该到安丰去!假如友谅趁我远出,直捣应天,我便进无所成,退无所守了。但他不直攻应天,反去围洪都,在那里被困3个月,给我充分的时间来调兵遣将,友谅取此下策,不亡何待!不过,这一仗虽然打赢了,可也是够险的。”
鄱阳湖水战结束,元璋随即回到应天,令部将攻武昌。他见张士诚没有动静,11月又到武昌督战。城坚难攻,便实行围困的办法,同时分兵攻取湖北各州县,元璋自己则仍回应天。
1364年农历元旦,元璋自称吴王,建百官司属,但仍奉小明王为皇帝,用龙凤纪年,发布的命令称“皇帝圣旨,吴王令旨”,史称西吴政权。
3月,元璋第二次到武昌督兵攻城,于城下破汉军援兵。陈理粮尽力竭,出城投降。元璋封陈理为归德侯,后又将他安置高丽。
灭了陈友谅,去掉了最险恶的敌人,当然要对有功人员论功行赏。为鄱阳湖水战取胜做出最重要贡献的朱文正却未得到应有的赏拔,心中不平,后被人告发,元璋便将这惟一的亲侄禁闭起来,囚死在凤阳的故里。可见权力面前无亲情。