From 41437548035497df12b0548fb48d0e63d3b7ffa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Molero?= Date: Thu, 1 Mar 2018 14:49:34 +0100 Subject: [PATCH 1/9] add css styles and main html structure as component --- .vscode/launch.json | 14 ++ public/img/bj-icon.png | Bin 0 -> 4478 bytes public/img/mobile-cards.png | Bin 0 -> 23647 bytes public/manifest.appcache | 19 ++ src/App.css | 28 --- src/App.tsx | 22 -- ...{App.test.tsx => SimpleBlackJack.test.tsx} | 4 +- src/SimpleBlackJack.tsx | 64 ++++++ src/components/Card.tsx | 38 ++++ src/css/base.css | 202 ++++++++++++++++++ src/css/enhanced.css | 44 ++++ src/index.css | 5 - src/index.tsx | 7 +- src/logo.svg | 7 - tsconfig.json | 1 + 15 files changed, 388 insertions(+), 67 deletions(-) create mode 100644 .vscode/launch.json create mode 100755 public/img/bj-icon.png create mode 100755 public/img/mobile-cards.png create mode 100755 public/manifest.appcache delete mode 100644 src/App.css delete mode 100644 src/App.tsx rename src/{App.test.tsx => SimpleBlackJack.test.tsx} (62%) create mode 100644 src/SimpleBlackJack.tsx create mode 100644 src/components/Card.tsx create mode 100755 src/css/base.css create mode 100755 src/css/enhanced.css delete mode 100644 src/index.css delete mode 100644 src/logo.svg diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..3bb6654 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + // Utilizar IntelliSense para aprender acerca de los posibles atributos. + // Mantenga el puntero para ver las descripciones de los existentes atributos + // Para más información, visite: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Iniciar programa", + "program": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/public/img/bj-icon.png b/public/img/bj-icon.png new file mode 100755 index 0000000000000000000000000000000000000000..3af89e50039b92eb55de7bcbb9bed10393edf113 GIT binary patch literal 4478 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 literal 0 HcmV?d00001 diff --git a/public/img/mobile-cards.png b/public/img/mobile-cards.png new file mode 100755 index 0000000000000000000000000000000000000000..567d2b0eccc12e04377e1c6b313d96bb17be9801 GIT binary patch literal 23647 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 -
- logo -

Welcome to React

-
-

- To get started, edit src/App.tsx and save to reload. -

- - ); - } -} - -export default App; diff --git a/src/App.test.tsx b/src/SimpleBlackJack.test.tsx similarity index 62% rename from src/App.test.tsx rename to src/SimpleBlackJack.test.tsx index 2b4da0b..8631c09 100644 --- a/src/App.test.tsx +++ b/src/SimpleBlackJack.test.tsx @@ -1,8 +1,8 @@ import * as React from 'react'; import * as ReactDOM from 'react-dom'; -import App from './App'; +import SimpleBlackJack from './SimpleBlackJack'; it('renders without crashing', () => { const div = document.createElement('div'); - ReactDOM.render(, div); + ReactDOM.render(, div); }); diff --git a/src/SimpleBlackJack.tsx b/src/SimpleBlackJack.tsx new file mode 100644 index 0000000..e711e3b --- /dev/null +++ b/src/SimpleBlackJack.tsx @@ -0,0 +1,64 @@ +import * as React from 'react'; +import Card from './components/Card'; + +class SimpleBlackJack extends React.Component { + render() { + return ( +
+ + +
+ 0 + + + + 0 +
+
+
+
+
+ Your cards +
+
+ +
+
+
+
+
+ Dealer +
+
+ +
+
+
+
+
+
+
+

+ Wellcome to the Víctor Molero's BlackJack Game. Press 'Deal!' to start playing. +

+
+
+
+ ); + } +} + +export default SimpleBlackJack; diff --git a/src/components/Card.tsx b/src/components/Card.tsx new file mode 100644 index 0000000..c746341 --- /dev/null +++ b/src/components/Card.tsx @@ -0,0 +1,38 @@ +import * as React from 'react'; + +interface CardPropsInterface { + name: string; + suite: string; + x: string; + y: string; +} + +class Card extends React.Component { + private id: string; + private x: number; + private y: number; + + constructor(props: CardPropsInterface) { + super(props); + this.id = props.name + props.suite; + this.x = parseInt(props.x, 10); + this.y = parseInt(props.y, 10); + } + + render() { + let background = { + backgroundImage: `url('../img/mobile-cards.png')`, + backgroundPositionX: this.x, + backgroundPositionY: this.y + }; + return ( +
+ ({this.x}, {this.y}): {this.id} +
+ ); + } +} + +export default Card; + // card-name={this.props.card-name} card-suite={this.props.data-suite} + // x-position={this.props.x} y-position={this.props.y} \ No newline at end of file diff --git a/src/css/base.css b/src/css/base.css new file mode 100755 index 0000000..9af9595 --- /dev/null +++ b/src/css/base.css @@ -0,0 +1,202 @@ +* { margin: 0; padding: 0; } +.invisible { + display: none !important; + height: 0px !important; + overflow: hidden !important; + /* visibility: hidden;*/ +} + +body { + background-color: green; + font-family: "Trebuchet MS"; + color: SandyBrown; +} + +#globalinfopanel { + background-color: DarkGreen; + text-align: center; + color: SandyBrown; +} + + + +#globalscores { + color: White; + font-weight: bold; +} + +#playerscore { + font-size: 1.2em; + color: Gold; +} + +#bankscore { + font-size: 1.2em; + color: Gray; +} + +#table { + width: 100%; +} + +#gamezone { + width: 100%; + margin: .5em auto; +} + +fieldset { + padding: .3em; + border: 1px solid YellowGreen; + margin: 0 .2em; +} + +#playerfieldset { + color: Gold; +} + +#bankfieldset { + color: YellowGreen; +} + +legend { + font-size: 0.8em; + font-weight: bold; + padding: 0 0.2em; + text-transform: uppercase; +} + +h1 span { + font-size: .7em; + color: White; +} + +h1 { + color: YellowGreen; + text-align: center; +} + + input[type="button"] { + border: 0; + } + +aside input[type="button"], #gamebuttons input[type="button"] { + + background: none; + height: 4em; + width: 25%; + font-weight: bolder; +} +input[type="button"]:hover { + cursor: pointer; + +} + +#gamebuttons { + text-align: center; +} + +aside > div { + text-align: center; + width: 100%; +} + + +#btnDealer { + background-color: DarkOrange !important; + color: BlanchedAlmond; +} + +#btnHit { + background-color: Khaki !important; + color: DarkOliveGreen; +} + +#btnStand { + background-color: YellowGreen !important; + color: Olive; +} + +#localstoragebuttons input { + color: Wheat; + width: 48%; + height: 1.3em; +} + +#btnSave { + background-color: DimGray; + +} + +#btnReset { + background-color: Gray; +} + +#btnHide { + display: none; +} + +#gameinfo { + background-color: BlanchedAlmond; + color: DimGray; + text-align: center; +} + +#playeramount, #bankamount { + font-size: 1.2em; +} + +#playeramount { + color: Gold; +} + +#bankamount { + color: LightGray; +} + +#player { + + font-size: 1.4em; +} + +#bank { + font-size: 1.4em; +} + +#gamezone { + text-align: center; +} + +section { + display: inline-block; + width: 45%; +} + +.card { + width: 60px; + height: 80px; + display: inline-block; + background-repeat: no-repeat; + -moz-border-radius: 5px; + border-radius: 5px; + + -moz-box-shadow: 0 0 5px #555; + -webkit-box-shadow: 0 0 5px #555; + box-shadow: 0 0 5px #FFF; + + border: 1px solid #555; +} + +.card + .card { + margin-left: -48px; +} + +.no-background { + background-position: -999px -999px !important; +} + + + + + + + diff --git a/src/css/enhanced.css b/src/css/enhanced.css new file mode 100755 index 0000000..296ab2b --- /dev/null +++ b/src/css/enhanced.css @@ -0,0 +1,44 @@ +@charset "utf-8"; +/* CSS Document */ +@media all and (min-width: 600px) +{ + #player:before { + content: "Player "; + } + + #bank:after { + content: " Dealer"; + } + + #table { + width: 100%; + clear: left; + } + + #gamezone { + text-align: left; + } + + section { + display: block; + width: 100%; + } + + .card + .card { + margin-left: 5px; + } + + #btnHide { + background-color: LightGray; + color: #333 !important; + display: inline; + } + + #localstoragebuttons input { + width: 30%; + } + #container { + max-width: 800px; + margin: 0 auto; + } +} \ No newline at end of file diff --git a/src/index.css b/src/index.css deleted file mode 100644 index b4cc725..0000000 --- a/src/index.css +++ /dev/null @@ -1,5 +0,0 @@ -body { - margin: 0; - padding: 0; - font-family: sans-serif; -} diff --git a/src/index.tsx b/src/index.tsx index 1c66245..8f55069 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,11 +1,12 @@ import * as React from 'react'; import * as ReactDOM from 'react-dom'; -import App from './App'; +import SimpleBlackJack from './SimpleBlackJack'; import registerServiceWorker from './registerServiceWorker'; -import './index.css'; +import './css/base.css'; +import './css/enhanced.css'; ReactDOM.render( - , + , document.getElementById('root') as HTMLElement ); registerServiceWorker(); diff --git a/src/logo.svg b/src/logo.svg deleted file mode 100644 index 6b60c10..0000000 --- a/src/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tsconfig.json b/tsconfig.json index 8597354..958a8f7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "baseUrl": "src", "outDir": "build/dist", "module": "esnext", "target": "es5", From bcd20a2c8d26b461e01597cc1d6f71629b38bb4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Molero?= Date: Fri, 2 Mar 2018 00:34:45 +0100 Subject: [PATCH 2/9] Card class and component to render background properly --- src/Card.ts | 44 ++++++++++++++++++++++++ src/SimpleBlackJack.tsx | 6 ++-- src/Suit.ts | 8 +++++ src/components/Card.tsx | 38 -------------------- src/components/CardComponent.tsx | 42 ++++++++++++++++++++++ src/tests/Card.test.ts | 23 +++++++++++++ src/{ => tests}/SimpleBlackJack.test.tsx | 2 +- 7 files changed, 121 insertions(+), 42 deletions(-) create mode 100644 src/Card.ts create mode 100644 src/Suit.ts delete mode 100644 src/components/Card.tsx create mode 100644 src/components/CardComponent.tsx create mode 100644 src/tests/Card.test.ts rename src/{ => tests}/SimpleBlackJack.test.tsx (78%) diff --git a/src/Card.ts b/src/Card.ts new file mode 100644 index 0000000..47dbd6d --- /dev/null +++ b/src/Card.ts @@ -0,0 +1,44 @@ +import Suit from './Suit'; + +export default class Card { + private value: number; + private suit: Suit; + + constructor(value: number, suit: Suit) { + if (typeof(Suit[suit]) !== 'string') { + throw new Error('Invalid Suit'); + } + this.value = value; + this.suit = suit; + } + + public getValue(): number { + return this.value; + } + + public getCardName(): string { + if (this.value === 1) { + return 'Ace'; + } else if (this.value === 11) { + return 'Jack'; + } else if (this.value === 12) { + return 'Queen'; + } else if (this.value === 13) { + return 'King'; + } else { + return '' + this.value; + } + } + + public getFullName(): string { + return this.getCardName() + this.getSuitName(); + } + + public getSuit(): Suit { + return this.suit; + } + + public getSuitName(): string { + return Suit[this.suit]; + } +} \ No newline at end of file diff --git a/src/SimpleBlackJack.tsx b/src/SimpleBlackJack.tsx index e711e3b..1e3a733 100644 --- a/src/SimpleBlackJack.tsx +++ b/src/SimpleBlackJack.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import Card from './components/Card'; +import CardComponent from './components/CardComponent'; class SimpleBlackJack extends React.Component { render() { @@ -34,7 +34,7 @@ class SimpleBlackJack extends React.Component { Your cards
- +
@@ -43,7 +43,7 @@ class SimpleBlackJack extends React.Component { Dealer
- +
diff --git a/src/Suit.ts b/src/Suit.ts new file mode 100644 index 0000000..c936a4b --- /dev/null +++ b/src/Suit.ts @@ -0,0 +1,8 @@ +enum Suit { + Clubs = 1, + Spades, + Hearts, + Diamonds, +} + +export default Suit; \ No newline at end of file diff --git a/src/components/Card.tsx b/src/components/Card.tsx deleted file mode 100644 index c746341..0000000 --- a/src/components/Card.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import * as React from 'react'; - -interface CardPropsInterface { - name: string; - suite: string; - x: string; - y: string; -} - -class Card extends React.Component { - private id: string; - private x: number; - private y: number; - - constructor(props: CardPropsInterface) { - super(props); - this.id = props.name + props.suite; - this.x = parseInt(props.x, 10); - this.y = parseInt(props.y, 10); - } - - render() { - let background = { - backgroundImage: `url('../img/mobile-cards.png')`, - backgroundPositionX: this.x, - backgroundPositionY: this.y - }; - return ( -
- ({this.x}, {this.y}): {this.id} -
- ); - } -} - -export default Card; - // card-name={this.props.card-name} card-suite={this.props.data-suite} - // x-position={this.props.x} y-position={this.props.y} \ No newline at end of file diff --git a/src/components/CardComponent.tsx b/src/components/CardComponent.tsx new file mode 100644 index 0000000..7337fc3 --- /dev/null +++ b/src/components/CardComponent.tsx @@ -0,0 +1,42 @@ +import * as React from 'react'; +import Card from './../Card'; + +interface CardPropsInterface { + value: string; + suit: string; +} + +export default class CardComponent extends React.Component { + readonly CARD_WIDTH: number = 60; + readonly CARD_HEIGHT: number = 80; + private id: string; + private card: Card; + + constructor(props: CardPropsInterface) { + super(props); + this.id = props.value + props.suit; + this.card = new Card( + parseInt(props.value, 10), + parseInt(props.suit, 10) + ); + } + + getBackgroundPositionX(column: number) { + return -1 * (column - 1) * this.CARD_WIDTH; + } + + getBackgroundPositionY(row: number) { + return -1 * (row - 1) * this.CARD_HEIGHT; + } + + render() { + let background = { + backgroundImage: `url('../img/mobile-cards.png')`, + backgroundPositionX: this.getBackgroundPositionX(this.card.getValue()), + backgroundPositionY: this.getBackgroundPositionY(this.card.getSuit()), + }; + return ( +
+ ); + } +} \ No newline at end of file diff --git a/src/tests/Card.test.ts b/src/tests/Card.test.ts new file mode 100644 index 0000000..35a6377 --- /dev/null +++ b/src/tests/Card.test.ts @@ -0,0 +1,23 @@ +import Card from './../Card'; +import Suit from './../Suit'; + +test('can create a card', () => { + let card: Card = new Card(1, Suit.Hearts); + return expect(card instanceof Card).toBeTruthy(); +}); + +test('name is correct for Ace of Hearts', () => { + let card: Card = new Card(1, Suit.Hearts); + return expect(card.getFullName()).toBe('AceHearts'); +}); + +test('name is correct for Jack of Spades', () => { + let card: Card = new Card(11, Suit.Spades); + return expect(card.getFullName()).toBe('JackSpades'); +}); + +test('Suit is not valid', () => { + return expect(() => { + return new Card(11, 5); + }).toThrow('Invalid Suit'); +}); \ No newline at end of file diff --git a/src/SimpleBlackJack.test.tsx b/src/tests/SimpleBlackJack.test.tsx similarity index 78% rename from src/SimpleBlackJack.test.tsx rename to src/tests/SimpleBlackJack.test.tsx index 8631c09..cdf89af 100644 --- a/src/SimpleBlackJack.test.tsx +++ b/src/tests/SimpleBlackJack.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import * as ReactDOM from 'react-dom'; -import SimpleBlackJack from './SimpleBlackJack'; +import SimpleBlackJack from '../../src/SimpleBlackJack'; it('renders without crashing', () => { const div = document.createElement('div'); From bb9f865e25c036f66caeb517518067fbff4018c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Molero?= Date: Fri, 2 Mar 2018 21:52:03 +0100 Subject: [PATCH 3/9] make test pass --- .gitignore | 1 + .vscode/launch.json | 40 +++++++++++++++------ src/Board.ts | 16 +++++++++ src/Card.ts | 36 ++++++++++++------- src/Hand.ts | 60 +++++++++++++++++++++++++++++++ src/SimpleBlackJack.tsx | 25 ++----------- src/components/BoardComponent.tsx | 43 ++++++++++++++++++++++ src/components/CardComponent.tsx | 8 ++--- src/tests/Card.test.ts | 32 +++++++++++++++++ src/tests/Hand.test.ts | 50 ++++++++++++++++++++++++++ 10 files changed, 261 insertions(+), 50 deletions(-) create mode 100644 src/Board.ts create mode 100644 src/Hand.ts create mode 100644 src/components/BoardComponent.tsx create mode 100644 src/tests/Hand.test.ts diff --git a/.gitignore b/.gitignore index d30f40e..9e14f66 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ # testing /coverage +.vscode/chrome # production /build diff --git a/.vscode/launch.json b/.vscode/launch.json index 3bb6654..3ff2a6a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,14 +1,32 @@ { - // Utilizar IntelliSense para aprender acerca de los posibles atributos. - // Mantenga el puntero para ver las descripciones de los existentes atributos - // Para más información, visite: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Iniciar programa", - "program": "${workspaceFolder}" + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Debug Tests", + "preLaunchTask": "debugBuild", + "program": "${workspaceRoot}/node_modules/jest/bin/jest.js", + "args": [ + "--runInBand", + "--config", + "${workspaceRoot}/config/jest.debug.json" + ], + "sourceMaps": true, + "outFiles": [ + "${workspaceRoot}/output/debug/**/*" + ] + }, + { + "name": "Chrome", + "type": "chrome", + "request": "launch", + "url": "http://localhost:3000", + "webRoot": "${workspaceRoot}/src", + "userDataDir": "${workspaceRoot}/.vscode/chrome", + "sourceMapPathOverrides": { + "webpack:///src/*": "${webRoot}/*" } - ] + } + ] } \ No newline at end of file diff --git a/src/Board.ts b/src/Board.ts new file mode 100644 index 0000000..16c3352 --- /dev/null +++ b/src/Board.ts @@ -0,0 +1,16 @@ +import Hand from './Hand'; +import Card from './Card'; + +export default class Board { + private hand: Hand; + + constructor() { + this.hand = new Hand(); + } + public addCard(card: Card) { + this.hand.add(card); + } + public getHandScore() { + return this.hand.getScore(); + } +} \ No newline at end of file diff --git a/src/Card.ts b/src/Card.ts index 47dbd6d..d403ac4 100644 --- a/src/Card.ts +++ b/src/Card.ts @@ -1,37 +1,42 @@ import Suit from './Suit'; export default class Card { - private value: number; + readonly MIN_RANK = 1; + readonly MAX_RANK = 13; + private rank: number; private suit: Suit; - constructor(value: number, suit: Suit) { + constructor(rank: number, suit: Suit) { if (typeof(Suit[suit]) !== 'string') { throw new Error('Invalid Suit'); } - this.value = value; + if (rank < this.MIN_RANK || rank > this.MAX_RANK) { + throw new Error('Invalid Rank'); + } + this.rank = rank; this.suit = suit; } - public getValue(): number { - return this.value; + public getRank(): number { + return this.rank; } - public getCardName(): string { - if (this.value === 1) { + public getRankName(): string { + if (this.rank === 1) { return 'Ace'; - } else if (this.value === 11) { + } else if (this.rank === 11) { return 'Jack'; - } else if (this.value === 12) { + } else if (this.rank === 12) { return 'Queen'; - } else if (this.value === 13) { + } else if (this.rank === 13) { return 'King'; } else { - return '' + this.value; + return '' + this.rank; } } public getFullName(): string { - return this.getCardName() + this.getSuitName(); + return this.getRankName() + this.getSuitName(); } public getSuit(): Suit { @@ -41,4 +46,11 @@ export default class Card { public getSuitName(): string { return Suit[this.suit]; } + + public getScore(): Array { + if (this.rank === 1) { + return [1, 11]; + } + return this.rank < 10 ? [this.rank] : [10]; + } } \ No newline at end of file diff --git a/src/Hand.ts b/src/Hand.ts new file mode 100644 index 0000000..90aa453 --- /dev/null +++ b/src/Hand.ts @@ -0,0 +1,60 @@ +import Card from './Card'; + +export default class Hand { + private cards: Array; + public constructor() { + this.cards = Array(); + } + + public add(card: Card) { + this.cards.push(card); + } + + public getScore(): number { + let arrayPossibleScores: Array = this.calculateRec(this.cards); + return this.bestHand(arrayPossibleScores); + } + + private calculateRec(hand: Array): Array { + if (hand.length === 0) { + return [0]; + } + let handrec: Array = hand.slice(0); + const firstCard: Card | undefined = handrec.shift(); + let handScore: Array = []; + if (firstCard === undefined) { + return [0]; + } + let firstCardScore: Array = firstCard.getScore(); + + for (let i: number = 0; i < firstCardScore.length; i++) { + let score: number = firstCardScore[i]; + let accumulated: Array = this.arrayAdd(score, this.calculateRec(handrec)); + handScore = handScore.concat(accumulated); + } + return handScore; + } + + private bestHand (vector: Array): number { + let best: number = vector[0]; + let candidate: number = 0; + for (let i: number = 1; i < vector.length; i++) { + candidate = vector[i]; + if (best > 21) { + best = Math.min(best, candidate); + } else { + best = (candidate > best && candidate <= 21 ? candidate : best); + } + } + + return best; + } + + private arrayAdd(n: number, vector: Array): Array { + for (let i: number = 0; i < vector.length; i++) { + vector[i] += n; + } + + return vector; + } +} \ No newline at end of file diff --git a/src/SimpleBlackJack.tsx b/src/SimpleBlackJack.tsx index 1e3a733..3eb3ca4 100644 --- a/src/SimpleBlackJack.tsx +++ b/src/SimpleBlackJack.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import CardComponent from './components/CardComponent'; +import BoardComponent from './components/BoardComponent'; class SimpleBlackJack extends React.Component { render() { @@ -27,28 +27,7 @@ class SimpleBlackJack extends React.Component { 0
-
-
-
-
- Your cards -
-
- -
-
-
-
-
- Dealer -
-
- -
-
-
-
-
+