<html> <head> <style type="text/css"> .haha { border-width: 2; font-size: 50; font-weight: bold; color: white; background-color: grey; text-align: center; overflow: hidden; } </style> </head> <script> var a = new Array(16); clear(); produce(); init(); draw(); onkeydown = keyDown; function clear(){ for(var i=0;i<16;i++)a[i]=0; } function down() { turnClockwise(); left(); turnClockwise(); turnClockwise(); turnClockwise(); } function up() { turnClockwise(); turnClockwise(); turnClockwise(); left(); turnClockwise(); } function right() { turnClockwise(); turnClockwise(); left(); turnClockwise(); turnClockwise(); } function left() { for (var i = 0; i < 4; i++) { var k = 0; var merge = false; for (var j = 0; j < 4; j++) { if (a[i * 4 + j] != 0) { if (k > 0 && !merge && a[i * 4 + j] == a[i * 4 + k - 1]) { a[i * 4 + k - 1] *= 2; merge = true; } else { a[i * 4 + k++] = a[i * 4 + j]; } } } for (; k < 4; k++) a[i * 4 + k] = 0; } } function turnClockwise() { var b = new Array(16); for (var i = 0; i < 4; i++) { for (var j = 0; j < 4; j++) { b[j * 4 + 3 - i] = a[i * 4 + j]; } } a = b; } function keyDown(e) { var save = a.slice(0, a.length); switch (e.keyCode) { case 37: left(); break; case 38: up(); break; case 39: right(); break; case 40: down(); break; } if (over()) { alert('you died!'); clear(); produce(); draw(); } else if (moved(save, a)) { produce(); draw(); } } function moved(a, b) { for (var i = 0; i < 16; i++) if (a[i] != b[i]) return true; return false; } function over() { for (var i = 0; i < 16; i++) { if (a[i] == 0) return false; } for (var i = 0; i < 4; i++) { for (var j = 0; j < 3; j++) { if (a[i * 4 + j] == a[i * 4 + j + 1] || a[j * 4 + i + 4] == a[j * 4 + i]) { return false; } } } return true; } function produce() { var x; do { x = Math.floor(Math.random() * 16); } while (a[x] != 0); a[x] = Math.random() > 0.2 ? 2 : 4; } function draw() { for (var i = 0; i < 4; i++) { for (var j = 0; j < 4; j++) { var img = document.getElementById('pic' + (i * 4 + j)); img.innerHTML = a[i * 4 + j] == 0 ? "" : a[i * 4 + j]; img.style.color = (a[i * 4 + j] * 120) & 0xffffff; } } } function cout(s) { document.write(s); } function init() { cout("<table align='center'>"); for (var i = 0; i < 4; i++) { cout("<tr>"); for (var j = 0; j < 4; j++) { cout("<td width=150 height=150 class='haha' id=pic" + (i * 4 + j) + ">" + a[i * 4 + j] + "</td>"); } cout("</tr>"); } cout("</table>"); } </script> <html>
C# 版
需要创建2,4,8,16 ......4096 等很多张png图片,当然也可以直接更改一下本程序
using System; using System.Windows.Forms; using System.Drawing; class form : Form { public form() { ClientSize = new Size(640, 640); MaximizeBox = MinimizeBox = false; StartPosition = FormStartPosition.CenterScreen; FormBorderStyle = FormBorderStyle.None; Opacity = 0.8; Location = new Point(100, 0); KeyUp += press; Paint += init; } void press(object o, KeyEventArgs e) { e.Handled = true; switch (e.KeyCode) { case Keys.Up: up(); break; case Keys.Down: down(); break; case Keys.Left: left(); break; case Keys.Right: right(); break; case Keys.F1: text(); return; case Keys.Escape: lose(); break; default: return; } if (!moved && !over()) return; if (overflow()) { win(); return; } if (!produce()) { if (canMove()) return; lose(); return; } draw(); } bool canMove() { int i, j; for (i = 0; i < 4; i++) for (j = 0; j < 3;j++ ) if (a[i, j] == a[i, j + 1]||a[j,i]==a[j+1,i]) return true; return false; } void draw() { int i, j; int w = ClientSize.Width / 4, h = ClientSize.Height / 4; Bitmap bit = new Bitmap(ClientSize.Width, ClientSize.Height); Graphics.FromImage(bit).Clear(Color.AliceBlue); for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) Graphics.FromImage(bit).DrawImage(Image.FromFile(a[i, j]+".png"), new Rectangle(j* w, i * h, w - 2, h - 2)); CreateGraphics().DrawImage(bit,0,0); } static void Main() { Application.EnableVisualStyles(); Application.Run(new form()); } int[,] a = new int[4, 4]; bool moved; Random r = new Random(); void init(object o, EventArgs e)//编程时能不调用别的函数就尽量不要调用 //调用多了会忘记有没有调用,用许多个小函数累积起来更好 //集中调用小函数,不要总是调用 //一个函数一个功能 { int i, j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) a[i, j] = 0; produce(); draw(); } bool produce() {//每按一下键,就会产生一个新数字,这个新数字的位置是随机的 int[,] b = new int[16, 2];//用来存储空位,这些空位可以产生新数字 int i, j; int size = 0; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) { if (a[i, j] == 0) { b[size, 0] = i; b[size, 1] = j; size++; } } if (size == 0) return false;//如果没有空位了,游戏就结束了 i = r.Next() % size; if (r.Next() % 5 == 0) a[b[i, 0], b[i, 1]] = 4; else a[b[i, 0], b[i, 1]] = 2; return true; } void up() {//按下向上键时,需要对数字进行合并整理,这个函数是最重要的 moved = false; int i, j, k; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if(a[i,j]==0)continue; for (k = i; k > 0; k--) { if (a[k-1, j] != 0) break; a[k-1, j] = a[k, j]; a[k, j] = 0; moved = true; } } } for (j = 0; j < 4;j++ ) for (i = 3; i > 0; i--) { if (a[i, j] != 0 && a[i, j] == a[i - 1, j]) { a[i - 1, j] *= 2; a[i, j] = 0; moved = true; break; } } } void clockwise() {//将数组表示的4*4方格顺时针转90度.一会儿会有大用. int i, j; int[,] b = new int[4, 4]; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) b[i, j] = a[i, j]; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) a[i, j] = b[3 - j, i]; } void counterclockwise() {//将4*4方格逆时针转90度 clockwise(); clockwise(); clockwise(); } void upsidedown() {//将4*4方格旋转180度 clockwise(); clockwise(); } void down() {//向下调整可以转化为向上调整,这样做是以牺牲效率为代价去换取编程的简洁清晰 upsidedown(); up(); upsidedown(); } void left() { clockwise(); up(); counterclockwise(); } void right() { counterclockwise(); up(); clockwise(); } void win() { DialogResult o = new DialogResult(); o = MessageBox.Show("您胜利了,不用再玩了!", "result", MessageBoxButtons.RetryCancel); if (o == DialogResult.Retry) init(null, null); else Application.Exit(); } void lose() {//输了 DialogResult o = new DialogResult(); o = MessageBox.Show("您输了!", "result", MessageBoxButtons.RetryCancel); if (o == DialogResult.Retry) init(null, null); else Application.Exit(); } void text() { MessageBox.Show("The arrow represent up,down,left and right\n" + "Esc is quit\n" + "F1 is reading description text" + "\n\t\tmade by weidiao.neu", "help" ); } bool over() { int i, j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) if (a[i, j] == 0) return false; return true; } bool overflow() { int i, j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) if (a[i, j] > 4096) return true; return false; } }
C#,JavaScript两种语言 2048小游戏的更多相关文章
-
2048小游戏代码解析 C语言版
2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图: 游 ...
-
HTML+CSS+JavaScript实现2048小游戏
相信很多人都玩过2048小游戏,规则易懂.操作简单,我曾经也“痴迷”于它,不到2048不罢休,最高成绩合成了4096,现在正好拿它来练练手. 我对于2048的实现,除了使用了现有2048小游戏的配色, ...
-
2048小游戏4X4C语言
*/ #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> v ...
-
jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
-
Swift实战之2048小游戏
上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...
-
js、jQuery实现2048小游戏
2048小游戏 一.游戏简介: 2048是一款休闲益智类的数字叠加小游戏 二. 游戏玩法: 在4*4的16宫格中,您可以选择上.下.左.右四个方向进行操作,数字会按方向移动,相邻的两个数字相同就会合 ...
-
【2048小游戏】——CSS/原生js爬坑之纯CSS模态对话框&;游戏结束
引言:2048小游戏的结束界面,使用纯CSS制作模态对话框,一般做模态对话框都会使用BootStrap自带的模态对话框组件方便使用,但在制作要运行在移动端的小项目时,就不能使用BootStrap,因为 ...
-
【2048小游戏】——原生js爬坑之遍历算法显示二维数组内容
引言:做2048小游戏会将横纵方向的数字内容,存储在一个二维数组中,要将这个二维数组中的内容显示在页面上,就一定要用遍历算法来实现了. 一.二维数组存储 首先考虑用二维数组存储所有行数,列数 ...
-
c#撸的控制台版2048小游戏
1.分析 最近心血来潮,突然想写一个2048小游戏.于是搜索了一个在线2048玩玩,熟悉熟悉规则. 只谈核心规则:(以左移为例) 1.1合并 以行为单位,忽略0位,每列依次向左进行合并,且每列只能合并 ...
随机推荐
-
神秘代理-Proxy
前言: 代理模式作为常见的设计模式之一,在项目开发中不可或缺.本文就尝试着揭开代理的神秘面纱,也欢迎各路人批评指正! 1.如何实现代理: [假设有个关于汽车移动(move)的计时需求]设计:Movea ...
-
POJ 1185 炮兵
是中国标题.大家都说水问题.但是,良好的1A它? 标题效果: 给出n*m的矩阵,当某个单元格有炮兵部队时它的上下左右两格(不包含斜着的方向)是这支部队的攻击范围.问在两支部队之间不可能相互攻击到的情况 ...
-
SQLSERVER图片查看工具SQL Image Viewer5.5.0.156
原文:SQLSERVER图片查看工具SQL Image Viewer5.5.0.156 SQLSERVER图片查看工具SQL Image Viewer5.5.0.156 在2013年某一次北京SQL ...
-
mybatis以序列周期,同样处理的这个问题的价值
原因猜测缓存,由于代码是肯定没问题,但无论怎么查都一样值 <select id="querySeq" resultType="java.lang.Long" ...
-
Java8新特性-Lambda表达式
1. 什么是Lambda表达式? Lambda表达式就是可以把函数作为参数传递,或者说把代码作为数据传递给函数. 2. Lambda表达式的语法格式 基本语法格式如下: 基本语法下多个变体的说明: ...
-
win10 UWP 单元测试
我们在写代码的时候不能保证我们写出来的代码是正确的,所以我们经常要单元测试. 单元测试和重构都是在做完一个小小函数一般就要进行一次,越早做就越好,可以比较早发现问题,这时我们还记得我们写的内容,不过比 ...
-
编译原理 First,Follow,select集求法
参考:https://blog.csdn.net/CooperNiu/article/details/78524688
-
flask实现子域名
什么是子域名? 子域名,类似于xxx.douban.com的形式,如book.douban.com,music.douban.com,movie.douban.com等 用flask怎么实现子域名? ...
-
Redis 密码设置
如果不加密码,默认只能本机访问,加密码也是为了安全考虑 1.进入Redis 的安装目录,找到redis.conf文件.用vi命令打开文件 输入 / requirepass 进行查找,输入n查找下一个 ...
-
hand first python 选读(1)
列表(list) 基本操作 比如说我要整理一个近期热映的电影列表: movies = ["venom", "My Neighbor Totor", " ...