using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace SeqListSort
{
/// <summary>
/// <ather>
/// <lihonglin>
/// </ather>
/// <countent>
/// 2048游戏规则:
  ///开始时棋盘内随机出现两个数字,出现的数字仅可能为2或4
  ///玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动
  ///玩家选择的方向上若有相同的数字则合并,每次有效移动可以同时合并,但不可以连续合并
///合并所得的所有新生成数字相加即为该步的有效得分
  ///玩家选择的方向行或列前方有空格则出现位移
  ///每有效移动一步,棋盘的空位(无数字处)随机出现一个数字(依然可能为2或4)
  ///棋盘被数字填满,无法进行有效移动,判负,游戏结束
  ///棋盘上出现2048,判胜,游戏结束
/// </countent>
/// </summary>
//public struct Point
//{
// public int x;
// public int y;
// public Point(int _x, int _y)
// {
// this.x = _x;
// this.y = _y;
// }
//}
public enum DIR_TYPE
{
TOP,
LEFT,
RIGHT,
BOTTOM
}
class Game2048
{
const int n = ;
static int[,] map = new int[n,n];//定义棋盘
static int[] temp = new int[n+];//一个临时数组,存放十六个位置数据 static int score = ; static Stack<Point> fullCell = new Stack<Point>();//格子是否已满 这个暂时没有用到,愿意是用它来充当临时数组 public static void GameRandom()
{
Random r = new Random();
int x = ;
int y = ;
do
{
x = r.Next(, n);
y = r.Next(, n);
} while ( map[x,y] != );
Thread.Sleep();
if (r.Next(, n + ) % n == )
{
map[x,y] = ;
}
else
{
map[x, y] = ;
}
fullCell.Push(new Point(x, y));
}
public static void GameInit()
{
GameRandom();
GameRandom();
Display();
}
public static void Display()
{
Console.WriteLine("分数 = " + score);
for (int i = ; i < n; ++i)
{
for (int j = ; j < n; ++j)
{
Console.Write("{0,-6}" , map[i, j]);
}
Console.WriteLine();
}
GameOverOrWine();
}
public static void GameContral()
{
DIR_TYPE type = DIR_TYPE.TOP;
while (true)
{ Console.WriteLine("请按w、a、s、d键上下左右控制'0'键退出");
char ch = Convert.ToChar(Console.ReadLine());
if (ch == 'a'|| ch == 'A' || ch == 'W'|| ch == 'w' || ch == ''
|| ch == 'S'|| ch == 's' ||ch == 'D'|| ch == 'd' )
{
Console.Clear();
}
else
{
Console.WriteLine("按下非法键,请重新按!");
continue;
} switch (ch)
{
case '':
{
Console.WriteLine("是否退出游戏!(y/n)");
ch = Convert.ToChar(Console.ReadLine());
if (ch == 'y' || ch == 'Y')
{
Environment.Exit();
}
else
{
Console.Clear();
}
}
break;
case 'A':
case 'a':
{
type = DIR_TYPE.LEFT;
}
break;
case 'D':
case 'd':
{
type = DIR_TYPE.RIGHT;
}
break;
case 'W':
case 'w':
{
type = DIR_TYPE.TOP;
}
break;
case 'S':
case 's':
{
type = DIR_TYPE.BOTTOM;
}
break;
}
GameRun(type);
Display();
}
}
//玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动
public static int GameMove( )
{
int change = ;
int i = ;
int j = ;
do //去掉中间的0
{
for (i = ; i < n; ++i )
{
if ( == temp[i])//玩家选择的方向行或列前方有空格则出现位移
{
if (temp[i] != temp[i + ])//不相等移动
{
change = ;//有效移动
}
temp[i] = temp[i + ];
temp[i + ] = ;
}
}
j++;
} while (j < n); for (i = ; i < n; ++i )
{
//玩家选择的方向上若有相同的数字则合并,每次有效移动可以同时合并,但不可以连续合并
if (temp[i] == temp[i - ])//相同的数字则合并
{
if ( != temp[i])
{
change = ;
score += temp[i];
}
temp[i - ] += temp[i - ];//前一个数字乘自己
temp[i] = ;// 后一个位置 置0
} }
return change;
}
public static void GameOverOrWine()
{
int count = ;//记录格子里不为0 的个数
if (score >= << )
{
Console.WriteLine("您胜利了 88!");
Thread.Sleep();
Environment.Exit();
}
else
{
for (int i = ; i < n; ++i)
{
for (int j = ; j < n; ++j)
{
if ( map[i,j] != )
{
count++;
if ( count == n * n )
{
Console.WriteLine("game over");
Thread.Sleep();
Environment.Exit();
}
}
if ( map[i,j] >= )
{
Console.WriteLine("您胜利了 88!");
Thread.Sleep();
//Environment.Exit(0);
}
}
}
} }
public static void GameRun(DIR_TYPE type)
{ int i = ;
int j = ;
int change = ;/*判断格子中的数是否改变,0不变*/ if (type == DIR_TYPE.LEFT || type == DIR_TYPE.RIGHT)
{
for (i = ; i < n; ++i)
{
for (j = ; j < n; ++j)
{
if (type == DIR_TYPE.LEFT)
{
temp[j] = map[i, j];//把每一行数据放到临时数组中
}
else
{
temp[j] = map[i, - j];
}
}
//temp[4] = 0; change += GameMove();//处理每一行数据,进行移除中间的0,合并相同数字,根据change的值可以产生随机数 for (j = ; j < n; ++j)
{
if (type == DIR_TYPE.LEFT)
{
map[i, j] = temp[j];// 把每一行处理完的数据在放回到地图中
}
else
{
map[i, - j] = temp[j];
}
}
}
}
else
{ for (i = ; i < n; ++i)
{
for (j = ; j < n; ++j)
{ if (type == DIR_TYPE.TOP)
{
temp[j] = map[j, i];//把每一列数据存进去
}
else if (type == DIR_TYPE.BOTTOM)
{
temp[j] = map[ - j, i];
} }
temp[] = ;
change += GameMove(); for (j = ; j < n; ++j)
{
if (type == DIR_TYPE.TOP)
{
map[j, i] = temp[j]; //把处理好的中间变量移回来
}
else if (type == DIR_TYPE.BOTTOM)
{
map[ - j, i] = temp[j];
}
}
}
} if (change > )
{
GameRandom();
}
}
}
}

Game2048的更多相关文章

  1. 软件工程(FZU2015)赛季得分榜,第10回合(alpha冲刺)

    目录 第一回合 第二回合 第三回合 第四回合 第五回合 第6回合 第7回合 第8回合 第9回合 第10回合 第11回合 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分 ...

  2. 软件工程(FZU2015)赛季得分榜,第11回合(beta冲刺+SE总结)

    目录 第一回合 第二回合 第三回合 第四回合 第五回合 第6回合 第7回合 第8回合 第9回合 第10回合 第11回合 增补作业 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分:b ...

  3. Cocos2d-x 3.2 学习笔记(十一)Game 2048

    一.规则 游戏2048的规则很简单 2+2=4  4+4=8 8+8=16 16+16=32 ……1024+1024=2048 这游戏挺火的……不过做起来也不难,就用cocos2dx做一下,首先我也没 ...

  4. Android项目开发实战-2048游戏

    <2048>是一款比较流行的数字游戏,最早于2014年3月20日发行.原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台.这款游戏是基于&l ...

  5. Android 之 2048 的游戏逻辑分析

    继续学习了极客学院的实战路径课程,讲到了2048游戏的编写过程,我在这里作个总结分享给大家(结果会附源代码和我改写后的代码): 这里主要包括两个方面:1.2048界面的绘制   2.2048算法逻辑的 ...

  6. android 之 adb 启动问题的一般解决办法

    有时,当我们打开eclipse准备运行Android项目时,虚拟机会启动不了,并且会出现下面的报错. [2015-10-07 16:47:46 - Game2048] ---------------- ...

  7. 最少javascript代码完成一个2048游戏

    原生javascript代码写的2048游戏.建议在谷歌浏览器下跑.'WASD'控制方向.演示地址请移步:http://runjs.cn/detail/bp8baf8b 直接贴代码~ html: &l ...

  8. Andorid游戏2048开发(一)

    最近有一款Android平台下的游戏很是火爆----2048.下面记录一下开发过程.由于笔者是Android开发的初学者,所以希望借以此文熟悉整个Android开发的流程. 首先创建Game2048的 ...

  9. Android(java)学习笔记181:利用Service在后台播放背景音乐

    1.在android应用程序里,有一种没有UI的类(android.app.Service)——Service.简单来说,Service是一个 background process(背景程序),通过背 ...

随机推荐

  1. 从windows到linux的shell脚本编码和格式问题

    从windows到linux的shell脚本编码和格式问题   从windows到Linux的shell脚本编码和格式问题 1.异常问题 :set ff=unix 启动脚本在启动时报错比如执行sh s ...

  2. arcgis desktop can not connect to previous version of license manager

    解决方法:  license manager以 管理员身份运行.

  3. 获取post发送过来的xml包

     if (Request.HttpMethod.ToLower() == "post") { byte[] ar; ar = new byte[this.Request.Input ...

  4. Django Model基础 ORM

    ORM 对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的 ...

  5. python学习笔记--装饰器

    1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来 ...

  6. ES之七:配置文件详解

    安装流程 http://www.elasticsearch.org/overview/elkdownloads/下载对应系统的安装包(我下载的是tar的),下载解压以后运行es根目录下bin目录的el ...

  7. jenkins持续集成3

    1.安装Pipeline插件,并初识 1.启动Jenkins,打开浏览器http://localhost:8080,系统管理,用户名:chenshanju/123456 2.系统管理-插件管理,安装p ...

  8. javascript控制滚动条的位置,获取控件的位置

    一.如下是定位鼠标在视窗中的位置,先定位视窗和页面直接的距离. function getMousePoint() { var point = {x:0,y:0}; // 如果浏览器支持 pageYOf ...

  9. keras中调用tensorboard:from keras.callbacks import TensorBoard

    from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn ...

  10. ZooKeeper系列(2) 安装部署 (转)

    原文地址:http://www.cnblogs.com/wuxl360/p/5817489.html 一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模 ...