Advertisement
Guest User

Untitled

a guest
May 25th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.00 KB | None | 0 0
  1. var possibleCombinationSum = function(arr, n) {
  2. if (arr.indexOf(n) >= 0) { return true; }
  3. if (arr[0] > n) { return false; }
  4. if (arr[arr.length - 1] > n) {
  5. arr.pop();
  6. return possibleCombinationSum(arr, n);
  7. }
  8. var listSize = arr.length, combinationsCount = (1 << listSize)
  9. for (var i = 1; i < combinationsCount ; i++ ) {
  10. var combinationSum = 0;
  11. for (var j=0 ; j < listSize ; j++) {
  12. if (i & (1 << j)) { combinationSum += arr[j]; }
  13. }
  14. if (n === combinationSum) { return true; }
  15. }
  16. return false;
  17. };
  18.  
  19. const Stars = (props) => {
  20. return (
  21. <div className="col-5">
  22. {_.range(props.numberOfStars).map(i =>
  23. <i key={i} className="fa fa-star"></i>
  24. )}
  25. </div>
  26. );
  27. };
  28.  
  29. const Button = (props) => {
  30. let button;
  31. switch(props.answerIsCorrect){
  32. case true:
  33. button =
  34. <button className="btn btn-success" onClick = {props.acceptAnswer}>
  35. <i className="fa fa-check"></i>
  36. </button>;
  37. break;
  38. case false:
  39. button =
  40. <button className="btn btn-danger" >
  41. <i className="fa fa-times"></i>
  42. </button>;
  43. break;
  44. default:
  45. button = <button className="btn" onClick = {props.checkAnswer}
  46. disabled = {props.selectedNumbers.length === 0}>=</button>;
  47. break;
  48. }
  49. return (
  50. <div className="col-2 text-center">
  51. {button}
  52. <br /><br />
  53. <button className="btn btn-warning btn-sm" onClick={props.withdraw} disabled={props.withdraws === 0}>
  54. <i className="icon-refresh"></i>
  55. {props.withdraws}
  56. </button>
  57. </div>
  58. );
  59. };
  60.  
  61. const Answer = (props) => {
  62. return (
  63. <div className="col-5">
  64. {props.selectedNumbers.map((number, i) =>
  65. <span key={i} onClick={() => props.unSelectedNumber(number)}>{number}</span>
  66. )}
  67. </div>
  68. );
  69. };
  70.  
  71. const Numbers = (props) => {
  72. const numberClassName = (number) => {
  73. if (props.usedNumbers.indexOf(number) >= 0) {
  74. return 'used';
  75. }
  76. if (props.selectedNumbers.indexOf(number) >= 0) {
  77. return 'selected';
  78. }
  79. };
  80. return (
  81. <div className="card text-center">
  82. <div>
  83. {Numbers.list.map((number, i) =>
  84. <span key={i} className={numberClassName(number)}
  85. onClick={() => props.selectNumber(number)}>
  86. {number}
  87. </span>
  88. )}
  89. </div>
  90. </div>
  91. );
  92. };
  93.  
  94. const DoneFrame = (props) => {
  95. return(
  96. <div className="text-center">
  97. <h2>{props.gameStatus}</h2>
  98. <button className="btn btn-secondary" onClick={props.resetGame}>Play Again </button>
  99. </div>
  100. );
  101. };
  102.  
  103. Numbers.list = _.range(1, 10);
  104.  
  105. class Game extends React.Component {
  106. static randomNumberOfStars = () => 1 + Math.floor(Math.random()*9);
  107. static initialState = () => ({
  108. selectedNumbers: [],
  109. usedNumbers: [],
  110. randomNumberOfStars: Game.randomNumberOfStars(),
  111. answerIsCorrect: null,
  112. withdraws: 5,
  113. gameStatus: null,
  114. });
  115.  
  116. state = Game.initialState();
  117.  
  118. selectNumber = (clickedNumber) => {
  119. if (this.state.selectedNumbers.indexOf(clickedNumber) >= 0) { return; }
  120. this.setState(prevState => ({
  121. answerIsCorrect: null,
  122. selectedNumbers: prevState.selectedNumbers.concat(clickedNumber)
  123. }));
  124. };
  125.  
  126. unSelectedNumber = (clickedNumber) => {
  127. this.setState(prevState => ({
  128. answerIsCorrect: null,
  129. selectedNumbers: prevState.selectedNumbers.filter(number => number !== clickedNumber)
  130. }));
  131. };
  132.  
  133. checkAnswer = () => {
  134. this.setState(prevState => ({
  135. answerIsCorrect: prevState.randomNumberOfStars ===
  136. prevState.selectedNumbers.reduce((acc, n) => acc + n, 0)
  137. }));
  138. };
  139.  
  140. acceptAnswer = () => {
  141. this.setState((prevState => ({
  142. usedNumbers: prevState.usedNumbers.concat(prevState.selectedNumbers),
  143. selectedNumbers: [],
  144. answerIsCorrect: null,
  145. randomNumberOfStars: Game.randomNumberOfStars(),
  146. })), this.updateDoneStatus)
  147. };
  148.  
  149. withdraw = () => {
  150. if(this.state.withdraws === 0) {return; };
  151. this.setState(prevState => ({
  152. randomNumberOfStars: Game.randomNumberOfStars(),
  153. answerIsCorrect: null,
  154. selectedNumbers: [],
  155. withdraws: prevState.withdraws - 1,
  156. }), this.updateDoneStatus);
  157. };
  158.  
  159. possibleSolutions = ({randomNumberOfStars, usedNumbers}) => {
  160. const possibleNumbers = _.range(1,10).filter(number => usedNumbers.indexOf(number) === -1);
  161. return possibleCombinationSum(possibleNumbers, randomNumberOfStars);
  162. };
  163.  
  164. updateDoneStatus = () => {
  165. this.setState(prevState => {
  166. if (prevState.usedNumbers.length===9){
  167. return{gameStatus: "GG~~!"}
  168. }
  169. if(prevState.withdraws ===0 && !this.possibleSolutions(prevState)) {
  170. return{gameStatus: "BG! :("}
  171. }
  172. });
  173. };
  174.  
  175. resetGame = () => this.setState(Game.initialState());
  176.  
  177. render() {
  178. const {selectedNumbers, randomNumberOfStars, answerIsCorrect, usedNumbers, withdraws, gameStatus} = this.state;
  179. return (
  180. <div className="container">
  181. <h3>Play Nine</h3>
  182. <hr />
  183. <div className="row">
  184. <Stars numberOfStars={randomNumberOfStars} />
  185. <Button selectedNumbers={selectedNumbers}
  186. checkAnswer = {this.checkAnswer}
  187. answerIsCorrect = {answerIsCorrect}
  188. acceptAnswer = {this.acceptAnswer}
  189. withdraw = {this.withdraw}
  190. withdraws = {withdraws}/>
  191. <Answer selectedNumbers={selectedNumbers}
  192. unSelectedNumber = {this.unSelectedNumber}/>
  193. </div>
  194. <br />
  195.  
  196. <br />
  197. {gameStatus ?
  198. <DoneFrame resetGame={this.resetGame} gameStatus = {gameStatus}/>:
  199. <Numbers selectedNumbers={selectedNumbers}
  200. selectNumber={this.selectNumber}
  201. usedNumbers={usedNumbers}/>
  202. }
  203. </div>
  204. );
  205. }
  206. }
  207.  
  208. class App extends React.Component {
  209. render() {
  210. return (
  211. <div>
  212. <Game />
  213. </div>
  214. );
  215. }
  216. }
  217.  
  218. ReactDOM.render(<App />, mountNode);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement