Картагињани су започели са преговорима, али су их напустили по наговору Ханибала који је напустио Апенинско полуострво и стигао у Африку да брани отаџбину. Ханибалове снаге износиле су око 40.000 људи (36.000 пешака и 4000 коњаника), а Сципионове снаге 29.000 пешака и 6100 коњаника. Двојица војсковођа сукобили су се у бици код Заме, недалеко од Утике, 19. октобра 202. године п. н. е. Ханибал је своју војску распоредио у три линија фаланги. Намеравао је да нападом слонова разбије римске линије и нападне их пешадијом и коњицом. Међутим, Ханибал је водио војску сакупљену на брзину која се по квалитету знатно разликовала од оне коју је имао у Италији. Искусна римска коњица брзо је разбила картагинску. Сципион је своју војску распоредио тако да лако може пропустити слонове који су могли нападати само правом линијом. Римљани су се сукобили са трећом Ханибаловом линијом. У једном тренутку Ханибалу је победа била надомак руке. Међутим, битку је решила римска коњица. Ханибалова неискусна војска није јој се могла супротставити. Битка код Заме одлучила је исход рата. Други пунски рат завршен је следеће године. Картагињани су пристали на римске услове. Одрекли су се свих територија у Шпанији, морнарице, пристали су на плаћање великог данка. Нису смели водити ни ратове без одобрења Рима.