בתקופה הזו, הוגבלה תנועתו של חניבעל לבוהן הדרום-מערבי של איטליה. בעת שהייתו בסיציליה ניצל סקיפיו הזדמנות ולכד את נמל לוקרי מידי חניבעל.
סקיפיו הבין שעליונותם של הקרתגים ובמיוחד של הנומידים בלחימת הפרשים יכולה להוכיח עצמה כהרת אסון כלפי הלגיונות הרומים אשר מורכבים ברובם מחיל רגלים. אנקדוטה אחת מספרת שסקיפיו לחץ על כמה מאות מבני האצולה הסיציליאנים ליצור חיל פרשים. הסיציליאנים התנגדו לדרישה זו ומחו באופן נמרץ. סקיפיו קיבל את הוצאתם מהכלל בתנאי שיספקו סוס, ציוד ורוכב מחליף בשביל הצבא הרומי. בדרך זו, סקיפיו יצר גרעין קשה של פרשים בשביל המערכה באפריקה.
הסנאט הרומי שלח ועדת בדיקה לסיציליה לבחון את התקדמותו של סקיפיו בגיוס הצבא, וזו מצאה את סקיפיו עומד בראש צבא מאומן ומצויד היטב. סקיפיו לחץ על הסנאט לאשר לו מעבר לאפריקה. השמרנים בסנט הרומי, אשר הובלו על ידי פאביוס מאקסימוס 'המתמהמה', התנגדו למשימה זו. פאביוס חשש עדיין מכוחו של חניבעל וראה בכל משימה לאפריקה סיכון רב ובזבוז למאמץ המלחמתי. ברומי עוד זכרו את הפלישה הרומית הרת האסון שהוביל הקונסול מרקוס אטיליוס רגולוס במלחמה הפונית הראשונה, והסתיימה באובדן הצבא והצי, ונפילת הקונסול בשבי. סקיפיו היה בעמדה לא נוחה גם בשל הבוז שסנטורים אחדים חלקו לו בשל טעמו הפרו-הלני באומנות, כגון דברי מותרות ופילוסופיה.
כל מה שסקיפיו הצליח להשיג, זו הרשאה לעבור מסיציליה לאפריקה אם הדבר יתאים לאינטרסים רומאיים, אולם ללא תמיכה כלכלית או צבאית. בהוראת הוועדה, סקיפיו שט ב-204 לפנה"ס, נחת ליד אוטיקה (Utica) והטיל עליה מצור. עם הגיעו חבר אליו מסיניסה עם פרשיו הנומידים.
בינתיים, קרתגו הבטיחה את ידידותם של המלך הנומידי סיפקס (Syphax), וזה נלווה אל עזרובעל גיסקו. התקדמותם משכה את סקיפיו לזנוח את המצור על אוטיקה ולנחות על החוף בין אוטיקה לקרתגו. ב-203 לפנה"ס, הוא השמיד את הכוחות המשולבים של הקרתגים והנומידים על ידי התקדמות חשאית וערמומית והצתת המחנות שלהם קצת לפני השחר, דבר שיצר בהלה ובלבול והוביל למנוסה של הכוחות המשולבים, אשר ברובם נהרגו על ידי צבאו של סקיפיו. על אף שזהו אינו קרב סדור, גם ליוויוס ופוליביוס מעריכים שמצבת ההרוגים בהתקפת יחיד זו עלתה על 40,000 מתים מבין הקרתגים והנומידים, ועוד רבים שנפלו בשבי.
היסטוריונים באופן גס, נוטים להיות אחידים בשבחיהם על מהלך זה. פוליביוס אמר "מכל התימרונים המבריקים שסקיפיו ביצע, נראה שמהלך זה היה המבריק וההרפתקני ביותר מכולם". מצד שני, אחד מההיסטוריונים הראשיים של חניבעל, תיאודור אייראוט דודג', קצין אמריקאי והיסטוריון צבאי 1842–1902, מרחיק לכת ומציע שהתקפה זו נבעה מפחדנות והשפיעה לא יותר ממשקלו של עמוד על כלל האירועים בסיכומם, למרות העובדה שמתקפה זו הבטיחה את המצור על אוטיקה והוציאה באפקטיביות את סיפקס אל מחוץ למלחמה. האירוניה בהאשמותיו של דודג' על פחדנותו של סקיפיו, היא שהתקפה זו משקפת עקבות של אופן הפעולה החביב על חניבעל - מתקפת הפתע.
לאחר שתוגברו על ידי 4,000 חיילים קלטיברים ותיקים, יצאו שוב עזרובעל וסיפאקס לקרב. מאמציו של סקיפיו בחיזוק פרשיו נשאו כעת פרי, והמצביאים הקרתגיים הוכו מכה ניצחת, זו הפעם השנייה, על ידי סקיפיו ומסיניסה בקרב המישורים הגדולים.
עזרובעל שב לקרתגו ושם שלח יד בנפשו, כדי לא לעמוד למשפט העם. סיפאקס נמלט אל ממלכתו, וסקיפיו שחרר את שני סגניו, לליוס ומסיניסה, לרדוף אחריו. השניים הביסו את צבאו בקרב קירטה וכבשו את ממלכתו. סיפאקס נלקח בשבי לרומא, וסופוניסבה אשתו התאבדה בבליעת רעל. כך הבטיח סקיפיו את הכתרתו של בן בריתו מסיניסה כמלך הנומידים. קרתגו, ובמיוחד חניבעל עצמו, סמכו זמן רב על הפרשים הטבעיים המעולים של נומידיה, אך אלה עברו כעת להילחם לצד רומא.
המערכה נגד חניבעל.
קרתגו, שאיבדה את צבא השדה האחרון שברשותה, ננטשה על ידי בעלי בריתה באפריקה, ועמדה בפני התקפה של צבא רומאי חזק ומנוסה, החלה במשא ומתן דיפלומטי עם נציגי רומא. במקביל נקראו חניבעל ומאגו לשוב בדחיפות מאיטליה לצפון אפריקה, כדי להציל את קרתגו. באמצעות הפלישה לצפון אפריקה הצליח סקיפיו להשיג מטרה, שכל המפקדים הרומיים שקדמו לו נכשלו בה - לאלץ את חניבעל לנטוש את מאחזו בדרום איטליה לאחר 15 שנות לחימה על אדמת איטליה (218-203 לפנה"ס). במסגרת המשא ומתן דרש סקיפיו את פינוי איטליה, וויתור מלא על היספניה ואיי הים, הכרה במסיניסה כמלך הנומידים ובאוטונומיית השבטים הלובים, החזרת כל שבויי המלחמה והעריקים הרומאיים, הסגרת הצי הקרתגי למעט 20 ספינות, ופיצויים לרומא בגובה 5000 טלנטים. למרות התנאים הקשים שמחקו את עצמתה הימית של קרתגו והגבילו מאוד את פעולתה באפריקה, הסכימו הקרתגים לקבלם, והוסכם על שביתת נשק, אולם עם בואו של חניבעל לאפריקה נערכו הקרתגים לחדש את המלחמה.
קיימת מחלוקת היסטורית בנוגע להרכבו וגודלו של הצבא, שחניבעל החזיר עמו מאיטליה. חסידיו של חניבעל טוענים כי צבאו הורכב בעיקר מתושבים מקומיים מדרום-איטליה, שגויסו או התנדבו לצבאו של חניבעל, ושרוב הצבא המקורי איתו פלש לאיטליה (ובמיוחד הפרשים הנומידיים) חדל מלהתקיים במהלך המערכה הממושכת שהוא ניהל בחצי האי האיטלקי. תומכיו של סקיפיו טוענים כי מספר החיילים הוותיקים, שנותרו בצבאו של חניבעל, היה גדול יותר.
כוחותיו של חניבעל כללו 36–58 אלף רגלים וכ-4,000 פרשים (כולל כ-15 אלף חיילים אותם הביא עמו מאיטליה), בסיוע 80 פילי מלחמה. כוחותיו של סקיפיו כללו (לפי מקורות שונים) 29-34 אלף רגלים ו-5,500-8,700 פרשים, כולל 6,000 רגלים ו-4,000 פרשים נומידיים, שהביא עמו מסיניסה. בעוד צבא חניבעל נהנה מעדיפות בכוח הרגלים, צבאו של סקיפיו נהנה מעדיפות בפרשים. שני הצבאות נפגשו במישור בין קרתגו לאוטיקה (Utica), ב-19 באוקטובר שנת 202 לפנה"ס.
לפני הקרב, נעשה ניסיון נוסף למשא ומתן שיסיים את המלחמה בדרכי שלום, ושני המצביאים נפגשו. על אף ההערכה ההדדית בין שני המצביאים, המשא ומתן נכשל. סקיפיו הציב בפני חניבעל את תנאי השלום שהוסכמו קודם לכן בין קרתגו לרומי, וחניבעל הסכים לכל התנאים פרט לפירוק הצי והסגרת העריקים. הדבר שם קץ למשא ומתן, כיוון שמלכתחילה הסכים סקיפיו לשלום רק אם חניבעל יציע יותר, והוא הציע פחות.
קרב זאמה.
חניבעל ארגן את הרגלים שלו ב-3 קווים, בדומה למערך המקובל בצבא הרומאי. בקו הראשון הוצבו שכירי חרב מגאליה ומליגוריה וקלעים מהאיים הבלאריים, שגויסו על ידי אחיו מאגו (מאגו עצמו מת מפצעיו בדרכו לאפריקה). בקו השני הוצבו רגלים בעלי חימוש כבד יותר, רובם טירונים שגויסו מקרתגו ומלוב, ואילו בקו האחרון הוחזקו ותיקי המלחמה מאיטליה, שרידי צבאו המקורי של חניבעל. לא ברור מדוע בחר להיערך באופן הזה. ייתכן שחניבעל לא בטח בטירונים החדשים שגייס, והשתמש בהם רק כ-"בשר תותחים" עבור החיילים הוותיקים מאיטליה, אותם שמר רעננים לשלב המכריע.
את פרשיו הציב חניבעל באגפים, ואת הפילים פרס לפני צבאו. נדמה שתוכניתו הייתה פשוטה: התקפה מאסיבית של פילי מלחמה, שנועדה ליצור פרצות בקו החזית הרומאי ולגרום לפאניקה, אשר תנוצל על ידי הרגלים שלו בסיוע הפרשים לצורך הכרעת הקרב.
במקום לסדר את כוחותיו בתבנית לוח השחמט המקובלת בצבא הרומי (כאשר המאניפולים של הקו השני מוצבים מאחרי הרווחים בין המאניפולים בקו הקידמי), סקיפיו החליט למקם את המאניפולים (מניפולוס; יחידה צבאית רומית המורכבת מ-60–120 לוחמים) שלו בשורה עורפית, ובכך יצר מעברים פתוחים לכל עומק המערך של הלגיונות שלו. הייתה זו טקטיקה שנועדה להתמודד עם פילי המלחמה הקרתגים, ולמנוע מהם לשבש את המערך הרומאי. עם הערכות זו של צבא סקיפיו, כשהפילים של קרתגו הסתערו, הם נתקלו במלכודות שהונחו בקפידה לפני הקווים הרומיים, ובחצוצרנים רומיים שהבריחו ובלבלו חלק משמעותי מהפילים. בנוסף, פילים רבים תועלו לעבור באופן בלתי מזיק דרך המעברים בקווים של הלגיונות, על ידי הווליטים (חי"ר קל) ולוחמים אחרים.
רמחים רומיים עשו עבודה אפקטיבית, והמלכודות החדות גרמו לאי-סדר בפילים. חלקם היו כה מבולבלים עד שהסתערו בחזרה לתוך קווי הצבא הקרתגי, וגרמו שם למהומה בעיקר בקרב הפרשים של חניבעל. החי"ר הרומי נבהל מהפילים, אך הנומידים בפיקוד מסיניסה והפרשים של גאיוס לליוס, שנהנו מעליונות מספרית ואיכותית, החלו בהנסת פרשי האויב משדה הקרב. שני מפקדי הפרשים רדפו אחר הפרשים הקרתגים והשאירו את הרגלים משני הצדדים להילחם זה בזה.
הקרב בין כוחות הרגלים של הצדדים היריבים היה אכזרי ועקוב מדם, והתנהל ללא הכרעה. בתחילה הדפו הקרתגים את אויביהם לאחור, אולם אז תוגבר הקו הרומאי הראשון בחיילים מן הקו השני. הקו הקרתגי הראשון הובס, וחייליו נסוגו לאחור בתקווה למצוא מקלט מאחרי הקו הקרתגי השני, אך החיילים בקו השני לא אפשרו להם לעבור דרכם, אם מחשש שפתיחת השורות תשבש את מערכם ואם משום שחניבעל הורה על כך מפורשות. חלק מהנמלטים ניסו להבקיע לעצמם דרך בלחימה, והשאר פנו ימינה ושמאלה והגדילו את רוחב החזית הקרתגית. כעת קידם חניבעל את הקו השני, אך גורלו דמה לזה של הקו הראשון וסקיפיו הביס גם אותו.