经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
JS原生2048小游戏源码分享
来源:cnblogs  作者:林恒  时间:2021/5/6 17:56:34  对本文有异议

最近在学习算法方面的知识,看到了一个由算法主导的小游戏,这里给大家分享下代码:

效果:

代码:

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta name="viewport" content="width=360px,user-scalable=no" />
  4. <title>2048小游戏</title>
  5. <style>
  6. body,h1,div,table,tr,td{
  7. margin: 0px;
  8. padding: 0px;
  9. }
  10. body{
  11. background-color: rgb(0,0,0);
  12. }
  13. h1{
  14. margin: 36px auto;
  15. text-align: center;
  16. color: rgba(255,255,255,0.7);
  17. font-family: "楷体";
  18. font-size: 48px;
  19. text-shadow: 1px 2px 3px rgb(134,134,134);
  20. }
  21. div{
  22. margin: 12px auto;
  23. line-height: 60px;
  24. }
  25. #box{
  26. margin-top: -24px;
  27. width: 240px;
  28. height: 60px;
  29. text-align: center;
  30. font-weight: bold;
  31. color: rgb(255,255,255);
  32. }
  33. #box input{
  34. border: 3px solid rgb(255,255,255);
  35. border-radius: 4px;
  36. box-shadow: 1px 2px 3px rgb(234,234,234);
  37. }
  38. #box input:focus{
  39. outline-style: none;
  40. }
  41. table{
  42. margin: 24px auto;
  43. border: 3px solid rgb(255,255,255);
  44. border-radius: 6px;
  45. }
  46. #random,td{
  47. width: 60px;
  48. height: 60px;
  49. border: 2px solid rgb(255,255,255);
  50. border-radius: 18px;
  51. text-align: center;
  52. font-weight: bold;
  53. color: rgb(255,255,255);
  54. }
  55. td:hover{
  56. cursor: pointer;
  57. }
  58. </style>
  59. </head>
  60. <body>
  61. <h1>2 0 4 8</h1>
  62. <!-- 显示得分及新游戏按钮 -->
  63. <div id="box">
  64. 得分: <span id="span">0</span>
  65.         
  66. <input id="but" type="button" value="新游戏" />
  67. </div>
  68. <!-- 显示随机数 -->
  69. <div id="random"></div>
  70. <!-- 游戏主要布局 -->
  71. <table border="3px">
  72. <tr>
  73. <td></td>
  74. <td></td>
  75. <td></td>
  76. <td></td>
  77. </tr>
  78. <tr>
  79. <td></td>
  80. <td></td>
  81. <td></td>
  82. <td></td>
  83. </tr>
  84. <tr>
  85. <td></td>
  86. <td></td>
  87. <td></td>
  88. <td></td>
  89. </tr>
  90. <tr>
  91. <td></td>
  92. <td></td>
  93. <td></td>
  94. <td></td>
  95. </tr>
  96. </table>
  97. </body>
  98. <script type="text/javascript">
  99. var span = document.getElementById("span");
  100. var but = document.getElementById("but");
  101. var td = document.getElementsByTagName("td");
  102. //定义得分
  103. var score = 0;
  104. //定义随机数
  105. var random = document.getElementById("random");
  106. var showNums = [2,4,8,16,32,64,128,256,512,1024];
  107. var showNum = 0;
  108. //定义背景色数组
  109. var colors = ["rgb(255, 169, 182)","rgb(108, 251, 104)","rgb(255, 150, 46)","rgb(255, 121, 46)","rgb(255, 217, 46)",
  110. "rgb(46, 200, 255)","rgb(46, 113, 255)","rgb(240, 46, 255)","rgb(46, 255, 175)","rgb(153, 134, 255)"];
  111. //初始化程序,生成随机数
  112. /* start */
  113. function init(){
  114. var max = maxNum();
  115. var num = 0;
  116. for(var i=4;i > 0;i++){
  117. if(max < Math.pow(2,i+1)){
  118. num = parseInt(Math.random()*i);
  119. break;
  120. }else if(max < 2048){
  121. continue;
  122. }else{
  123. num = parseInt(Math.random()*showNums.length);
  124. break;
  125. }
  126. }
  127. random.innerHTML = showNums[num];
  128. color(random);
  129. showNum = showNums[num];
  130. }
  131. init();
  132. /* end */
  133. //获取棋盘中的最大值
  134. /* start */
  135. function maxNum(){
  136. var max = 0;
  137. for(var i=0;i<td.length;i++){
  138. if(td[i].innerHTML == ""){
  139. max = max;
  140. }else{
  141. if(parseInt(td[i].innerHTML) > max){
  142. max = parseInt(td[i].innerHTML);
  143. }else{
  144. max = max;
  145. }
  146. }
  147. }
  148. return max;
  149. }
  150. /* end */
  151. //根据数字显示背景颜色
  152. /* start */
  153. function color(obj){
  154. for(var i=0;i < colors.length;i++){
  155. if(obj.innerHTML == Math.pow(2,i+1)){
  156. obj.style = "background-color: "+colors[i]+";";
  157. break;
  158. }
  159. }
  160. }
  161. /* end */
  162. //合并算法
  163. /* start */
  164. function offsetTop(obj,index){//合并上
  165. if(index > 3){
  166. if(td[(index-4)].innerHTML == obj.innerHTML){
  167. td[(index-4)].innerHTML = "";
  168. td[(index-4)].style = "background-color: rgba(0, 0, 0, 0);";
  169. return true;
  170. }
  171. }
  172. return false;
  173. }
  174. function offsetBottom(obj,index){//合并下
  175. if(index < 12){
  176. if(td[(index+4)].innerHTML == obj.innerHTML){
  177. td[(index+4)].innerHTML = "";
  178. td[(index+4)].style = "background-color: rgba(0, 0, 0, 0);";
  179. return true;
  180. }
  181. }
  182. return false;
  183. }
  184. function offsetLeft(obj,index){//合并左
  185. if(index!=0 && index!=4 && index!=8 && index!=12){
  186. if(td[(index-1)].innerHTML == obj.innerHTML){
  187. td[(index-1)].innerHTML = "";
  188. td[(index-1)].style = "background-color: rgba(0, 0, 0, 0);";
  189. return true;
  190. }
  191. }
  192. return false;
  193. }
  194. function offsetRight(obj,index){//合并右
  195. if(index!=3 && index!=7 && index!=11 && index!=15){
  196. if(td[(index+1)].innerHTML == obj.innerHTML){
  197. td[(index+1)].innerHTML = "";
  198. td[(index+1)].style = "background-color: rgba(0, 0, 0, 0);";
  199. return true;
  200. }
  201. }
  202. return false;
  203. }
  204. /* end */
  205. //判断单元格是否合并
  206. /* start */
  207. function merge(obj,index){
  208. if(offsetTop(obj,index)){
  209. if(offsetBottom(obj,index)){
  210. if(offsetLeft(obj,index)){
  211. if(offsetRight(obj,index)){
  212. obj.innerHTML = parseInt(obj.innerHTML)*2;//合并上、下、左、右
  213. score += 16;
  214. merge(obj,index);
  215. }else{
  216. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并上、下、左
  217. score += 8;
  218. merge(obj,index);
  219. }
  220. }else if(offsetRight(obj,index)){
  221. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并上、下、右
  222. score += 8;
  223. merge(obj,index);
  224. }else{
  225. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并上、下
  226. score += 4;
  227. merge(obj,index);
  228. }
  229. }else if(offsetLeft(obj,index)){
  230. if(offsetRight(obj,index)){
  231. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并上、左、右
  232. score += 8;
  233. merge(obj,index);
  234. }else{
  235. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并上、左
  236. score += 4;
  237. merge(obj,index);
  238. }
  239. }else if(offsetRight(obj,index)){
  240. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并上、右
  241. score += 4;
  242. merge(obj,index);
  243. }else{
  244. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并上
  245. score += 2;
  246. merge(obj,index);
  247. }
  248. }else if(offsetBottom(obj,index)){
  249. if(offsetLeft(obj,index)){
  250. if(offsetRight(obj,index)){
  251. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并下、左、右
  252. score += 8;
  253. merge(obj,index);
  254. }else{
  255. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并下、左
  256. score += 4;
  257. merge(obj,index);
  258. }
  259. }else if(offsetRight(obj,index)){
  260. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并下、右
  261. score += 4;
  262. merge(obj,index);
  263. }else{
  264. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并下
  265. score += 2;
  266. merge(obj,index);
  267. }
  268. }else if(offsetLeft(obj,index)){
  269. if(offsetRight(obj,index)){
  270. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并左、右
  271. score += 4;
  272. merge(obj,index);
  273. }else{
  274. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并左
  275. score += 2;
  276. merge(obj,index);
  277. }
  278. }else if(offsetRight(obj,index)){
  279. obj.innerHTML = parseInt(obj.innerHTML)*2;//仅合并右
  280. score += 2;
  281. merge(obj,index);
  282. }
  283. }
  284. /* end */
  285. //main
  286. /* start */
  287. function gameOver(){
  288. for(var i=0;i<td.length;i++){
  289. if(td[i].innerHTML == ""){
  290. break;
  291. }
  292. if(i == 15){
  293. alert("很遗憾!本局游戏结束。。。");
  294. }
  295. }
  296. }
  297. /* end */
  298. //main
  299. /* start */
  300. (function(){
  301. for(var i=0;i<td.length;i++){
  302. var choose = td[i];
  303. choose.index = i;
  304. choose.onclick = function(){
  305. if(this.innerHTML == ""){
  306. this.innerHTML = showNum;
  307. merge(this,this.index);
  308. if(this.innerHTML >= 2048){
  309. this.innerHTML = "";
  310. this.style = "background-color: rgba(0, 0, 0, 0);";
  311. }
  312. color(this);
  313. init();
  314. }
  315. updateScore();
  316. gameOver();
  317. }
  318. }
  319. })();
  320. /* end */
  321. //更新得分
  322. /* start */
  323. function updateScore(){
  324. if(score > 500){
  325. span.style = "color: rgb(255,0,0)";
  326. }else if(score > 100){
  327. span.style = "color: rgb(255,0,255)";
  328. }else if(score > 50){
  329. span.style = "color: rgb(255,255,0)";
  330. }else if(score > 20){
  331. span.style = "color: rgb(0,0,255)";
  332. }else if(score > 10){
  333. span.style = "color: rgb(0,255,0)";
  334. }
  335. span.innerHTML = score;
  336. }
  337. /* end */
  338. //新游戏
  339. /* start */
  340. but.onclick = function(){
  341. location.reload();
  342. }
  343. /* end */
  344. </script>
  345. </html>

原文链接:http://www.cnblogs.com/smileZAZ/p/14722401.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号