Advertisement
tasuku

webgame

Sep 12th, 2011
417
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.76 KB | None | 0 0
  1. import QtQuick 1.1
  2. import QtWebKit 1.0
  3.  
  4. Rectangle {
  5. id: root
  6. width: 500
  7. height: 500
  8.  
  9. WebView {
  10. id: webView
  11. anchors.fill: parent
  12. url: "http://gdd-2011-quiz-japan.appspot.com/webgame/problem"
  13.  
  14. // カードの枚数
  15. property int length: -1
  16. // カードの色の配列
  17. property variant cards: []
  18.  
  19. onLoadFinished: {
  20. // ログインとかの処理が終わって以下の url が表示されたら全ての色を調べるモードへ移行
  21. if (url == "http://gdd-2011-quiz-japan.appspot.com/webgame/problem") {
  22. webView.length = -1;
  23. webView.cards = new Array();
  24. state = "check";
  25. }
  26. }
  27.  
  28. Timer {
  29. repeat: true
  30. running: true
  31. interval: 1000 * 60 * 60
  32. onTriggered: {
  33. // たまにネットワークやタイミングの問題などで止まるので
  34. // 定期的にリセット
  35. webView.reload.trigger();
  36. }
  37. }
  38.  
  39. Timer {
  40. id: checkTimer
  41. repeat: true
  42. interval: 100
  43. onTriggered: {
  44. // 全ての色をチェック
  45. if (webView.length == -1) {
  46. // カードの数を取得
  47. webView.length = webView.evaluateJavaScript('document.getElementsByTagName("td").length');
  48. }
  49.  
  50. // 全ての色を取得していなかったら
  51. if (webView.cards.length < webView.length) {
  52. var index = webView.cards.length;
  53. for (var i = 0; i < 2; i++) {
  54. // 2枚めくる
  55. var js = 'conc.flip(' + (index + i) + ');';
  56. webView.evaluateJavaScript(js);
  57. }
  58. for (var i = 0; i < 2; i++) {
  59. // カードの CSS から色を取得
  60. var js = 'document.getElementById("card' + (index + i) + '").style.cssText;';
  61. var cssText = webView.evaluateJavaScript(js);
  62. if (cssText.match(/^background\-color: rgb\([0-9]+, [0-9]+, [0-9]+\);/)) {
  63. var cards = webView.cards;
  64. // 実際は色の部分だけではなく CSS 全体を保存してたり
  65. cards.push(cssText);
  66. webView.cards = cards;
  67. } else {
  68. console.debug("doesn't match", cssText);
  69. }
  70. }
  71. } else {
  72. // 全ての色の取得が終わっていたら問題を解くモードへ移行
  73. webView.state = "solve"
  74. }
  75. }
  76. }
  77.  
  78. Timer {
  79. id: solveTimer
  80. repeat: true
  81. interval: 100
  82. onTriggered: {
  83. // 全てのカードを調べて
  84. for (var i = 0; i < webView.length; i++) {
  85. var js = 'document.getElementById("card' + i + '").style.cssText';
  86. // カードの色がなかったら
  87. if(webView.evaluateJavaScript(js) == "") {
  88. // ひっくり返す
  89. js = 'conc.flip(' + i + ');';
  90. webView.evaluateJavaScript(js);
  91.  
  92. // i 番目と同じ色のカードを探す
  93. for (var j = i + 1; j < webView.length; j++) {
  94. if (webView.cards[i] == webView.cards[j]) {
  95. // 見つけたらひっくり返す
  96. js = 'conc.flip(' + j + ');';
  97. webView.evaluateJavaScript(js);
  98.  
  99. // 他にカードの色がないのがないかチェック(超手抜き!)
  100. for (var k = i; k < webView.length; k++) {
  101. var js = 'document.getElementById("card' + k + '").style.cssText';
  102. if(webView.evaluateJavaScript(js) == "") {
  103. // あったら続行
  104. return;
  105. }
  106. }
  107. // なかったら解決したモードへ
  108. webView.state = "solved";
  109. }
  110. }
  111. }
  112. }
  113.  
  114. }
  115. }
  116.  
  117. Timer {
  118. id: solvedTimer
  119. repeat: false
  120. interval: 15000
  121. onTriggered: {
  122. // 次の問題の準備が整うまで 15 秒くらい待ってからスタート
  123. webView.length = -1;
  124. webView.cards = new Array();
  125. webView.state = "check"
  126. }
  127. }
  128.  
  129. onStateChanged: console.debug("state", state)
  130. states: [
  131. State {
  132. name: "check"
  133. PropertyChanges {
  134. target: checkTimer
  135. running: true
  136. }
  137. },
  138. State {
  139. name: "solve"
  140. PropertyChanges {
  141. target: solveTimer
  142. running: true
  143. }
  144. },
  145. State {
  146. name: "solved"
  147. PropertyChanges {
  148. target: solvedTimer
  149. running: true
  150. }
  151. }
  152. ]
  153. }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement