孙可望与李定国、刘文秀原先约定二十一日会战,他的意图是推迟交锋日期,使张胜、马宝军有更充裕的时间奔袭昆明。李定国听了白文选的意见,又在十八日晚上读到马宝的来信,当机立断传令各营次日出战。十九日天还没有亮,定国、文秀兵马开营出战;可望也挥军迎敌,双方交战于交水三岔口[83]。对阵之初,文秀骁将崇信伯李本高马蹶被杀,前锋失利。可望立于高阜观战,见已挫定国锐气,即命诸营乘胜前进。白文选知道形势危急,亲率五千铁骑冲入马惟兴营中,二军联合抄出可望阵后,连破数营,定国、文秀趁势挥军进击,可望军大乱,将士大呼:“迎晋王!迎晋王!”[84]十几万大军顷刻瓦解。孙可望见形势陡变,在少数兵马保护下,仓皇东窜。过安顺时,马进忠不仅“闭门不纳”,还派出一支军队追击,“使疾走,无得集众”[85],孙可望匆忙逃往贵阳。
交水之战结束后,定国同文秀商量说:“今张胜往袭云南府(即昆明),王自奇又据永昌,我当回救;汝可同文选急追可望,必擒之而后已。”[86]二人分工后,定国即率师回援。张胜、马宝、武大定所统七千精骑取小路经五日夜急行军已进抵昆明城下,马宝唯恐城内疏于防备,故意沿途焚烧房屋,使偷袭变成了明攻。城内王尚礼等听说可望之兵已近,正准备上城接应,却被永历帝召入宫内,由沐天波、靳统武率亲军看守,动弹不得。这时,交水大捷的露布已星驰送到昆明,永历帝命人把捷报大张于金马、碧鸡坊下,安定民心。张胜带兵至昆明城下准备攻城,忽然看见定国、文秀报捷露布,知道可望大军已败,原先约好充当内应的王尚礼又音息全无,城上防守严密,被迫退军,在地名浑水塘处碰上定国回援之师,张胜欲夺路而逃,挥军死战,定国军因交水大战之后急救根本,路远兵疲,几有不支之势。马宝为扭转战局,在张胜阵后连放大炮,拥兵杀来,与定国军前后夹攻。张胜大吃一惊,说:“马宝亦反矣!”收拾残兵败卒突阵而逃。第二天,过沾益州,驻守该地的总兵李承爵原系他的部将,率兵来迎。张胜喘息方定,正向李承爵叙说战败原因,忽然左右冲出数人,出其不意把张胜擒缚。张胜斥责李承爵道:“汝为部将,何敢叛我?”承爵回答道:“汝敢叛天子,吾何有于汝乎!”张胜被解至昆明处斩[87]。