<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. For循环案例---九九乘法表

    概述:先创建一个Print99类,类中创建5个方法,分别为Test9901.Test9902.Test9903.Test9904.Test9905,分别打印出不同形状的九九乘法表,该类创建完成后再创建 ...

  2. 为opencv贡献代码

    本文记录本人从发现bug,提交bug,到修复bug的过程.下面enjoy: 1.发现bug 由于项目需要,开发了一个视频检测demo,类似于扫一扫二维码的程序,不过不是这个程序不是扫二维码.具体实现参 ...

  3. 2016"百度之星" - 初赛(Astar Round2B)

    Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在 ...

  4. 小机房的树 codevs 2370

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 小机房有棵焕狗种的树 ...

  5. 持久化存储——偏好设置,plist,归档---学习笔记二

    //一. 本地持久化 //1.沙盒 //1.1 应用程序包:存放的是应用程序的源文件,包括资源文件和可执行文件 NSString *path = [[NSBundle mainBundle]bundl ...

  6. 小Y的棋盘问题 题解

    有一个n*m的棋盘,上面有一些棋子,每行每列最多只会有一个棋子,不会有两个棋子八连通.问随机一个空格子作为起点,再随机地选择一个空格子作为终点,求问不经过任意棋子最短路的期望长度是多少.多组,n,m& ...

  7. sg函数与博弈论

    这个标题是不是看起来很厉害呢... 我们首先来看一个最简单的游戏.比如我现在有一堆石子,有p个,每次可以取走若干个(不能不取),不能取的人就输了. 现在假设有两个人要玩这个游戏,一个人先手,一个人后手 ...

  8. Javascript备忘复习笔记2

    一.函数与形参 1.函数 function abs(x) { if (x >= 0) { return x; } else { return -x; } } alert(abs(-10)); 2 ...

  9. PL/SQL Transaction Control

    PL/SQL 基础 ( 下 )   1. PL/SQL中的 SQL语句 - END语句与COMMIT等内容,没有任何关系. - PL/SQL does not directly support dat ...

  10. jquery 添加节点的几种方法介绍

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...