Покончив с приготовлениями, оба полководца с нетерпением ждали начала сражения. Сципион вышел из лагеря во главе конницы и легковооруженной пехоты, планируя провести разведку боем, выяснить расположение лагеря пунийцев и проследить за их передвижениями, однако не собирался начинать пока крупное сражение. Ганнибал также вывел свою кавалерию для осмотра местности и выбора позиций перед будущей битвой. Встреча отрядов произошла неожиданно для обоих полководцев, узнавших о приближении врага по вздымавшимся впереди облакам пыли. Поняв, что столкновение неизбежно, военачальники остановились и построили войска в боевые порядки. Сципион впереди построения поставил легкую подвижную пехоту, вооруженную метательными дротиками, и союзную кельтскую конницу, тогда как римскую кавалерию и лучших всадников из числа союзников разместил во второй и третьей линиях и в тылу. Ганнибал, в отряде которого не было пехотинцев, выставил в центре тяжеловооруженных карфагенских и иберийских кавалеристов, а на фланги отправил подвижных нумидийских всадников. Бой начался со стремительного сближения неприятелей, во время которого римские велиты едва успели метнуть по одному дротику, после чего были вынуждены отступить в тыл между рядами стоявших за ними галльских и римских всадников, чтобы не быть растоптанными несущейся навстречу пунийской кавалерией. Последовавшая затем конная сшибка не принесла заметного успеха ни одной из сторон – боевые порядки сражающихся смешались и битва превратилась во множество индивидуальных схваток, во время которых многие всадники были выбиты из седел, а иные спешивались сами, чтобы было удобнее сражаться с пешими врагами.
Начавшееся как кавалерийское, сражение быстро превратилось в смешанную схватку конницы и пехоты, причем пеших воинов становилось все больше. Битва затягивалась, воины обеих армий дрались упорно и мужественно, и ни одна из сторон не имела значительного преимущества. Между тем сосредоточение основных сил римлян в центре сражения позволило не задействованным нумидийским всадникам обойти римское войско с флангов и, зайдя ему в тыл, ударить вначале по сосредоточившимся там легковооруженным пехотинцам. Велиты были снесены первым же молниеносным рывком подвижной кавалерии, после чего нумидийцы зашли в тыл вражеской коннице. Удачно проведенный маневр решил судьбу сражения – не выдержав одновременного натиска карфагенской кавалерии с фронта и нумидийских конников с тыла, римляне отступили с поля боя, а часть из них спаслась бегством. Тяжелую ситуацию усугубило ранение Публия Корнелия Сципиона, которого атаковали одновременно несколько вражеских всадников. Лишь вмешательство семнадцатилетнего сына консула, будущего победителя Ганнибала Публия Корнелия Сципиона Младшего, участвовавшего в сражении с разрешения отца, спасло консула от плена или даже гибели. Пока сопровождавший юношу отряд отборных всадников пребывал в нерешительности, Сципион-младший «один с изумительной отвагой понесся на врагов, окружавших его отца. Тогда должны были броситься в битву и прочие воины; неприятели в ужасе бежали, а чудесно спасенный Публий тут же сам в присутствии всех назвал сына своим спасителем» (Polyb. Х, 3, 2–6; см. также Liv. XXI, 46, 7–8). Согласно другой версии, консула спас некий раб лигурийского происхождения, однако античная историческая традиция, склонная к прославлению будущего победителя Ганнибала, в основном отдала предпочтение преданию о спасении отца именно собственным сыном (Liv. XXI, 46, 10).