纯css+div实现的一个四子棋格子小游戏代码

代码语言:html

所属分类:游戏

代码描述:纯css+div实现的一个四子棋格子小游戏代码,鼠标移动到不同的位置按左键放下方块,只要同一个颜色的四个方块连成一线,这个颜色的方块就赢了。

代码标签: css div 四子棋 格子 小游戏

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开


<!DOCTYPE html>
<html lang="en" >

<head>

  <meta charset="UTF-8">

  <link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/open-props.css">
  
<style>



* {
  box-sizing: border-box;
}

.land-of-three * {
  transform-style: preserve-3d;
}

[type="checkbox"] {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border-width: 0;
}

:root {
  --cell-size: 6vmin;
  --primary-hue: 280;
  --secondary-hue: 320;
  --base-drop: 0.05;
  --red: hsl(18, 100%, 50%);
  --yellow: hsl(44, 83%, 53%);
  --green: hsl(130, 52%, 46%);
  --blue: hsl(215, 100%, 53%);
  --screen-hide: 1;
  --intro-screen-hide: 0;
  --screen-delay: 0;
  --show-results: 0;
  --show-win: 0;
  --show-draw: 0;
  --show-primary-win: 0;
  --show-secondary-win: 0;
  --column-padding: 0.75;
  --gap-coefficient: 0.1;
  --primary: var(--red);
  --secondary: var(--yellow);
  --rows: 6;
  --column-buffer: calc(var(--cell-size) * 2);
  --column-padding: calc(var(--cell-size) * var(--column-padding, 0.75));
  --column-size: calc(var(--rows, 6) * var(--cell-size) + var(--column-padding, 0.75));
  /*--column-height: calc(var(--cell-size) * (-1 - var(--column-padding)));*/
  --rotation: -24deg;
  --bg: var(--surface-1);
}

body {
  display: grid;
  place-items: center;
  min-height: 100vh;
  overflow: hidden;
  background: var(--bg);
}

h1 {
  color: var(--gray-0);
}

svg {
  fill: currentColor;
}

form {
  display: grid;
  place-items: center;
  position: fixed;
}

.board {
  display: grid;
  grid-template-columns: repeat(7, var(--cell-size));
  grid-auto-flow: column;
  grid-gap: 0 0;
  position: relative;
}

.board__column {
  aspect-ratio: 1 / var(--rows);
  position: relative;
}

.board__controls {
  position: absolute;
  bottom: 0;
  left: 0;
}

form > [type="reset"] {
  height: 50px;
  aspect-ratio: 1;
  position: fixed;
  top: 1rem;
  right: 1rem;
  z-index: 6;
  transform: translateZ(300vmin);
}

.board__move:hover {
  --show-ghost: 1;
}

.board__move[for*="s"] {
  --disc-hue: var(--secondary-hue);
}
.board__move[for*="p"] {
  --disc-hue: var(--primary-hue);
}

.board__cell {
  aspect-ratio: 1;
}

.board__labels {
  --depth: var(--cell-size);
  color: transparent;
  position: absolute;
  height: calc((var(--rows, 6) * var(--cell-size)) + var(--column-buffer));
  left: 0;
  bottom: 0;
  cursor: pointer;
  z-index: 2;
  display: block;
  width: 100%;
  z-index: var(--row);
}

.move-controls {
  height: 100%;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
}

.board__labels .cuboid__side {
  overflow: hidden;
}

.board__move {
  height: 100%;
  width: var(--cell-size);
  position: absolute;
}

.board__disc--primary {
  --disc-color: var(--primary);
}

.board__disc--secondary {
  --disc-color: var(--secondary);
}

.disc {
  --depth: calc(var(--cell-size) * 0.5);
  color: var(--disc-color);
  position: absolute;
  inset: 0;
  display: none;
  -webkit-animation: drop calc((var(--base-drop) * var(--row)) * 1s);
          animation: drop calc((var(--base-drop) * var(--row)) * 1s);
}

.board__column:has([for*="s"]:hover) .disc--ghost {
  display: block;
  --show-ghost: 1;
  --disc-color: var(--secondary);
}

.board__column:has([for*="p"]:hover) .disc--ghost {
  display: block;
  --show-ghost: 1;
  --disc-color: var(--primary);
}

.disc--ghost {
  width: 100%;
  aspect-ratio: 1;
  color: var(--disc-color);
  position: absolute;
  top: calc(var(--column-buffer) * -1);
  left: 0;
  opacity: var(--show-ghost, 1);
}

.win-disc {
  height: var(--cell-size);
  aspect-ratio: 1;
  background: var(--winner);
}

.disc__piece {
  height: 80%;
  aspect-ratio: 1;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

@-webkit-keyframes drop {
  from {
    transform: translateY(calc(
      (var(--row) * (var(--cell-size) * -1)) - (var(--column-buffer) - var(--cell-size))
    ));
  }
}

@keyframes drop {
  from {
    transform: translateY(calc(
      (var(--row) * (var(--cell-size) * -1)) - (var(--column-buffer) - var(--cell-size))
    ));
  }
}

/* Aesthetic stuff */
.board__aesthetics {
  position: absolute;
  inset: calc(var(--cell-size) * -0.5);
}

.board__cage .cuboid__side:nth-of-type(1),
.board__cage .cuboid__side:nth-of-type(3),
.board__cage .cuboid__side:nth-of-type(5),
.board__cage .cuboid__side:nth-of-type(6) {
  border: calc(var(--cell-size) * 0.5) solid var(--blue);
  background: repeating-linear-gradient(90deg, var(--blue) 0 calc(var(--cell-size) * 0.1), transparent calc(var(--cell-size) * 0.1) calc(var(--cell-size) * 0.9), var(--blue) calc(var(--cell-size) * 0.9) calc(var(--cell-size) * 1));
}
.board__cage .cuboid__side:nth-of-type(1),
.board__cage .cuboid__side:nth-of-type(3) {
  border-top: 0;
  border-bottom: 0;
}
.board__cage .cuboid__side:nth-of-type(5),
.board__cage .cuboid__side:nth-of-type(6) {
  background: repeating-linear-gradient(90deg, var(--blue) 0 calc(var(--cell-size) * 0.1), transparent calc(var(--cell-size) * 0.1) calc(var(--cell-size) * 0.9), var(--blue) calc(var(--cell-size) * 0.9) calc(var(--cell-size) * 1)),
    repeating-linear-gradient(0deg, var(--blue) 0 calc(var(--cell-size) * 0.1), transparent calc(var(--cell-size) * 0.1) calc(var(--cell-size) * 0.9), var(--blue) calc(var(--cell-size) * 0.9) calc(var(--cell-size) * 1));
}

.board-container {
  transform: translate3d(0, 0, 100vmin) rotateX(var(--rotation, -24deg)) rotateY(var(--rotation, -24deg));
}

.board__cage {
  --depth: calc(var(--cell-size) * 0.55);
  color: var(--blue);
  width: 100%;
  height: 100%;
}

.board__leg {
  position: absolute;
  bottom: -20%;
  width: calc(var(--cell-size) * 0.75);
  height: 50%;
}

.leg__upright {
  --depth: var(--cell-size);
  height: 100%;
  width: 100%;
  color: var(--blue);
}

.leg__foot {
  --depth: calc(var(--cell-size) * 4);
  color: var(--blue);
}

.board__leg--left {
  right: 95%;
}

.board__leg--right {
  left: 95%;
}

.leg {
  height: 100%;
  width: 100%;
}

.leg__foot {
  width: 100%;
  aspect-ratio: 1;
  position: absolute;
  bottom: 0;
  background: hsl(280 80% 50% / 0.5);
}

/* Generic reusable game UI stuff */

/* Cuboidy stuff */

.cuboid {
  height: 100%;
  width: 100%;
  position: relative;
}
.cuboid__side {
  background: currentColor;
  position: absolute;
  height: 100%;
  width: 100%;
  filter: brightness(var(--brightness, 1));
}
/* T, R, B, L, F, B */
.cuboid__side:nth-of-type(1) {
  --brightness: 0.8;
  top: 0;
  height: var(--depth, 50vmin);
  transform: translateY(-50%) rotateX(-90deg);
}
.cuboid__side:nth-of-type(2) {
  --brightness: 0.6;
  top: 50%;
  right: 0;
  width: var(--depth, 50vmin);
  transform: translate(50%, -50%) rotateY(-90deg);
}

.cuboid__side:nth-of-type(3) {
  --brightness: 1;
  transform: translateZ(calc(var(--depth, 50vmin) / 2)) rotateY(0deg);
}

.board__cage .cuboid__side:nth-of-type(3) {
  --brightness: 1.3;
  bottom: 0;
  height: var(--depth, 50vmin);
  transform: translateY(50%) rotateX(90deg);
}
.board__cage .cuboid__side:nth-of-type(4) {
  --brightness: 0.6;
  top: 50%;
  width: var(--depth, 50vmin);
  transform: translate(-50%, -50%) rotateY(90deg);
}
.board__cage .cuboid__side:nth-of-type(5) {
  --brightness: 0.75;
  transform: translateZ(calc(var(--depth, 50vmin) / -2)) rotateY(180deg);
}
.board__cage .cuboid__side:nth-of-type(6) {
  --brightness: 1;
  transform: translateZ(calc(var(--depth, 50vmin) / 2)) rotateY(0deg);
}

/* Override for  */
.disc__piece .cuboid__side:nth-of-type(3) {
  --brightness: 1;
  height: 100%;
  width: 100%;
  transform: translateZ(calc(var(--depth, 50vmin) / 2)) rotateY(0deg);
}

/* Dialog and screen */

:root:has(#dismiss:checked) .screen--intro {
  transform: translate3d(-50%, -50%, 200vmin) translateY(100vh) scale(0);
  z-index: -1;
}

.screen {
  height: 100vh;
  width: 100vw;
  position: fixed;
  top: 50%;
  left: 50%;
  z-index: 5;
  display: grid;
  place-items: center;
  transform: translate3d(-50%, -50%, 200vmin);
  transition: transform 0.2s;
}

.dialog {
  min-width: calc(var(--columns) * var(--cell-size));
  font-family: 'Google Sans', sans-serif;
  font-size: clamp(1rem, 2vmin, 2rem);
  -webkit-backdrop-filter: blur(10px) saturate(0.75);
          backdrop-filter: blur(10px) saturate(0.75);
  color: var(--gray-0);
  background: hsl(210 29% 20% / 0.8);
  position: absolute;
  box-shadow: var(--shadow-6);
  text-align: center;
  border-style: solid;
  border-top-color: var(--red);
  border-right-color: var(--green);
  border-bottom-color: var(--yellow);
  border-left-color: var(--blue);
  border-width: var(--size-2);
  display: grid;
}

.dialog * + * {
  margin-top: 2rem;
}

.dialog__content {
  padding: var(--size-4);
  display: grid;
  place-items: center;
  grid-column: 1 / -1;
  grid-row: 1 / -1;
}

.dialog__content {
  opacity: var(--opacity, 1);
  z-index: var(--z, 2);
}

.dialog__content--intro {
  --opacity: calc(1 - var(--show-win, 0));
  --z: calc(1 - (2 * var(--show-win, 0)));
}

.dialog__content--win {
  --z: calc(-1 + (var(--show-win) * 2));
  --opacity: var(--show-win);
}

.dialog__content--draw {
  --z: calc(-1 + (var(--show-draw) * 2));
  --opacity: var(--show-draw);
}

/* Transition buttons */
.faux-button {
  --bg: var(--gray-9);
  box-sizing: border-box;
  font-size: var(--font-size-fluid-1);
  padding: var(--size-4) var(--size-6);
  background: var(--bg);
  color: var(--gray-0);
  font-weight: bold;
  font-family: 'Google Sans', sans-serif;
  border: var(--size-2) solid var(--gray-0);
  display: inline-block;
  transform: translateY(calc(var(--y, 0) * 1%)) scale(var(--s));
  transition: transform 0.1s, background 0.1s, opacity 0.1s;
}

.faux-button:hover {
  --bg: black;
  --y: -5;
  --s: 1.1;
}

.faux-button:active {
  --bg: black;
  --y: 5;
  --s: 0.9;
}

/* Reset button */
.game-reset {
  background: var(--bg);
  color: var(--gray-0);
  height: 48px;
  aspect-ratio: 1;
  padding: 0;
  border: none;
  position: fixed;
  top: 1rem;
  right: 1rem;
  border-radius: 50%;
  display: grid;
  place-items: center;
  opacity: 0.25;
}

.game-reset:hover {
  opacity: 1;
}

.game-reset svg {
  width: 65%;
}



/* Logic Demons live down here.... */

/* The "Magic" bullet for turn switching */
/* Creates a width to reveal the other label */
.board__labels .move-controls:after {
  content: counter(turn, lower-roman);
  font-size: 1px;
  letter-spacing: var(--cell-size);
  color: transparent;
}

.board__move[for*="s"] {
  left: 0;
}

.board__move[for*="p"] {
  right: 0;
}

body {
  counter-reset: turn 1;
}

[id*="p"]:checked {
  counter-increment: turn 2;
}

[id*="s"]:checked {
  counter-increment: turn -2;
}

.board:has(:is([id=s-1], [id=p-1]):checked) .board__labels[data-for=move-1],
.board:has([id=s-2]:checked, [id=p-2]:checked) .board__labels[data-for=move-2],
.board:has([id=s-3]:checked, [id=p-3]:checked) .board__labels[data-for=move-3],
.board:has([id=s-4]:checked, [id=p-4]:checked) .board__labels[data-for=move-4],
.board:has([id=s-5]:checked, [id=p-5]:checked) .board__labels[data-for=move-5],
.board:has([id=s-6]:checked, [id=p-6]:checked) .board__labels[data-for=move-6],
.board:has([id=s-7]:checked, [id=p-7]:checked) .board__labels[data-for=move-7],
.board:has([id=s-8]:checked, [id=p-8]:checked) .board__labels[data-for=move-8],
.board:has([id=s-9]:checked, [id=p-9]:checked) .board__labels[data-for=move-9],
.board:has([id=s-10]:checked, [id=p-10]:checked) .board__labels[data-for=move-10],
.board:has([id=s-11]:checked, [id=p-11]:checked) .board__labels[data-for=move-11],
.board:has([id=s-12]:checked, [id=p-12]:checked) .board__labels[data-for=move-12],
.board:has([id=s-13]:checked, [id=p-13]:checked) .board__labels[data-for=move-13],
.board:has([id=s-14]:checked, [id=p-14]:checked) .board__labels[data-for=move-14],
.board:has([id=s-15]:checked, [id=p-15]:checked) .board__labels[data-for=move-15],
.board:has([id=s-16]:checked, [id=p-16]:checked) .board__labels[data-for=move-16],
.board:has([id=s-17]:checked, [id=p-17]:checked) .board__labels[data-for=move-17],
.board:has([id=s-18]:checked, [id=p-18]:checked) .board__labels[data-for=move-18],
.board:has([id=s-19]:checked, [id=p-19]:checked) .board__labels[data-for=move-19],
.board:has([id=s-20]:checked, [id=p-20]:checked) .board__labels[data-for=move-20],
.board:has([id=s-21]:checked, [id=p-21]:checked) .board__labels[data-for=move-21],
.board:has([id=s-22]:checked, [id=p-22]:checked) .board__labels[data-for=move-22],
.board:has([id=s-23]:checked, [id=p-23]:checked) .board__labels[data-for=move-23],
.board:has([id=s-24]:checked, [id=p-24]:checked) .board__labels[data-for=move-24],
.board:has([id=s-25]:checked, [id=p-25]:checked) .board__labels[data-for=move-25],
.board:has([id=s-26]:checked, [id=p-26]:checked) .board__labels[data-for=move-26],
.board:has([id=s-27]:checked, [id=p-27]:checked) .board__labels[data-for=move-27],
.board:has([id=s-28]:checked, [id=p-28]:checked) .board__labels[data-for=move-28],
.board:has([id=s-29]:checked, [id=p-29]:checked) .board__labels[data-for=move-29],
.board:has([id=s-30]:checked, [id=p-30]:checked) .board__labels[data-for=move-30],
.board:has([id=s-31]:checked, [id=p-31]:checked) .board__labels[data-for=move-31],
.board:has([id=s-32]:checked, [id=p-32]:checked) .board__labels[data-for=move-32],
.board:has([id=s-33]:checked, [id=p-33]:checked) .board__labels[data-for=move-33],
.board:has([id=s-34]:checked, [id=p-34]:checked) .board__labels[data-for=move-34],
.board:has([id=s-35]:checked, [id=p-35]:checked) .board__labels[data-for=move-35],
.board:has([id=s-36]:checked, [id=p-36]:checked) .board__labels[data-for=move-36],
.board:has([id=s-37]:checked, [id=p-37]:checked) .board__labels[data-for=move-37],
.board:has([id=s-38]:checked, [id=p-38]:checked) .board__labels[data-for=move-38],
.board:has([id=s-39]:checked, [id=p-39]:checked) .board__labels[data-for=move-39],
.board:has([id=s-40]:checked, [id=p-40]:checked) .board__labels[data-for=move-40],
.board:has([id=s-41]:checked, [id=p-41]:checked) .board__labels[data-for=move-41],
.board:has([id=s-42]:checked, [id=p-42]:checked) .board__labels[data-for=move-42] {
  display: none;
}

/* How to work out the winning combinations. You can't nest :has() */
/* But you could use data-attributes or checks for it */

/* If a column has 4 cells in a row somehow it's a vertical win */
.board__column:has([data-row=p-1]:checked):has([data-row=p-2]:checked):has([data-row=p-3]:checked):has([data-row=p-4]:checked) ~ .win,
.board__column:has([data-row=p-2]:checked):has([data-row=p-3]:checked):has([data-row=p-4]:checked):has([data-row=p-5]:checked) ~ .win,
.board__column:has([data-row=p-3]:checked):has([data-row=p-4]:checked):has([data-row=p-5]:checked):has([data-row=p-6]:checked) ~ .win {
  display: block;
  --winner: var(--primary);
  --show-win: 1;
}
.board__column:has([data-row=s-1]:checked):has([data-row=s-2]:checked):has([data-row=s-3]:checked):has([data-row=s-4]:checked) ~ .win,
.board__column:has([data-row=s-2]:checked):has([data-row=s-3]:checked):has([data-row=s-4]:checked):has([data-row=s-5]:checked) ~ .win,
.board__column:has([data-row=s-3]:checked):has([data-row=s-4]:checked):has([data-row=s-5]:checked):has([data-row=s-6]:checked) ~ .win {
  display: block;
  --winner: var(--secondary);
  --show-win: 1;
}

/* If you have 4 columns each with the same row checked, you have a match */
.board__column:has([data-row=s-1]:checked) +
.board__column:has([data-row=s-1]:checked) +
.board__column:has([data-row=s-1]:checked) +
.board__column:has([data-row=s-1]:checked) ~ .win,
.board__column:has([data-row=s-2]:checked) +
.board__column:has([data-row=s-2]:checked) +
.board__column:has([data-row=s-2]:checked) +
.board__column:has([data-row=s-2]:checked) ~ .win,
.board__column:has([data-row=s-3]:checked) +
.board__column:has([data-row=s-3]:checked) +
.board__column:has([data-row=s-3]:checked) +
.board__column:has([data-row=s-3]:checked) ~ .win,
.board__column:has([data-row=s-4]:checked) +
.board__column:has([data-row=s-4]:checked) +
.board__column:has([data-row=s-4]:checked) +
.board__column:has([data-row=s-4]:checked) ~ .win,
.board__column:has([data-row=s-5]:checked) +
.board__column:has([data-row=s-5]:checked) +
.board__column:has([data-row=s-5]:checked) +
.board__column:has([data-row=s-5]:checked) ~ .win,
.board__column:has([data-row=s-6]:checked) +
.board__column:has([data-row=s-6]:checked) +
.board__column:has([data-row=s-6]:checked) +
.board__column:has([data-row=s-6]:checked) ~ .win {
  display: block;
  --winner: var(--secondary);
  --show-win: 1;
}

.board__column:has([data-row=p-1]:checked) +
.board__column:has([data-row=p-1]:checked) +
.board__column:has([data-row=p-1]:checked) +
.board__column:has([data-row=p-1]:checked) ~ .win,
.board__column:has([data-row=p-2]:checked) +
.board__column:has([data-row=p-2]:checked) +
.board__column:has([data-row=p-2]:checked) +
.board__column:has([data-row=p-2]:checked) ~ .win,
.board__column:has([data-row=p-3]:checked) +
.board__column:has([data-row=p-3]:checked) +
.board__column:has([data-row=p-3]:checked) +
.board__column:has([data-row=p-3]:checked) ~ .win,
.board__column:has([data-row=p-4]:checked) +
.board__column:has([data-row=p-4]:checked) +
.board__column:has([data-row=p-4]:checked) +
.board__column:has([data-row=p-4]:checked) ~ .win,
.board__column:has([data-row=p-5]:checked) +
.board__column:has([data-row=p-5]:checked) +
.board__column:has([data-row=p-5]:checked) +
.board__column:has([data-row=p-5]:checked) ~ .win,
.board__column:has([data-row=p-6]:checked) +
.board__column:has([data-row=p-6]:checked) +
.board__column:has([data-row=p-6]:checked) +
.board__column:has([data-row=p-6]:checked) ~ .win {
  display: block;
  --winner: var(--primary);
  --show-win: 1;
}

/* If you have these diagonal combinations, you also have a win */
.board__column:has([data-row=p-6]:checked) +
.board__column:has([data-row=p-5]:checked) +
.board__column:has([data-row=p-4]:checked) +
.board__column:has([data-row=p-3]:checked) ~ .win,
.board__column:has([data-row=p-5]:checked) +
.board__column:has([data-row=p-4]:checked) +
.board__column:has([data-row=p-3]:checked) +
.board__column:has([data-row=p-2]:checked) ~ .win,
.board__column:has([data-row=p-4]:checked) +
.board__column:has([data-row=p-3]:checked) +
.board__column:has([data-row=p-2]:checked) +
.board__column:has([data-row=p-1]:checked) ~ .win,
.board__column:has([data-row=p-1]:checked) +
.board__column:has([data-row=p-2]:checked) +
.board__column:has([data-row=p-3]:checked) +
.board__column:has([data-row=p-4]:checked) ~ .win,
.board__column:has([data-row=p-2]:checked) +
.board__column:has([data-row=p-3]:checked) +
.board__column:has([data-row=p-4]:checked) +
.board__column:has([data-row=p-5]:checked) ~ .win,
.board__column:has([data-row=p-3]:checked) +
.board__column:has([data-row=p-4]:checked) +
.board__column:has([data-row=p-5]:checked) +
.board__column:has([data-row=p-6]:checked) ~ .win {
  display: block;
  --winner: var(--primary);
  --show-win: 1;
}
.board__column:has([data-row=s-6]:checked) +
.board__column:has([data-row=s-5]:checked) +
.board__column:has([data-row=s-4]:checked) +
.board__column:has([data-row=s-3]:checked) ~ .win,
.board__column:has([data-row=s-5]:checked) +
.board__column:has([data-row=s-4]:checked) +
.board__column:has([data-row=s-3]:checked) +
.board__column:has([data-row=s-2]:checked) ~ .win,
.board__column:has([data-row=s-4]:checked) +
.board__column:has([data-row=s-3]:checked) +
.board__column:has([data-row=s-2]:checked) +
.board__column:has([data-row=s-1]:checked) ~ .win,
.board__column:has([data-row=s-1]:checked) +
.board__column:has([data-row=s-2]:checked) +
.board__column:has([data-row=s-3]:checked) +
.board__column:has([data-row=s-4]:checked) ~ .win,
.board__column:has([data-row=s-2]:checked) +
.board__column:has([data-row=s-3]:checked) +
.board__column:has([data-row=s-4]:checked) +
.board__column:has([data-row=s-5]:checked) ~ .win,
.board__column:has([data-row=s-3]:checked) +
.board__column:has([data-row=s-4]:checked) +
.board__column:has([data-row=s-5]:checked) +
.board__column:has([data-row=s-6]:checked) ~ .win {
  display: block;
  --winner: var(--secondary);
  --show-win: 1;
}

.board__column:has([data-row*="-1"]:checked):has([data-row*="-2"]:checked):has([data-row*="-3"]:checked):has([data-row*="-4"]:checked):has([data-row*="-5"]:checked):has([data-row*="-6"]:checked) +
.board__column:has([data-row*="-1"]:checked):has([data-row*="-2"]:checked):has([data-row*="-3"]:checked):has([data-row*="-4"]:checked):has([data-row*="-5"]:checked):has([data-row*="-6"]:checked) +
.board__column:has([data-row*="-1"]:checked):has([data-row*="-2"]:checked):has([data-row*="-3"]:checked):has([data-row*="-4"]:checked):has([data-row*="-5"]:checked):has([data-row*="-6"]:checked) +
.board__column:has([data-row*="-1"]:checked):has([data-row*="-2"]:checked):has([data-row*="-3"]:checked):has([data-row*="-4"]:checked):has([data-row*="-5"]:checked):has([data-row*="-6"]:checked) +
.board__column:has([data-row*="-1"]:checked):has([data-row*="-2"]:checked):has([data-row*="-3"]:checked):has([data-row*="-4"]:checked):has([data-row*="-5"]:checked):has([data-row*="-6"]:checked) +
.board__column:has([data-row*="-1"]:checked):has([data-row*="-2"]:checked):has([data-row*="-3"]:checked):has([data-row*="-4"]:checked):has([data-row*="-5"]:checked):has([data-row*="-6"]:checked) +
.board__column:has([data-row*="-1"]:checked):has([data-row*="-2"]:checked):has([data-row*="-3"]:checked):has([data-row*="-4"]:checked):has([data-row*="-5"]:checked):has([data-row*="-6"]:checked) + .win {
  display: block;
  --show-draw: 1;
}

/* End logic. Soooo much better than SF */
.win {
  display: none;
  width: 300%;
  height: 300%;
  position: fixed;
  top: 50%;
  left: 50%;
  -webkit-animation: result 0.2s 0.5s both;
          animation: result 0.2s 0.5s both;
  transform: translate3d(-50%, -50%, 0)
    rotateY(calc(var(--rotation) * -1))
    rotateX(calc(var(--rotation) * -1))
    translateZ(100vmin)
    translateY(0);
}

@-webkit-keyframes result {
  0% {
    transform: translate3d(-50%, -50%, 0)
    rotateY(calc(var(--rotation) * -1))
    rotateX(calc(var(--rotation) * -1))
    translateZ(100vmin)
    translateY(100vh);
  }
}

@keyframes result {
  0% {
    transform: translate3d(-50%, -50%, 0)
    rotateY(calc(var(--rotation) * -1))
    rotateX(calc(var(--rotation) * -1))
    translateZ(100vmin)
    translateY(100vh);
  }
}


/* Let's try something new */

[id*=p]:checked ~ .board__disc {
  display: block;
  --disc-color: var(--primary);
}
[id*=s]:checked ~ .board__disc {
  display: block;
  --disc-color: var(--secondary);
}

.controls {
  display: grid;
  grid-template-columns: repeat(7, var(--cell-size));
  grid-auto-flow: column;
  grid-gap: 0 0;
  position: relative;
}
</style>



</head>

<bod>
  <form>
      <div class="land-of-three">
        <button class="game-reset faux-button" type="reset" title="Reset">
          <svg class="reset" viewBox="0 0 24 24">
            <path d="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z"></path>
          </svg>
        </button>
        <div class="screen screen--intro">
          <div class="dialog">
            <div class="dialog__content dialog__content--intro">
              <h1>:has Connect 4?</h1>
              <p>You know the drill!</p>
              <label class="faux-button" for="dismiss">Start Game</label>
            </div>
          </div>
        </div>
        <div class="board-container">
          <div class="board" style="--rows: 6; --columns: 7; --disc-count: 42;">
            <div class="board__aesthetics">
              <div class="board__cage">
                <div class="cuboid">
                  <div class="cuboid__side"></div>
                  <div class="cuboid__side"></div>
                  <div class="cuboid__side"></div>
                  <div class="cuboid__side"></div>
                  <div class="cuboid__side"></div>
                  <div class="cuboid__side"></div>
                </div>
              </div>
              <div class="board__leg board__leg--left">
                <div class="leg">
                  <div class="leg__upright">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                  <div class="leg__foot">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__leg board__leg--right">
                <div class="leg">
                  <div class="leg__upright">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                  <div class="leg__foot">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div class="board__column"><!-- I tells you the row or the distance being travelled -->
              <div class="board__cell move-6" style="--row: 1;">
                <input type="checkbox" id="s-6" data-row="s-1" data-column="s-1"/>
                <input type="checkbox" id="p-6" data-row="p-1" data-column="p-1"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-5" style="--row: 2;">
                <input type="checkbox" id="s-5" data-row="s-2" data-column="s-1"/>
                <input type="checkbox" id="p-5" data-row="p-2" data-column="p-1"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-4" style="--row: 3;">
                <input type="checkbox" id="s-4" data-row="s-3" data-column="s-1"/>
                <input type="checkbox" id="p-4" data-row="p-3" data-column="p-1"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-3" style="--row: 4;">
                <input type="checkbox" id="s-3" data-row="s-4" data-column="s-1"/>
                <input type="checkbox" id="p-3" data-row="p-4" data-column="p-1"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-2" style="--row: 5;">
                <input type="checkbox" id="s-2" data-row="s-5" data-column="s-1"/>
                <input type="checkbox" id="p-2" data-row="p-5" data-column="p-1"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-1" style="--row: 6;">
                <input type="checkbox" id="s-1" data-row="s-6" data-column="s-1"/>
                <input type="checkbox" id="p-1" data-row="p-6" data-column="p-1"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div class="board__column"><!-- I tells you the row or the distance being travelled -->
              <div class="board__cell move-12" style="--row: 1;">
                <input type="checkbox" id="s-12" data-row="s-1" data-column="s-2"/>
                <input type="checkbox" id="p-12" data-row="p-1" data-column="p-2"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-11" style="--row: 2;">
                <input type="checkbox" id="s-11" data-row="s-2" data-column="s-2"/>
                <input type="checkbox" id="p-11" data-row="p-2" data-column="p-2"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-10" style="--row: 3;">
                <input type="checkbox" id="s-10" data-row="s-3" data-column="s-2"/>
                <input type="checkbox" id="p-10" data-row="p-3" data-column="p-2"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-9" style="--row: 4;">
                <input type="checkbox" id="s-9" data-row="s-4" data-column="s-2"/>
                <input type="checkbox" id="p-9" data-row="p-4" data-column="p-2"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-8" style="--row: 5;">
                <input type="checkbox" id="s-8" data-row="s-5" data-column="s-2"/>
                <input type="checkbox" id="p-8" data-row="p-5" data-column="p-2"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-7" style="--row: 6;">
                <input type="checkbox" id="s-7" data-row="s-6" data-column="s-2"/>
                <input type="checkbox" id="p-7" data-row="p-6" data-column="p-2"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div class="board__column"><!-- I tells you the row or the distance being travelled -->
              <div class="board__cell move-18" style="--row: 1;">
                <input type="checkbox" id="s-18" data-row="s-1" data-column="s-3"/>
                <input type="checkbox" id="p-18" data-row="p-1" data-column="p-3"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-17" style="--row: 2;">
                <input type="checkbox" id="s-17" data-row="s-2" data-column="s-3"/>
                <input type="checkbox" id="p-17" data-row="p-2" data-column="p-3"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-16" style="--row: 3;">
                <input type="checkbox" id="s-16" data-row="s-3" data-column="s-3"/>
                <input type="checkbox" id="p-16" data-row="p-3" data-column="p-3"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-15" style="--row: 4;">
                <input type="checkbox" id="s-15" data-row="s-4" data-column="s-3"/>
                <input type="checkbox" id="p-15" data-row="p-4" data-column="p-3"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-14" style="--row: 5;">
                <input type="checkbox" id="s-14" data-row="s-5" data-column="s-3"/>
                <input type="checkbox" id="p-14" data-row="p-5" data-column="p-3"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-13" style="--row: 6;">
                <input type="checkbox" id="s-13" data-row="s-6" data-column="s-3"/>
                <input type="checkbox" id="p-13" data-row="p-6" data-column="p-3"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div class="board__column"><!-- I tells you the row or the distance being travelled -->
              <div class="board__cell move-24" style="--row: 1;">
                <input type="checkbox" id="s-24" data-row="s-1" data-column="s-4"/>
                <input type="checkbox" id="p-24" data-row="p-1" data-column="p-4"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-23" style="--row: 2;">
                <input type="checkbox" id="s-23" data-row="s-2" data-column="s-4"/>
                <input type="checkbox" id="p-23" data-row="p-2" data-column="p-4"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-22" style="--row: 3;">
                <input type="checkbox" id="s-22" data-row="s-3" data-column="s-4"/>
                <input type="checkbox" id="p-22" data-row="p-3" data-column="p-4"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-21" style="--row: 4;">
                <input type="checkbox" id="s-21" data-row="s-4" data-column="s-4"/>
                <input type="checkbox" id="p-21" data-row="p-4" data-column="p-4"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-20" style="--row: 5;">
                <input type="checkbox" id="s-20" data-row="s-5" data-column="s-4"/>
                <input type="checkbox" id="p-20" data-row="p-5" data-column="p-4"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-19" style="--row: 6;">
                <input type="checkbox" id="s-19" data-row="s-6" data-column="s-4"/>
                <input type="checkbox" id="p-19" data-row="p-6" data-column="p-4"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div class="board__column"><!-- I tells you the row or the distance being travelled -->
              <div class="board__cell move-30" style="--row: 1;">
                <input type="checkbox" id="s-30" data-row="s-1" data-column="s-5"/>
                <input type="checkbox" id="p-30" data-row="p-1" data-column="p-5"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-29" style="--row: 2;">
                <input type="checkbox" id="s-29" data-row="s-2" data-column="s-5"/>
                <input type="checkbox" id="p-29" data-row="p-2" data-column="p-5"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-28" style="--row: 3;">
                <input type="checkbox" id="s-28" data-row="s-3" data-column="s-5"/>
                <input type="checkbox" id="p-28" data-row="p-3" data-column="p-5"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-27" style="--row: 4;">
                <input type="checkbox" id="s-27" data-row="s-4" data-column="s-5"/>
                <input type="checkbox" id="p-27" data-row="p-4" data-column="p-5"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-26" style="--row: 5;">
                <input type="checkbox" id="s-26" data-row="s-5" data-column="s-5"/>
                <input type="checkbox" id="p-26" data-row="p-5" data-column="p-5"/>
                <div class="board__disc disc">
                  <div class="disc__piece">
                    <div class="cuboid">
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                      <div class="cuboid__side"></div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="board__cell move-25" style="--row: 6;">
                <inp.........完整代码请登录后点击上方下载按钮下载查看

网友评论0