Barnes is a product of the Leicester City academy, which he joined at the age of nine. He signed his first professional contract with the club on 25 June 2016 and on 7 December 2016 made his debut for the first team as a second-half substitute in a 5–0 UEFA Champions League defeat to FC Porto. During the first half of the 2016–17Premier League 2 season for Leicester City U23, Barnes scored five goals and provided assists for five others.
On 20 January 2017, Barnes joined League One club Milton Keynes Dons on loan for the remainder of the 2016–17 season. A day later, Barnes scored on his home debut as a 76th-minute substitute for Chuks Aneke in a 5–3 win over Northampton Town. Barnes followed his debut goal with another goal a week later, on 28 January, scoring in a 4–0 away win over rivals Peterborough United. On 2 May 2017, after impressing with 6 goals in 21 appearances for the club, he was awarded Milton Keynes Dons' Young Player of the Year 2016–17 award. On 21 July 2017, Barnes signed a new four-year contract, keeping him at Leicester until July 2021.
On 11 August 2017, Barnes joined Championship club Barnsley on a season long loan. The following day, he made his debut for the club as an 80th-minute substitute in a 1–2 home defeat to Ipswich Town. He scored his first goal for Barnsley against Sunderland on 26 August 2017. On 1 January 2018, Barnes was recalled from his loan spell at Barnsley and returned to Leicester City. He made his Premier League debut on 19 April 2018, as a 91st minute substitute in a 0–0 draw against Southampton.
In July 2018, after originally agreeing a deal to join Leeds United on loan, Barnes changed his mind at the last moment and on 24 July 2018, Barnes signed a new four-year contract with Leicester and joined newly relegated Championship club West Bromwich Albion on a season long loan. He scored a spectacular goal on his league debut during a 2–1 home defeat against Bolton Wanderers on 4 August 2018.
Return to Leicester City
On 11 January 2019, Barnes was recalled by Leicester with immediate effect. He scored his first goal for Leicester on 20 April in a 2–2 draw with West Ham United. In June he signed a new five-year contract. On 24 August 2019, Barnes scored a half-volley against Sheffield United to gave Leicester City the victory. He scored again for Leicester's opener on 19 January 2020, but he was on the losing side as the Foxes lost 2–1 to Burnley at Turf Moor. On 9 March, Barnes notched a brace in a comprehensive 4–0 home victory over struggling Aston Villa.
International career
Barnes was called up as one of six over-age players for the England U18 squad entered into the 2017 Toulon Tournament. He made his debut on 29 May 2017, featuring as a substitute in a 1–0 win over group rivals Angola U20. On 1 June 2017, Barnes scored twice in a 7–1 win over Cuba U20. On 8 June 2017, Barnes scored another brace in the competition's semi-final, in a 3–0 win over Scotland U20, and on 10 June 2017 went on to score his penalty in a deciding shootout during the final against Ivory Coast U20, with England being victorious. Overall, Barnes finished the tournament as joint recipient of the Golden Boot award with 4 goals along with teammate George Hirst and Angola U20's Chico Banza. On 28 September 2017, Barnes was called up to the England U20 national team, and on 5 October 2017 featured as a substitute in a 1–5 away friendly win over Italy U20. On 27 May 2019, Barnes was included in England's 23-man squad for the 2019 UEFA European Under-21 Championship.
Career statistics
Honours
England U18
Toulon Tournament: 2017
Individual
Toulon Tournament Golden Boot: 2017
Leicester City Development Squad Player of the Year: 2016–17
Milton Keynes Dons Young Player of the Year: 2016–17