svg+js实现与AI下国际象棋游戏代码
代码语言:html
所属分类:游戏
代码描述:svg+js实现与AI下国际象棋游戏代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> :root { --border-width: calc(var(--diameter-tile) / 60); --diameter-board: min(85vw, 85vh); --diameter-tile: calc(1 / 8 * var(--diameter-board)); --edge-width: calc((min(100vw, 100vh) - var(--diameter-board)) * 0.3); --color-danger: tomato; --color-success: #1d83e0; --color-white: #f0f0f0; --color-black: #222; --color-board-hue: 30; --color-board-sat: 40%; --color-shadow: hsl(var(--color-board-hue), var(--color-board-sat), 50%); --color-shadow-lighter: hsl(var(--color-board-hue), var(--color-board-sat), 55%); --transition-ease: cubic-bezier(0.25, 1, 0.5, 1); --color-background: var(--color-black); } aside { display: flex; justify-content: space-between; left: 0; position: absolute; top: calc(var(--edge-width) * -0.55); transform: translateY(-50%); width: 100%; z-index: 999; } aside div { align-items: center; color: white; display: flex; } aside div > * { align-items: center; display: flex; } aside div > * + * { margin-left: calc(var(--border-width) * 2); } aside div h3, aside div label { font-size: calc(var(--edge-width) * 0.3); height: calc(var(--edge-width) * 0.3); line-height: 1; margin-bottom: 0; margin-top: 0; text-transform: uppercase; } aside div label { cursor: pointer; } aside div input { left: -99999px; position: absolute; } aside div input + * { opacity: 0.5; } aside div input:checked + * { font-weight: bold; opacity: 1; } aside div svg { height: calc(var(--edge-width) * 0.5); width: auto; } html, body { height: 100%; } body { background: var(--color-background); overflow: hidden; transition: background-color 250ms ease-in-out; } #view { background: var(--color-shadow-lighter); box-shadow: 0 0 0 calc(var(--border-width) * 3) var(--color-shadow-lighter), 0 0 0 var(--edge-width) var(--color-shadow); height: var(--diameter-board); margin: calc((100vh - var(--diameter-board)) * 0.5) calc((100vw - var(--diameter-board)) * 0.5); position: relative; width: var(--diameter-board); } .board { display: flex; flex-direction: column-reverse; height: 100%; width: 100%; } .board .row { display: flex; height: var(--diameter-tile); width: 100%; } .perspective-black .board .row { flex-direction: row-reverse; } .perspective-black .board { flex-direction: column; } .board .row .tile { background-color: currentcolor; border: none; box-shadow: inset 0 0 0 var(--border-width) var(--color-shadow-lighter); display: flex; flex-direction: column; height: var(--diameter-tile); justify-content: space-between; padding: 0; position: relative; transition: background-color 350ms var(--transition-ease); width: var(--diameter-tile); } .perspective-black .board .row:nth-child(even) .tile:nth-child(odd), .perspective-black .board .row:nth-child(odd) .tile:nth-child(even), .perspective-white .board .row:nth-child(even) .tile:nth-child(even), .perspective-white .board .row:nth-child(odd) .tile:nth-child(odd) { color: hsl(var(--color-board-hue), var(--color-board-sat), 62%); } .perspective-black .board .row:nth-child(even) .tile:nth-child(even), .perspective-black .board .row:nth-child(odd) .tile:nth-child(odd), .perspective-white .board .row:nth-child(even) .tile:nth-child(odd), .perspective-white .board .row:nth-child(odd) .tile:nth-child(even) { color: hsl(var(--color-board-hue), var(--color-board-sat), 70%); } .board .row .tile.highlight-active {} .board .row .tile.highlight-capture {} .board .row .tile.highlight-move {} .board .row .tile .move, .board .row .tile .moves, .board .row .tile .captures { box-sizing: border-box; display: flex; flex-wrap: wrap; height: var(--diameter-tile); justify-content: center; left: 0; padding: calc(var(--diameter-tile) * 0.025); position: absolute; top: 0; width: var(--diameter-tile); z-index: 9; } .board .row .tile .move, .board .row .tile .moves { align-content: center; align-items: center; } .board .row .tile .captures { align-items: flex-start; justify-content: space-between; } .board .row .tile:not(.occupied) .captures { align-items: center; justify-content: center; } .board .row .tile > div > svg { --stroke: transparent; box-sizing: border-box; height: var(--di); line-height: var(--di); width: var(--di); } .board .row .tile .move svg { --di: calc(var(--diameter-tile) / 4); --fill: var(--color-shadow); } .board .row .tile .moves svg, .board .row .tile .captures svg { --di: calc(var(--diameter-tile) / 4); --fill: var(--color-shadow); opacity: 0.4; } .board .row .tile.occupied .captures svg { position: absolute; } .board .row .tile.occupied .captures svg:nth-child(1) { top: 0; left: 0; } .board .row .tile.occupied .captures svg:nth-child(2) { top: 0; right: 0; } .board .row .tile.occupied .captures svg:nth-child(3) { bottom: calc(var(--di) * 0.1); left: 0; } .board .row .tile.occupied .captures svg:nth-child(4) { bottom: calc(var(--di) * 0.1); right: 0; } .board .row .tile.occupied .captures svg:nth-child(5) { top: calc(50% - var(--di) * 0.55); left: 0; } .board .row .tile.occupied .captures svg:nth-child(6) { top: calc(50% - var(--di) * 0.55); right: 0; } .board .row .tile.occupied .captures svg:nth-child(7) { top: 0; left: calc(50% - var(--di) * 0.5); } .board .row .tile.occupied .captures svg:nth-child(8) { bottom: calc(var(--di) * 0.1); left: calc(50% - var(--di) * 0.5); } .touching .board .row .tile .moves, .touching .board .row .tile .captures, .turn-black .board .row .tile .moves .white, .turn-black .board .row .tile .captures .white, .turn-white .board .row .tile .moves .black, .turn-white .board .row .tile .captures .black { display: none; } .board .row .tile[class*="highlight-"] .moves, .board .row .tile[class*="highlight-"] .captures { display: none; } button:focus { outline: none; position: relative; z-index: 9; } svg { --fill: var(--color-black); --stroke: var(--color-shadow); fill: var(--fill); } svg.white { --fill: var(--color-white); } svg.black { --fill: var(--color-black); } .pieces { display: block; height: var(--diameter-board); left: 0; pointer-events: none; position: absolute; top: 0; width: var(--diameter-board); z-index: 99; } .pieces .piece.white { --pos-row: -1; } .pieces .piece.black { --pos-row: 8; } .pieces .piece { --pos-col: 3.5; --scale: 0; --transition-delay: 0ms; --transition-duration: 200ms; bottom: 0; display: block; height: var(--diameter-tile); position: absolute; left: 0; transform: translate( calc(var(--pos-col) * 100%), calc(var(--pos-row) * -100%) ) translateZ(0); transform-origin: 50% 50%; transition: all var(--transition-duration) var(--transition-ease) var(--transition-delay); width: var(--diameter-tile); } .perspective-black .pieces .piece { transform: translate( calc((7 - var(--pos-col)) * 100%), calc((7 - var(--pos-row)) * -100%) ) translateZ(0); } .pieces .piece svg { display: block; left: 50%; opacity: 1; position: absolute; top: 50%; transform: translate(-50%, -50%) translateZ(0) scale(var(--scale)); transform-origin: 50% 50%; transition: transform var(--transition-duration) var(--transition-ease), fill var(--transition-duration) var(--transition-ease), opacity var(--transition-duration) var(--transition-ease); } .turn-white .pieces .piece:not(.highlight-capture) svg.black, .turn-black .pieces .piece:not(.highlight-capture) svg.white, .turn-black .pieces .piece:not(.can-move):not(.can-capture) svg.black, .turn-white .pieces .piece:not(.can-move):not(.can-capture) svg.white { --stroke: transparent; opacity: 0.8; } @-webkit-keyframes wobble { 0%, 50%, 100% { transform: translate(-50%, -50%) translateZ(0) scale(1) rotate(0deg); } 25% { transform: translate(-50%, -50%) translateZ(0) scale(1.1) rotate(-2deg); } 75% { transform: translate(-50%, -50%) translateZ(0) scale(1.1) rotate(2deg); } } @keyframes wobble { 0%, 50%, 100% { transform: translate(-50%, -50%) translateZ(0) scale(1) rotate(0deg); } 25% { transform: translate(-50%, -50%) translateZ(0) scale(1.1) rotate(-2deg); } 75% { transform: translate(-50%, -50%) translateZ(0) scale(1.1) rotate(2deg); } } .pieces .piece.highlight-active svg { -webkit-animation: wobble 500ms linear infinite; animation: wobble 500ms linear infinite; --stroke: var(--color-success); } .pieces .piece.highlight-capture svg { --stroke: var(--color-danger); } .piece svg { --svg-di: calc(var(--diameter-tile) * 0.666); display: block; font-weight: bold; height: var(--svg-di); left: 50%; line-height: var(--svg-di); position: absolute; stroke-linejoin: round; text-align: center; top: 50%; transform: translate(-50%, -50%); width: var(--svg-di); } </style> </head> <body > <section id="view"> <aside> <div> <h3 title="Autoplay">Auto</h3> <label for="white-random"><input type="checkbox" id="white-random" /><svg width="170" height="170" viewBox="0 0 170 170" fill="none" xmlns="http://www.w3.org/2000/svg" class="white"><use href="#king" /></svg></label> <label for="black-random"><input type="checkbox" id="black-random" checked /><svg width="170" height="170" viewBox="0 0 170 170" fill="none" xmlns="http://www.w3.org/2000/svg" class="black"><use href="#king" /></svg></label> </div> <div> <h3 title="Actions per Second">APS</h3> <label for="speed-slow"><input type="radio" name="speed" id="speed-slow" /><span>1</span></label> <label for="speed-medium"><input type="radio" name="speed" id="speed-medium" checked /><span>2</span></label> <label for="speed-fast"><input type="radio" name="speed" id="speed-fast" /><span>4</span></label> <label for="speed-asap"><input type="radio" name="speed" id="speed-asap" /><span>20</span></label> </div> <div> <h3 title="Point of View">POV</h3> <label for="white-perspective"><input type="radio" name="perspective" id="white-perspective" checked /><svg width="170" height="170" viewBox="0 0 170 170" fill="none" xmlns="http://www.w3.org/2000/svg" class="white"><use href="#king" /></svg></label> <label for="black-perspective"><input type="radio" name="perspective" id="black-perspective" /><svg width="170" height="170" viewBox="0 0 170 170" fill="none" xmlns="http://www.w3.org/2000/svg" class="black"><use href="#king" /></svg></label> </div> </aside> <div id="board"></div> </section> <svg aria-hidden style="display: none;" width="170" height="170" viewBox="0 0 170 170" fill="none" xmlns="http://www.w3.org/2000/svg"> <g id="pawn"> <path fill="var(--stroke)" d="M63.9596 75.8417L71.9157 80.049C73.2376 77.5492 73.3078 74.5734 72.1052 72.0141C70.9025 69.4547 68.5669 67.6094 65.7987 67.0316L63.9596 75.8417ZM53.8303 94.9961L61.7863 99.2034L61.7864 99.2034L53.8303 94.9961ZM53.2512 96.2739L44.7646 93.2777L44.7646 93.2777L53.2512 96.2739ZM54.1798 112V121C57.4071 121 60.3874 119.272 61.9907 116.471C63.5939 113.67 63.5747 110.225 61.9403 107.442L54.1798 112ZM114.82 112L107.06 107.442C105.425 110.225 105.406 113.67 107.009 116.471C108.613 119.272 111.593 121 114.82 121V112ZM115.749 96.2739L124.235 93.2776L124.235 93.2776L115.749 96.2739ZM115.17 94.9961L107.214 99.2034L107.214 99.2034L115.17 94.9961ZM105.111 75.9755L104.388 67.0046C101.37 67.2479 98.6777 68.9917 97.2213 71.6453C95.7649 74.2989 95.74 77.5069 97.1551 80.1828L105.111 75.9755ZM101.706 61L94.1937 56.0436C92.3701 58.8076 92.2116 62.3498 93.7811 65.2657C95.3506 68.1816 98.3945 70 101.706 70V61ZM68.294 61V70C71.6055 70 74.6494 68.1816 76.2189 65.2657C77.7884 62.3498 77.6299 58.8076 75.8063 56.0436L68.294 61ZM56.0036 71.6343L45.8743 90.7887L61.7864 99.2034L71.9157 80.049L56.0036 71.6343ZM45.8743 90.7887C45.5683 91.3674 45.1338 92.2321 44.7646 93.2777L61.7378 99.2702C61.7062 99.3598 61.685 99.4043 61.691 99.3911C61.6938 99.3851 61.7021 99.3674 61.718 99.3356C61.7341 99.3035 61.756 99.2608 61.7863 99.2034L45.8743 90.7887ZM44.7646 93.2777C43.8488 95.8717 40.5174 106.509 46.4192 116.558L61.9403 107.442C61.2075 106.194 60.9315 104.686 61.0138 103C61.0971 101.296 61.5308 99.8565 61.7378 99.2702L44.7646 93.2777ZM54.1798 103H54V121H54.1798V103ZM54 103C41.2975 103 31 113.297 31 126H49C49 123.239 51.2386 121 54 121V103ZM31 126C31 138.703 41.2974 149 54 149V131C51.2386 131 49 128.761 49 126H31ZM54 149H116V131H54V149ZM116 149C128.703 149 139 138.703 139 126H121C121 128.761 118.761 131 116 131V149ZM139 126C139 113.297 128.703 103 116 103V121C118.761 121 121 123.239 121 126H139ZM116 103H114.82V121H116V103ZM122.581 116.558C128.483 106.509 125.151.........完整代码请登录后点击上方下载按钮下载查看
网友评论0