In 198 AD, Yuan Shao fled to Ji Province, defeated Gongsun Zan who occupied the area, and then seized control of Qing, You, and Bing provinces for himself; after a period of development, Yuan Shao had amassed an army of 100,000 troops. At that time, Cao Cao had only 20,000 soldiers, and in terms of strength, Yuan Shao was considered the most powerful of the regional warlords. Although Cao Cao's forces were small, he constantly aimed to eliminate Yuan Shao, but before that, he first needed to expand his own power.
Cao Cao first launched an attack on Yuan Shu, who was entrenched in Shouchun (present-day Shouzhou, Anhui), and in no time at all routed Yuan Shu's army, forcing him to abandon the city and flee to join Yuan Shao. Next, Cao Cao secretly instigated trouble in Henei Commandery, then sent troops to attack and eventually occupied it. By this time, Cao Cao's territory roughly covered most of the region south of the Yellow River and north of the Huai and Han Rivers, while Yuan Shao was situated in the area north of the lower Yellow River, with the two men now locked in a standoff.
At first, Yuan Shao did not take Cao Cao seriously, but as Cao Cao's power grew day by day, Yuan Shao had to start paying attention to his movements. Wanting to proclaim himself emperor, Yuan Shao found Cao Cao to be the first obstacle in his way, and thus felt it necessary to eliminate him. In the year 200 AD, Yuan Shao ordered his general Yan Liang to lead an army of 100,000 soldiers and over 10,000 war horses, preparing to march south and attack Xudu.
Cao Cao had long been eager for a decisive battle with Yuan Shao, and now that the opportunity had arrived, he was naturally excited. However, his subordinates were filled with anxiety, with many believing that Yuan Shao's formidable army and strong forces made victory highly unlikely, but Cao Cao disagreed. He knew Yuan Shao well and believed that Yuan Shao was nowhere near as formidable as others claimed, merely a petty man who underestimated himself, utterly ignorant of military strategy, and treated his subordinates poorly, making him unpopular among his own troops. Thus, Cao Cao did not fear Yuan Shao; he gathered all his forces, first sending Zang Ba with a detachment of soldiers from Langya (present-day northern Linyi, Shandong) to Qingzhou, occupying Qi Commandery (present-day Linzi, Shandong), Beihai (present-day Changle, Shandong), and Dong'an (present-day Yishui County, Shandong) to prevent Yuan Shao's forces from launching a surprise attack from the east of Xuchang. He then dispatched another contingent to garrison Guanzhong and sought to occupy Liangzhou. Cao Cao himself led a force to set up a defensive line at Liyang in Jizhou, and also stationed troops at Guandu (present-day northeast of Zhongmu, Henan).
With 20,000 troops against an army of 100,000, the chance of victory was indeed very slim, so Cao Cao did not spread his forces thin but instead concentrated on defending several key positions—this approach was undoubtedly correct. In particular, Guandu was a location with well-developed water transportation and was surrounded by important towns, and it also served as a crucial gateway to the northeast of Xuchang; if it were not held, Xuchang would surely have been taken by Yuan Shao.
Just as Cao Cao was nervously preparing his defenses, Liu Bei launched an attack against him first. Liu Bei had previously escaped from Cao Cao's control and occupied Xuzhou, which infuriated Cao Cao. After a period of regrouping and development, Liu Bei now commanded over ten thousand troops and held both Xiapi and Pei County. Upon hearing that Yuan Shao was planning to campaign against Cao Cao, Liu Bei allied with Yuan Shao and struck first, catching Cao Cao off guard. However, no sooner had Liu Bei dispatched his forces than Cao Cao personally led his army to attack Pei County. Within a short time, Cao Cao captured Pei County and seized Guan Yu, while Liu Bei fled to Yuan Shao's territory for refuge.
Yan Liang first besieged Baima City, and Cao Cao led his troops to counterattack. He deliberately moved his forces to Yanjin (north of present-day Yanjin, Henan, west of Baima), making Yan Liang believe they intended to cross the river there. The Yuan army fell for the ruse, and Yan Liang sent a detachment to Yanjin to attack Cao's forces. Seizing the opportunity, Cao Cao suddenly turned his army back to Baima, catching Yan Liang off guard. With morale high, Cao's troops pushed forward while Yuan's forces retreated in defeat. Yan Liang was ultimately killed by Cao Cao, and Baima City fell under Cao's control.
When Yuan Shao heard of Yan Liang's death, he was greatly shocked and deeply grieved at the loss of one of his top generals. However, relying on his abundant troops, he still underestimated Cao Cao. Yuan Shao ordered his army to split into two forces, attacking Guandu from the east and west. Cao Cao led his troops to counterattack but was defeated by Yuan's forces and retreated. Afterward, Cao Cao launched several more assaults, all of which ended in failure. Yuan Shao built many tall wooden watchtowers and piled up mounds of sand and earth. Archers stood on the towers or hid behind the mounds, shooting arrows into Cao Cao's camp, killing many of his soldiers. One of Cao Cao's strategists came up with a clever plan: he had the soldiers build catapults, called "thunderbolt chariots," that could hurl large stones. The stones crashed down from midair onto the wooden towers, not only destroying them but also killing many of Yuan Shao's men. When Yuan Shao saw his plan fail, he devised another scheme to dig tunnels to launch a surprise attack on Cao Cao's camp from underground. But Cao Cao discovered Yuan's plan, and the tunnels were quickly sealed off by Cao's troops using earth.
Three months had passed, and the armies of Cao and Yuan had clashed multiple times without either side achieving a decisive victory. If the stalemate continued, Cao's forces would be defeated due to a lack of supplies, leaving Cao Cao frantic and unsure of what to do, while his soldiers grew weary and lost confidence—a situation whose consequences would be dire if it persisted.
Just then, Yuan Shao transferred a large amount of grain and fodder from his rear to be stored at Wuchao (southeast of present-day Yanjin, Henan), guarded by the general Chunyu Qiong. At this time, Cao Cao's army had only enough food to last a month, putting them in a critical situation. At this moment, Yuan Shao's strategist Xu You, feeling undervalued, defected to Cao Cao and proposed the plan to burn Wuchao. Overjoyed, Cao Cao treated Xu You as an honored guest and carefully discussed the surprise attack on Wuchao with him. He then personally led elite cavalry, carrying Yuan Shao's army flags, and secretly approached the location where Yuan's army stored its provisions. Cao's troops set fires all around Wuchao, and the granaries were instantly engulfed in flames. Yuan's soldiers, terrified by the fire and shouts, lost their composure and forgot to resist, allowing Cao's forces to kill tens of thousands of them, and Chunyu Qiong was also killed.
After the burning of Wuchao, Cao's army pressed forward with a single surge toward Yuan's camp; upon hearing that Chunyu Qiong had been killed, many of Yuan's generals surrendered their weapons to Cao Cao, and with Cao's forces also slaying over seventy thousand of Yuan's soldiers, Yuan Shao's troops dwindled to a mere handful. Seeing that the tide had turned irretrievably, Yuan Shao abandoned his remaining scattered soldiers and fled back alone, thus ending this battle with Cao Cao's victory.
The Battle of Guandu is one of the most famous battles in Chinese history where a smaller force defeated a larger one; Cao Cao, with only over 20,000 men, defeated Yuan Shao's army of 100,000. After the battle, Yuan Shao remained mired in depression over his defeat and soon died of melancholy. Taking advantage of this, Cao Cao wiped out Yuan Shao's remaining forces and gradually unified the northern region.