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. 查看 linux cpu 、内存、服务器型号和序列号、磁盘、raid 的信息

    yum -y install dmidecode 查看cpu的型号: 查看cpu的颗数:dmidecode -t processor |grep "Version"dmidecod ...

  2. Windows Phone 的这几年

    Windows Phone 从2010年10月发布,到如今已经有3年多了.从那时坚持到现在的用户和开发者一定感慨很多吧. 一直关注着这个让人既爱又恨的平台的发展,笔者不仅是使用者,也同时是开发者,这里 ...

  3. c#操作xml的代码(插入节点、修改节点、删除节点等)

    bookstore.xml文件内容: 复制代码代码示例: <?xml version="1.0" encoding="gb2312"?><bo ...

  4. Log4j2的基本使用

    Log4j2是Log4j1.x的的升级版,其中也有很大的不同,最大的区别就是由以前的properties配置文件改为xml/json/yaml配置文件. 其中配置文件的位置官方说明如下: Log4j ...

  5. jquey XMLHttpRequest cannot load url.Origin null is not allowed by Access-Control-Allow-Origin

    此篇文章原文地址:http://blog.csdn.net/wangsky2/article/details/22961345 正文: 原文地址:http://stackoverflow.com/qu ...

  6. bravado哺乳内衣适合试穿体验,分享给需要买哺乳内衣的妈妈们。

    看来看去还是觉得在美德乐天猫旗舰店(www.bravadobravado.com)购买最保险. 这款内衣穿起来非常舒服,感觉一点都不勒,而且面料也很透气,我生宝宝之前怀孕的时候穿80C,这个本来一开始 ...

  7. Hive基础之Hive环境搭建

    Hive默认元数据信息存储在Derby里,Derby内置的关系型数据库.单Session的(只支持单客户端连接,两个客户端连接过去会报错): Hive支持将元数据存储在关系型数据库中,比如:Mysql ...

  8. ajax控制页面跳转

    一开始我是这么写的,一直报错,跳转路径解析不了,显示为问号: 前台html: <form> <table style="margin: 200px auto;"& ...

  9. 解决Visual Studio “无法导入以下密钥文件”的错误

    错误1无法导入以下密钥文件: Common.pfx.该密钥文件可能受密码保护.若要更正此问题,请尝试再次导入证书,或手动将证书安装到具有以下密钥容器名称的强名称 CSP: VS_KEY_ 1110Co ...

  10. IPv4选项

    IPv4数据报的首部由固定首部(20字节)和可变部分组成(40字节).选项可用于网络的测试和排错. 1:选项的组成(TLV:type-length-value) 1.1:一个字节的类型字段. 1.1. ...