Nel frattempo, preoccupato dalle mire espansionistiche puniche in Hispania, il Senato stipulò un nuovo patto con Cartagine; tuttavia, nel 218 a.C., dato che il generale punico Annibale Barca attaccò la città di Sagunto, alleata di Roma, si decise di dichiarare nuovamente guerra a Cartagine. Annibale valicò le Alpi con un potente esercito comprendente anche elefanti e inflisse varie sconfitte alle legioni romane. Dopo una fase di stallo, durante la quale Roma poté riorganizzarsi, grazie alla politica attuata dal "dictator" Quinto Fabio Massimo, detto il temporeggiatore, le legioni romane subirono una pesante sconfitta contro Annibale nella battaglia di Canne (216 a.C.). Mentre numerose città si alleavano con i Cartaginesi e anche la Macedonia di Filippo V scendeva in guerra contro Roma, Annibale si attardò nel Sud Italia ("ozi di Capua"), mentre i Romani, seppure provati, poterono lentamente ricostituire le proprie forze: il console Publio Cornelio Scipione ottenne diverse vittorie sui Cartaginesi in Hispania, mentre in Italia Roma riuscì ben presto a recuperare le città italiche che l'avevano tradita per allearsi con Annibale e sconfisse anche il fratello di Annibale, Asdrubale Barca, mentre tentava di portare rinforzi ad Annibale. Nel 203 a.C. Scipione, conquistata la Penisola iberica e ristabilita la situazione in Italia, sbarcò in Africa per tentare di ottenere una vittoria definitiva e sconfisse Annibale, nel frattempo tornato a Cartagine, nella battaglia di Zama, costringendo Cartagine a capitolare e ad accettare le dure condizioni di pace imposte da Roma.