Guest User

Untitled

a guest
Jan 16th, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.02 KB | None | 0 0
  1. //bit.ly/s-pcs
  2. //possible combination logic
  3.  
  4. var possibleCombinationSum = function(arr, n) {
  5. if (arr.indexOf(n) >= 0) { return true; }
  6. if (arr[0] > n) { return false; }
  7. if (arr[arr.length - 1] > n) {
  8. arr.pop();
  9. return possibleCombinationSum(arr, n);
  10. }
  11. var listSize = arr.length, combinationsCount = (1 << listSize)
  12. for (var i = 1; i < combinationsCount ; i++ ) {
  13. var combinationSum = 0;
  14. for (var j=0 ; j < listSize ; j++) {
  15. if (i & (1 << j)) { combinationSum += arr[j]; }
  16. }
  17. if (n === combinationSum) { return true; }
  18. }
  19. return false;
  20. };
  21.  
  22.  
  23.  
  24. const Stars = (props) =>{
  25. //since Stars is children of Game componenet, this will trigger whenever React rerenders, In order to keep same number of stars unless reload button was clicked, this should be moved to parent component which is Game component
  26. //const numberOfStars = Math.floor(Math.random()*9);
  27.  
  28. // let stars = [];
  29. // for(let k=0; k < numberOfStars; k++){
  30. // stars.push(<i key={k} className ="fa fa-star"></i>);
  31. // }
  32.  
  33. return(
  34. <div className="col-5">
  35. {_.range(props.numberOfStars).map(i => <i key={i} className ="fa fa-star"></i>)}
  36. </div>
  37. )
  38. }
  39.  
  40. const Button =(props)=>{
  41.  
  42. let button;
  43.  
  44. switch(props.answerIsCorrect) {
  45. case true:
  46. button = <button className = "btn btn-success" onClick = {props.acceptAnswer}>
  47. <i className = "fa fa-check"></i>
  48. </button>
  49. break;
  50. case false:
  51. button = <button className = "btn btn-danger">
  52. <i className = "fa fa-times"></i>
  53. </button>
  54. break;
  55.  
  56. default:
  57. button = <button className = "btn" disabled ={props.selectedNumbers.length === 0 } onClick={props.checkAnswer}>=</button>
  58. break;
  59. }
  60.  
  61.  
  62. return(
  63. <div className="col-2 text-center">
  64. {button}
  65.  
  66. <br /> <br />
  67. <button className = "btn btn-warning btn-sm" onClick={props.redraw} disabled={props.redraws === 0}>
  68. <i className = "fa fa-refresh"></i> {props.redraws}
  69. </button>
  70. </div>
  71. )
  72. }
  73.  
  74. const Answer = (props)=>{
  75. return(
  76. <div className="col-5">
  77. {props.selectedNumbers.map((number, i)=><span key ={i} onClick = {()=>props.unselectNumber(number)}>{number}</span>)}
  78. </div>
  79. )
  80. }
  81.  
  82.  
  83. const Numbers = (props) =>{
  84.  
  85. //const arrayOfNumbers = _.range(1,10);
  86. // {arrayOfNumbers.map((number, i)=><span key ={i}>{number}</span>)}
  87.  
  88. const numberClassName = (number)=>{
  89. if(props.usedNumbers.indexOf(number) >=0) {
  90. return 'used';
  91. }
  92.  
  93. if(props.selectedNumbers.indexOf(number) >=0) {
  94. return 'selected';
  95. }
  96. }
  97. return(
  98. <div className = "card text-center">
  99. <div>
  100. {Numbers.list.map((number, i)=><span key ={i} className = {numberClassName(number)} onClick={()=>props.selectNumber(number)}>{number}</span>
  101. )}
  102. </div>
  103. </div>
  104.  
  105. )
  106. }
  107.  
  108. //Every function in javascript is an object
  109. Numbers.list = _.range(1,10);
  110.  
  111.  
  112. const DoneFrame = (props) => {
  113. return(
  114. <div className ="text-center">
  115. <h2>{props.doneStatus}</h2>
  116. <button className="btn btn-secondary" onClick={props.reset}>Play Again</button>
  117. </div>
  118. )
  119. }
  120.  
  121. class Game extends React.Component {
  122.  
  123. static randomNumber = () => 1 + Math.floor(Math.random()*9);
  124.  
  125. state ={
  126. selectedNumbers : [],
  127. usedNumbers: [],
  128. randomNumbersOfStars: Game.randomNumber(),
  129. answerIsCorrect: null,
  130. redraws: 5,
  131. doneStatus: null
  132. }
  133.  
  134. selectNumber = (clickedNumber)=> {
  135. if(this.state.selectedNumbers.indexOf(clickedNumber) >=0) { return;}
  136. this.setState(prevState =>({
  137. answerIsCorrect: null,
  138. selectedNumbers: prevState.selectedNumbers.concat(clickedNumber)
  139. }));
  140. }
  141.  
  142. unselectNumber = (clickedNumber)=>{
  143. this.setState(prevState => ({
  144. answerIsCorrect: null,
  145. selectedNumbers: prevState.selectedNumbers.filter(number => number !== clickedNumber)
  146. }));
  147.  
  148. }
  149.  
  150. /*
  151. match = ()=>{
  152. let value = 0;
  153. this.state.selectedNumbers.forEach(number => value+= number);
  154. if(this.state.randomNumbersOfStars === value){
  155. alert('match');
  156. }else{
  157. alert('not matching');
  158. }
  159. }
  160. */
  161.  
  162.  
  163.  
  164.  
  165.  
  166. checkAnswer = () => {
  167.  
  168. this.setState(prevState => ({
  169. answerIsCorrect: prevState.randomNumbersOfStars === prevState.selectedNumbers.reduce((acc, n ) => acc + n, 0)
  170.  
  171. }))
  172. }
  173.  
  174.  
  175. acceptAnswer = () => {
  176. this.setState(prevState => ({
  177. usedNumbers: prevState.usedNumbers.concat(prevState.selectedNumbers),
  178. selectedNumbers: [],
  179. answerIsCorrect: null,
  180. randomNumbersOfStars: Game.randomNumber()
  181. }), this.updateDoneStatus);
  182.  
  183. }
  184.  
  185. redraw = () => {
  186. if(this.state.redraws === 0){alert('asdf'); return;}
  187. this.setState(prevState =>({
  188. randomNumbersOfStars: Game.randomNumber(),
  189. answerIsCorrect: null,
  190. selectedNumbers: [],
  191. redraws: prevState.redraws -1
  192. }), this.updateDoneStatus);
  193. }
  194.  
  195. possibleSolutions = ({randomNumberOfStars, usedNumbers}) => {
  196. const possibleNumbers = _.range(1,10).filter(number =>
  197. usedNumbers.indexOf(number) === -1
  198. );
  199.  
  200. return possibleCombinationSum(possibleNumbers, randomNumberOfStars);
  201. };
  202.  
  203. updateDoneStatus = () =>{
  204. this.setState(prevState =>{
  205. if(prevState.usedNumbers.length === 9){
  206. return {doneStatus: 'You Won!'}
  207. }
  208. if(prevState.redraws === 0 && !this.possibleSolutions(prevState)){
  209. return{ doneStatus: 'GameOver!'}
  210. }
  211. })
  212. }
  213.  
  214. reset = () => {
  215. this.setState({
  216. selectedNumbers : [],
  217. usedNumbers: [],
  218. randomNumbersOfStars: Game.randomNumber(),
  219. answerIsCorrect: null,
  220. redraws: 5,
  221. doneStatus: null
  222. })
  223.  
  224. }
  225. render(){
  226. const { selectedNumbers, raandomNumberOfStars, answerIsCorrect, usedNumbers, redraws, doneStatus } = this.state;
  227.  
  228. return (
  229. <div className ="container">
  230. <h3> Play Nine</h3>
  231. <hr />
  232. <div className ="row">
  233. <Stars numberOfStars = {this.state.randomNumbersOfStars}/>
  234. <Button checkAnswer = {this.checkAnswer} selectedNumbers = {selectedNumbers} answerIsCorrect = {answerIsCorrect} acceptAnswer = {this.acceptAnswer} redraw = {this.redraw} redraws = {redraws}/>
  235. <Answer selectedNumbers = {selectedNumbers} unselectNumber ={this.unselectNumber} />
  236. </div>
  237. <br />
  238. {doneStatus ?
  239. <DoneFrame doneStatus={doneStatus} reset = {this.reset}/>:
  240. <Numbers selectedNumbers = {selectedNumbers} selectNumber = {this.selectNumber} usedNumbers = {usedNumbers}/>
  241. }
  242.  
  243.  
  244. </div>
  245. )
  246. }
  247. }
  248.  
  249.  
  250.  
  251. class App extends React.Component {
  252. render(){
  253. return(
  254. <div>
  255. <Game />
  256. </div>
  257. )
  258. }
  259. }
  260.  
  261. ReactDOM.render(<App />, mountNode);
Add Comment
Please, Sign In to add comment