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. Python 中的sort()排序

    v = [1, 3, 5, 2, 4, 6] v.sort() print(v) # [1, 2, 3, 4, 5, 6] v2 = [(1, 2), (2, 2), (2, 3), (3, 1)] ...

  2. python格式化输出 format

    看图

  3. C++ 常用函数方法

    /* * 拆分字符串 * 参数: * strData 字符串 * split 分隔符 * 返回: * 返回动态数组std::vector<std::string> ,记得要delete 内 ...

  4. git 命令行 修改文件 并push(阿里云)

    ==============安装git后的准备https://code.aliyun.com/profile/keyshttps://code.aliyun.com/help/ssh/README = ...

  5. 【Spring学习笔记-MVC-1.0】Spring MVC架构介绍

    作者:ssslinppp       1. 核心架构图 2. 核心架构的具体流程步骤 3. 具体的核心开发步骤 4. 常用注解 5. <mvc:annotation-driven>配置 6 ...

  6. Jmeter 问题集

    1.配置分布式,调度机(master) 看不到 执行机(slave). 原因: slave是放在一个交换机下面,然后在这个交换机下面又接了个路由器,control连的这个路由器 解决: CONTROL ...

  7. app定位器带xpath的 uiautomatorviewer

    参考文档:http://blog.csdn.net/kaka1121/article/details/53301517 在写脚本的过程中,总是遇到标签没有ID或者name等类似的唯一识别属性,为了能识 ...

  8. 对话框(VC_Win32)

    资源描述表中对话框定义 格式: 对话框名 DIALOG[载入特性] X,Y,Width,Height[设置选项] { 对话框控件定义; } 说明: 对话框名称: 标识对话框资源,可为一个字符串也可以为 ...

  9. win10下多版本apache(2.2,2.4)+php(5.3.5,5.5.37,5.6.25,7.0.8)注意点

    1.Loaded Configuration File 问题: apache2.2 httpd PHPIniDir D:\php5.3.5\php.ini AddType application/x- ...

  10. RAID5---块,条带,校验,旋转,同步/异

    冗余(奇偶校验)块:RAID5中在同一个条带中用一个块来存放冗余信息,冗余信息示其他块的"异或"值,这样在同一条带中就只有(n-1)个块是实际的数据,所以RAID5中阵列容量是(n ...