<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小游戏的更多相关文章

  1. 2048小游戏代码解析 C语言版

    2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图:  游 ...

  2. HTML+CSS+JavaScript实现2048小游戏

    相信很多人都玩过2048小游戏,规则易懂.操作简单,我曾经也“痴迷”于它,不到2048不罢休,最高成绩合成了4096,现在正好拿它来练练手. 我对于2048的实现,除了使用了现有2048小游戏的配色, ...

  3. 2048小游戏4X4C语言

    */ #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> v ...

  4. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

  5. Swift实战之2048小游戏

    上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...

  6. js、jQuery实现2048小游戏

    2048小游戏 一.游戏简介:  2048是一款休闲益智类的数字叠加小游戏 二. 游戏玩法: 在4*4的16宫格中,您可以选择上.下.左.右四个方向进行操作,数字会按方向移动,相邻的两个数字相同就会合 ...

  7. 【2048小游戏】——CSS/原生js爬坑之纯CSS模态对话框&游戏结束

    引言:2048小游戏的结束界面,使用纯CSS制作模态对话框,一般做模态对话框都会使用BootStrap自带的模态对话框组件方便使用,但在制作要运行在移动端的小项目时,就不能使用BootStrap,因为 ...

  8. 【2048小游戏】——原生js爬坑之遍历算法显示二维数组内容

    引言:做2048小游戏会将横纵方向的数字内容,存储在一个二维数组中,要将这个二维数组中的内容显示在页面上,就一定要用遍历算法来实现了. 一.二维数组存储    首先考虑用二维数组存储所有行数,列数   ...

  9. c#撸的控制台版2048小游戏

    1.分析 最近心血来潮,突然想写一个2048小游戏.于是搜索了一个在线2048玩玩,熟悉熟悉规则. 只谈核心规则:(以左移为例) 1.1合并 以行为单位,忽略0位,每列依次向左进行合并,且每列只能合并 ...

随机推荐

  1. 安装DELL R430服务器的过程记录

    序: 本次需要安装一个ineedle设备给客户用,貌似客户是华三.这次领导比较重视,下血本买了一台DELL服务器,似乎花费了1万多大洋.当然配置是比较高了,CPU:Intel(R) Xeon(R) C ...

  2. 009.CentOS 6.7安装运行netmap

    一.netmap简介: 1.netmap是一个高性能收发原始数据包的框架,由Luigi Rizzo等人开发完成,其包含了内核模块以及用户态库函数.其目标是,不修改现有操作系统软件以及不需要特殊硬件支持 ...

  3. 仿哔哩哔哩应用客户端Android版源码项目

    这是一款高仿哔哩哔哩安卓客户端,跟官方网的差不多吧,界面也几乎是一样的,应用里面也加了一些弹出广告,大家可以参考一下吧,安装测试包在源码文件那里,大家可以多多参考一下. 哔哩哔哩弹幕网是国内知名的弹幕 ...

  4. 天朝使用GAE入门指南

    0. 引言 Across the Great Wall, we can reach every corner in the world. 洒家最近玩了几下 Google App Engine.由于众所 ...

  5. 【转】XPath 示例

    XPath 示例   其他版本   本主题回顾整个 XPath 参考中出现的语法示例. 所有示例均基于 XPath 语法的示例 XML 文件 (inventory.xml). 有关在测试文件中使用 X ...

  6. VS2010最常用快捷键

    1.选择类 F8 当前位置变成选定区域的头/尾(再移动光标或者点鼠标就会选定) Ctrl + F8 当前行变成选定区域的头/尾(再移动上下光标或者点鼠标就会选定多行) CTRL + W 选择当前单词 ...

  7. javaScript事件(五)事件类型之鼠标事件

    一.事件 二.事件流 以上内容见:javaScript事件(一)事件流 三.事件处理程序 四.IE事件处理程序 以上内容见javaScript事件(二)事件处理程序 五.事件对象 以上内容见javaS ...

  8. MMORPG大型游戏设计与开发(客户端架构 part1 of vegine)

    重写有些核心接口的时候,其实遇到了许多的问题,甚至一度的想过要放弃,但是最终还是坚持了下来.在客户端提供的这些接口中,可以清晰的看到客户端所依赖的各种模块的支持,以及各自之间的一些关联.下面只是介绍了 ...

  9. ZBrush中文版ZBrushCore震撼来袭

    北京时间2016年9月30日,Pixologic公司召开新闻发布会,宣布ZBrush精简版ZBrushCore正式发布.该版本不仅支持中文,还支持多国语言,包括法语.西班牙语等.简单点来说,ZBrus ...

  10. JAVA中遇到 UTF-八 序列的字节 1 无效

    UTF-8 序列的字节 1 无效用dom4j操作xml文件, 出现了这个错误.原因是xml文件被创建的时候是ansi码格式. (   UTF-8 序列的字节 1 无效用dom4j操作xml文件, 出现 ...