The best college football games of 2020 (but we mean “best” ironically).

Notre Dame students crowd the field in South Bend, Indiana after their team’s double-overtime win over Clemson on Nov. 7.
Matt Cashore/Pool/Getty Images

This Saturday marks the end of college football’s extremely irregular “regular season,” an airboat chase through a COVID-19 swamp during which the sport’s major conferences started their schedules in different months, played different numbers of games, and operated by different rules regarding virus-related cancellations. (Depending on the outcomes of this weekend’s conference championship games, one of the College Football Playoff semifinals could match 11-0 Alabama against 6-0 Ohio State.) It was weird and often obscene, and, here, we’ve identified the seven games that most exemplified its weirdness and/or obscenity.

7. Missouri 41, Vanderbilt 0, Nov. 28. With Vanderbilt’s regular kickers unavailable due to COVID contact tracing, the team suited up soccer goalkeeper Sarah Fuller for emergency duties. If she’d attempted a field goal or extra point, Fuller would have become the first woman to score in a major-conference college football game. But, like many teams playing after an offseason of canceled practices and Zoom meetings, Vanderbilt was too much of a mess on offense to get into or even within hailing distance of the end zone. The sizable audience keeping tabs on Vanderbilt-Missouri thus ended up seeing Fuller handle a single kickoff amid roughly a thousand one-yard runs and sacks. (Her kick was a squib to the sideline that she appeared to execute as drawn up. She did get another chance to play on Dec. 12 against Tennessee and made the best of it, hitting two extra points.) The day after the game, Vanderbilt fired its head coach.

6. Texas A&M 41, Florida 38, Oct. 10. After losing to A&M in front of a loud and only-sort-of-socially-distanced audience of 24,000 in College Station, Texas, Florida coach Dan Mullen opined peevishly that his school’s administrators should allow a capacity crowd of 90,000 to attend the Gators’ next home game. (There had been 15,000 fans at Florida’s game in Gainesville the previous week.) Having sowed the wind with his disdain for precautionary guidelines, Mullen began reaping almost immediately in the form of a roster-wide COVID outbreak in which more than two dozen people (including Mullen himself) tested positive and the team had to cancel two games. After another loss, this one to LSU on Dec. 12, the coach alleged that his team was being punished in national rankings for not having canceled even more contests, complaining that “you seem to get rewarded for not playing this year in college football.” Mullen was probably referring to No. 4 Ohio State, although, to be fair, the three teams ahead of the Buckeyes in rankings have all played double-digit games and, unlike Florida, not lost two of them. In any case, it will be interesting to see how Mullen manages to work another gripe about epidemiological best practices into his press conference after what is expected to be a double-digit loss to Alabama in Saturday’s SEC championship game.

5. North Dakota State 39, Central Arkansas 28, Oct. 3. The Bison, three-time defending Football Championship Subdivision champions, play in the Missouri Valley Football Conference, which plans to hold its season in the spring. North Dakota State, led by a star quarterback who is allegedly named “Trey Lance,” nonetheless scheduled and won a non-conference game against Central Arkansas this fall, then stopped playing. This wasn’t because the Bison’s other non-conference games got cancelled due to COVID—doing one game and then calling it quits was explicitly the plan all along. For the year, the team finishes a proud 1-0 and sets a standard in the field of Not Overdoing It that may never be surpassed.

4. Indiana 36, Penn State 35, Oct. 24. After years of almost but not quite pulling off upsets as a spirited but undermanned Big Ten underdog, Indiana finally got over the hump against Penn State in a thriller that concluded when star quarterback Michael Penix Jr. extended his arm juuuuuuuuuuust far enough to hit the end zone pylon and score on a daring, all-or-nothing 2-point conversion attempt in overtime.

Two weeks later, the Hoosiers beat Michigan. Then they came up a touchdown short against Ohio State, lost Penix to an ACL tear against Maryland, and were given the shaft when the Big Ten changed the games-played requirement it had put in place before the season, a shift that allowed the Buckeyes (who had played only five games at the time) to play for the conference championship. (Indiana, which had played seven games, would have qualified under the original rules while Ohio State would not have.) Also, Penn State ended up going 3-5, so the Hoosiers’ last-second win wasn’t that impressive in retrospect. The point is that in 2020 even the feel-good games ultimately felt bad.

3. Notre Dame 47, Clemson 40, Nov. 7. Over the summer, when the 2020 season was in doubt, Notre Dame announced that it would be temporarily joining the Atlantic Coast Conference, which then made the crucial, momentum-reversing choice not to join the Big Ten and Pac-12 when they postponed play in August. (ESPN would later run a segment “thanking” Notre Dame for “saving” the season.) The Irish then experienced a campus-wide COVID outbreak whose highlight was either 1) university president John Jenkins testing positive after attending an event for erstwhile law professor Amy Coney Barrett at the White House, or 2) head coach Brian Kelly noting the virus may have spread on his team when a player vomited on the sideline during a Sept. 19 game against South Florida. Star Clemson quarterback Trevor Lawrence, meanwhile, played his own role in preventing the season from being canceled by helping lead a social media campaign around the hashtag #WeWantToPlay. Lawrence eventually tested positive for COVID-19 himself and didn’t play against Notre Dame—but still traveled to South Bend and stood on the sideline while wearing a mask that, on at least one occasion, he pulled down to speak directly into a teammate’s face. (Clemson said Lawrence had completed a 10-day quarantine and was just awaiting cardiac testing.) When Notre Dame won, thousands of fans rushed the field to stand in close proximity to each other while shouting. Perfect!

2. Ohio State 0, Michigan 0, Dec. 12. Two weeks before its scheduled rivalry game with Michigan, the Buckeyes experienced a wave of COVID cases. Desperate not to fall under the games-played threshold it thought the Big Ten would be enforcing, the Ohio State squad hastily returned to the field against Michigan State on Dec. 5 with a depleted roster that, most prominently, featured a center who was frequently unable to successfully snap the ball. (They still won, though! Michigan State wasn’t very good this year.) Michigan, led by a coach who had joined a September protest against his own university president’s role in delaying the season, then experienced its own enormous outbreak, which caused it to cancel its Dec. 5 game, after which top ESPN analyst (and Ohio State alum) Kirk Herbstreit said on air that he believed Michigan would “wave the white flag” and pass on playing Ohio State. “I’ve talked to a lot of coaches around the country that have said they really feel teams are opting out to avoid playing games because they don’t want to get humiliated,” he said. Herbstreit apologized almost immediately for the remark, but it still provoked Michigan’s athletic director into releasing a selfie-style video filmed at his desk in which he referred to Herbstreit’s contention as “a statement by a fool.” Michigan ultimately did have to cancel, though, with one local media figure reporting that the Wolverines would have been missing “20-25 starters” because of positive tests and contact tracing. And in the end the Big Ten just changed the rules so the Buckeyes could play in Saturday’s championship game anyway. All in all we can probably chalk this one up as another Ohio State victory over Michigan even if it did not, technically, take place.

1. Coastal Carolina 22, BYU 17, Dec. 5. On the first Saturday in December, ESPN’s College GameDay was scheduled to travel to Conway, S.C., to showcase and celebrate undefeated Coastal Carolina. The Chanticleers were scheduled to play Liberty, the Virginia school that was led by Trump supporter and COVID skeptic Jerry Falwell Jr. until he resigned in August amid allegations that he and his wife had an interesting sexual relationship with a Miami pool attendant. But Liberty, whose coach, Hugh Freeze, is well known for a sex-related resignation of his own, canceled amid a surge in COVID cases on the team. (The program had previously made news when Freeze mentioned casually before the season that it wasn’t testing its players.) On three days’ notice, Coastal Carolina was able to save both game day and GameDay by booking BYU as a replacement; the Cougars, who are not members of a conference, were also undefeated, and were looking for a quality opponent to bolster a schedule that it had been forced to fill with low-level programs like Texas State and South Alabama. The actual game involved a bench-clearing brawl just before halftime and ended when Coastal Carolina stopped a BYU receiver at its 1-yard line.

For all their troubles, the still-undefeated Chanticleers are now ranked No. 12 by the College Football Playoff committee, one of a series of decisions so perplexing that a reporter asked the committee’s chair this week why anyone even bothers playing games. Which, really, is a question that would have been fair to ask a lot of people in college football this season.

nnx3c!-- Rubicon Project Ad Tag --x3en


nn")),c=d(m[i.size_id].split("x").map(function(e)return Number(e)),2),s.width=c[0],s.height=c[1]),s.rubiconTargeting=(Array.isArray(i.targeting)?i.targeting:[]).reduce(function(e,t)return e[t.key]=t.values[0],e,rpfl_elemid:f.adUnitCode),t.push(s)):n.logError("Rubicon: bidRequest undefined at index position:".concat(o),r,e),t,[]).sort(function(e,t)0)-(e.cpm)},getUserSyncs:function(e,t,r,n)if(!x&&e.iframeEnabled)var i="";return r&&"string"==typeof r.consentString&&("boolean"==typeof r.gdprApplies?i+="?gdpr=".concat(Number(r.gdprApplies),"&gdpr_consent=").concat(r.consentString):i+="?gdpr_consent=".concat(r.consentString)),n&&(i+="".concat(i?"&":"?","us_privacy=").concat(encodeURIComponent(n))),x=!0,"eus","")+i,transformBidParams:function(e)return n.convertTypes(accountId:"number",siteId:"number",zoneId:"number",e)};function v(e,t)function y(e,t)var r=e.params;if("video"===t)var i=[];return[,]:Array.isArray(n.deepAccess(e,""))&&[0]:Array.isArray(e.sizes)&&0=e&&t.innerWidth'+v.vast_url+"":v.vast_string&&(y=v.vast_string),g.pre_market_bids.push(id:v.deal_id,seatbid:[bid:[,dealid:v.deal_id,price:v.price,adm:y]],cur:v.currency,ext:event_log:[])}var h=n.getBidIdParameter("mimes",e.params)||["application/javascript","video/mp4","video/webm"],_=id:e.bidId,secure:l,video:w:p,h:f,ext:g,mimes:h;""!=n.getBidIdParameter("price_floor",e.params)&&(_.bidfloor=n.getBidIdParameter("price_floor",e.params)),""!=n.getBidIdParameter("start_delay",e.params)&&("start_delay",e.params))),""!=n.getBidIdParameter("min_duration",e.params)&&("min_duration",e.params)),""!=n.getBidIdParameter("max_duration",e.params)&&("max_duration",e.params)),""!=n.getBidIdParameter("placement_type",e.params)&&("placement_type",e.params)),""!=n.getBidIdParameter("position",e.params)&&("position",e.params)),e.crumbs&&e.crumbs.pubcid&&(c=e.crumbs.pubcid);var S=navigator.language?"language":"userLanguage",I=id:s,imp:_,site:id:"",page:a,content:"content",device:h:screen.height,w:screen.width,dnt:n.getDNT()?1:0,language:navigator[S].split("-")[0],make:navigator.vendor?navigator.vendor:"",ua:navigator.userAgent,ext:wrap_response:1;n.getBidIdParameter("number_of_ads",e.params)&&(I.ext.number_of_ads=n.getBidIdParameter("number_of_ads",e.params));var A=;return 1==n.getBidIdParameter("spotx_all_google_consent",e.params)&&(A.consented_providers_settings=u),t&&t.gdprConsent&&(A.consent=t.gdprConsent.consentString,void 0!==t.gdprConsent.gdprApplies&&n.deepSetValue(I,"regs.ext.gdpr",t.gdprConsent.gdprApplies?1:0)),t&&t.uspConsent&&n.deepSetValue(I,"regs.ext.us_privacy",t.uspConsent),n.deepAccess(e,"userId.id5id.uid")&&(A.eids=A.eids||[],A.eids.push()),c&&(A.fpc=c),e&&e.schain&&(I.source=ext:schain:e.schain),e&&e.userId&&e.userId.tdid&&(A.eids=A.eids||[],A.eids.push(source:"",uids:[id:e.userId.tdid,ext:rtiPartner:"TDID"])),n.isEmpty(A)||(I.user=ext:A),method:"POST",url:""+s,data:I,bidRequest:t})},interpretResponse:function(e,t){var r=[],i=e.body;return i&&n.isArray(i.seatbid)&&n._each(i.seatbid,function(e){n._each(,function(e){var a=;for(var c in t.bidRequest.bids)e.impid==t.bidRequest.bids[c].bidId&&(a=t.bidRequest.bids[c]);n._each(a.params.pre_market_bids,function(t),i.cur=t.currency));var d="",dealId:e.dealid;d.meta=d.meta||,e&&e.adomain&&0t?e:tfunction d(e,t,n)!e.preload&&e.preloadThreshhold&&function(e,t,n,i)return<=i+n&&u(e)(,t.rect,e.preloadThreshhold,n)&&(e.preload=!0,setTimeout(function()e.trigger("preload",new r("preload",t)),15))function c(n)o),l=target:n.el,rect:i,visiblePx:h,visiblePercent:s;!function(e,t)i= o.length) return done: true ; return done: false, value: o[i++] ; , e: function e(_e) throw _e; , f: F ; throw new TypeError("Invalid attempt to iterate non-iterable instance.nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return s: function s() it = o[Symbol.iterator](); , n: function n() var step =; normalCompletion = step.done; return step; , e: function e(_e2) didErr = true; err = _e2; , f: function f() try if (!normalCompletion && it.return != null) it.return(); finally if (didErr) throw err; ; }

function _unsupportedIterableToArray(o, minLen)

function _arrayLikeToArray(arr, len) if (len == null

function mountLegacyServices()
Object.keys(window.modules).filter(function (key)
return typeof key === 'string' && key.match(/.legacy$/);
).forEach(function (key)
return window.require(key);

function tryToMount(fn, el, name)
fn(el); // init the controller
catch (e)
var elementTag = el.outerHTML.slice(0, el.outerHTML.indexOf(el.innerHTML));
console.error("Error initializing controller for "".concat(name, "" on "").concat(elementTag, """), e);

* mount client.js component controllers

function mountComponentModules() {
Object.keys(window.modules).filter(function (key)
return typeof key === 'string' && key.match(/.client$/);
).forEach(function (key)
var controllerFn = window.require(key);

if (typeof controllerFn === 'function')
var name = key.replace('.client","'),
instancesSelector = "[data-uri*="_components/".concat(name, "/"]"),
defaultSelector = "[data-uri$="_components".concat(name, ""]"),
instances = document.querySelectorAll(instancesSelector),
defaults = document.querySelectorAll(defaultSelector);

var _iterator = _createForOfIteratorHelper(instances),

for (_iterator.s(); !(_step = _iterator.n()).done;)
var el = _step.value;
tryToMount(controllerFn, el, name);

catch (err)

var _iterator2 = _createForOfIteratorHelper(defaults),

for (_iterator2.s(); !(_step2 = _iterator2.n()).done;)
var _el = _step2.value;
tryToMount(controllerFn, _el, name);

catch (err)

} // Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// note: the `` value is swapped for the actual environment variable in /lib/cmd/compile/scripts.js

window.process = window.process || ;
window.process.env = window.process.env || ;

if (!window.process.env.NODE_ENV)
window.process.env.NODE_ENV = '';
// note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first

// ]]