C#,JavaScript两种语言 2048小游戏
<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位,每列依次向左进行合并,且每列只能合并 ...
随机推荐
- 安装DELL R430服务器的过程记录
序: 本次需要安装一个ineedle设备给客户用,貌似客户是华三.这次领导比较重视,下血本买了一台DELL服务器,似乎花费了1万多大洋.当然配置是比较高了,CPU:Intel(R) Xeon(R) C ...
- 009.CentOS 6.7安装运行netmap
一.netmap简介: 1.netmap是一个高性能收发原始数据包的框架,由Luigi Rizzo等人开发完成,其包含了内核模块以及用户态库函数.其目标是,不修改现有操作系统软件以及不需要特殊硬件支持 ...
- 仿哔哩哔哩应用客户端Android版源码项目
这是一款高仿哔哩哔哩安卓客户端,跟官方网的差不多吧,界面也几乎是一样的,应用里面也加了一些弹出广告,大家可以参考一下吧,安装测试包在源码文件那里,大家可以多多参考一下. 哔哩哔哩弹幕网是国内知名的弹幕 ...
- 天朝使用GAE入门指南
0. 引言 Across the Great Wall, we can reach every corner in the world. 洒家最近玩了几下 Google App Engine.由于众所 ...
- 【转】XPath 示例
XPath 示例 其他版本 本主题回顾整个 XPath 参考中出现的语法示例. 所有示例均基于 XPath 语法的示例 XML 文件 (inventory.xml). 有关在测试文件中使用 X ...
- VS2010最常用快捷键
1.选择类 F8 当前位置变成选定区域的头/尾(再移动光标或者点鼠标就会选定) Ctrl + F8 当前行变成选定区域的头/尾(再移动上下光标或者点鼠标就会选定多行) CTRL + W 选择当前单词 ...
- javaScript事件(五)事件类型之鼠标事件
一.事件 二.事件流 以上内容见:javaScript事件(一)事件流 三.事件处理程序 四.IE事件处理程序 以上内容见javaScript事件(二)事件处理程序 五.事件对象 以上内容见javaS ...
- MMORPG大型游戏设计与开发(客户端架构 part1 of vegine)
重写有些核心接口的时候,其实遇到了许多的问题,甚至一度的想过要放弃,但是最终还是坚持了下来.在客户端提供的这些接口中,可以清晰的看到客户端所依赖的各种模块的支持,以及各自之间的一些关联.下面只是介绍了 ...
- ZBrush中文版ZBrushCore震撼来袭
北京时间2016年9月30日,Pixologic公司召开新闻发布会,宣布ZBrush精简版ZBrushCore正式发布.该版本不仅支持中文,还支持多国语言,包括法语.西班牙语等.简单点来说,ZBrus ...
- JAVA中遇到 UTF-八 序列的字节 1 无效
UTF-8 序列的字节 1 无效用dom4j操作xml文件, 出现了这个错误.原因是xml文件被创建的时候是ansi码格式. ( UTF-8 序列的字节 1 无效用dom4j操作xml文件, 出现 ...