mirror of
https://github.com/bendtherules/github-actions-for-ci.git
synced 2026-08-18 13:53:38 +00:00
initial commit
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
node_modules/
|
||||
package-lock.json
|
||||
public/*.js
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 The GitHub Training Team
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,3 @@
|
||||
# Tic Tac Toe Game
|
||||
|
||||
Learn GitHub Actions through a fun little game.
|
||||
@@ -0,0 +1,12 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
[
|
||||
'@babel/preset-env',
|
||||
{
|
||||
targets: {
|
||||
node: 'current'
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>TicTacToe</title>
|
||||
|
||||
<link href="public/index.css" type="text/css" rel="stylesheet" />
|
||||
<script src="public/game.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app">
|
||||
<div>
|
||||
<h2 id="turn">It's <span id="player"></span>'s turn!</h2>
|
||||
</div>
|
||||
<table>
|
||||
<tr"0">
|
||||
<td class="0 0"></td>
|
||||
<td class="0 1"></td>
|
||||
<td class="0 2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="1 0"></td>
|
||||
<td class="1 1"></td>
|
||||
<td class="1 2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="2 0"></td>
|
||||
<td class="2 1"></td>
|
||||
<td class="2 2"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"name": "actions-template",
|
||||
"version": "1.0.0",
|
||||
"description": "Learn how to use GitHub Actions!",
|
||||
"main": "index.js",
|
||||
"directories": {
|
||||
"test": "__test__",
|
||||
"src": "src"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "npx webpack --config ./src/webpack.config.js --mode production",
|
||||
"dev": "npx webpack --config ./src/webpack.config.js --mode development --watch",
|
||||
"test": "npx standard && npx jest"
|
||||
},
|
||||
"author": "githubtraining",
|
||||
"license": "MIT",
|
||||
"standard": {
|
||||
"env": [
|
||||
"jest",
|
||||
"browser"
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.2.2",
|
||||
"@babel/preset-env": "^7.2.3",
|
||||
"@babel/register": "^7.0.0",
|
||||
"babel-jest": "^24.9.0",
|
||||
"babel-loader": "^8.0.5",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"script-ext-html-webpack-plugin": "^2.1.3",
|
||||
"standard": "^14.3.1",
|
||||
"webpack": "^4.28.4",
|
||||
"webpack-cli": "^3.2.1",
|
||||
"webpack-dev-server": "^3.1.14"
|
||||
},
|
||||
"dependencies": {}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
table td {
|
||||
min-height: 100px;
|
||||
min-width: 100px;
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
text-align: center;
|
||||
|
||||
font-size: 4em;
|
||||
border: thin solid black;
|
||||
}
|
||||
|
||||
table td:hover {
|
||||
background: #CCCCCC;
|
||||
}
|
||||
|
||||
table tr {
|
||||
width: 300px;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
#app {
|
||||
margin: auto;
|
||||
width: 60%;
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
export default class Game {
|
||||
constructor (p1, p2) {
|
||||
this.p1 = p1
|
||||
this.p2 = p2
|
||||
this.board = [[null, null, null], [null, null, null], [null, null, null]]
|
||||
this.player = Math.random() < 0.5 ? this.p1 : this.p2
|
||||
this.sym = 'X'
|
||||
}
|
||||
|
||||
turn (row, col) {
|
||||
col = col || row
|
||||
this.board[row][col] = this.sym
|
||||
}
|
||||
|
||||
nextPlayer () {
|
||||
this.player = this.player === this.p1 ? this.p2 : this.p1
|
||||
this.sym = this.sym === 'X' ? 'O' : 'X'
|
||||
}
|
||||
|
||||
hasWinner () {
|
||||
return this.rowWin() || this.colWin() || this.diagWin()
|
||||
}
|
||||
|
||||
rowWin () {
|
||||
let win = false
|
||||
for (let r = 0; r < 3; r++) {
|
||||
const row = this.board[r]
|
||||
if (row[0] === null) { continue }
|
||||
win = win || (row[0] === row[1] && row[0] === row[2])
|
||||
}
|
||||
|
||||
return win
|
||||
}
|
||||
|
||||
colWin () {
|
||||
let win = false
|
||||
for (let c = 0; c < 3; c++) {
|
||||
const col = this.board
|
||||
if (col[0][c] === null) { continue }
|
||||
win = win || (col[0][c] === col[1][c] && col[0][c] === col[2][c])
|
||||
}
|
||||
|
||||
return win
|
||||
}
|
||||
|
||||
diagWin () {
|
||||
const b = this.board
|
||||
return ((b[0][0] !== null && b[0][0] === b[1][1] && b[0][0] === b[2][2]) ||
|
||||
(b[0][2] !== null && b[0][2] === b[1][1] && b[0][2] === b[2][0]))
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
import Game from './game.js'
|
||||
|
||||
let p1, p2
|
||||
while (!p1) {
|
||||
p1 = window.prompt('Enter player 1 name:')
|
||||
}
|
||||
|
||||
while (!p2 && p1 !== p2) {
|
||||
p2 = window.prompt(p1 === p2
|
||||
? `Please enter a different name than ${p1}.`
|
||||
: 'Enter player 2 name:')
|
||||
}
|
||||
|
||||
window.onload = () => {
|
||||
const game = new Game(p1, p2)
|
||||
const turn = document.getElementById('turn')
|
||||
const player = document.getElementById('player')
|
||||
player.innerText = game.player
|
||||
|
||||
document.querySelectorAll('td').forEach((el) => {
|
||||
el.onclick = (evt) => {
|
||||
el.onclick = undefined
|
||||
evt.target.innerText = game.sym
|
||||
evt.target.onclick = undefined
|
||||
|
||||
const [row, col] = evt.target.classList
|
||||
game.turn(row, col)
|
||||
|
||||
if (game.hasWinner()) {
|
||||
turn.innerText = `${game.player} wins!`
|
||||
document.querySelectorAll('td').forEach(el => {
|
||||
el.onclick = undefined
|
||||
})
|
||||
} else {
|
||||
game.nextPlayer()
|
||||
player.innerText = game.player
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
const path = require('path')
|
||||
|
||||
module.exports = {
|
||||
entry: {
|
||||
'main.js': [
|
||||
path.resolve(__dirname, 'index.js'),
|
||||
path.resolve(__dirname, 'game.js')
|
||||
]
|
||||
},
|
||||
output: {
|
||||
filename: 'main.js',
|
||||
path: path.resolve(__dirname, '../public')
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user