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. 组件之间的通讯:vuex状态管理,state,getters,mutations,actons的简单使用(一)

    之前的文章中讲过,组件之间的通讯我们可以用$children.$parent.$refs.props.data... 但问题来了,假如项目特别大,组件之间的通讯可能会变得十分复杂... 这个时候了我们 ...

  2. JZ2440 裸机驱动 第12章 I2C接口

    本章目标: 了解I2C总线协议: 掌握S3C2410/S3C2440中I2C接口的使用方法: 12.1 I2C总线协议及硬件介绍 12.1.1 I2C总线协议 1 I2C总线的概念 2 I2C总线的信 ...

  3. 用C#实现C/S模式下软件自动在线升级

    用C#实现C/S模式下软件自动在线升级 1 前言 长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C/S结构的程序可维护性 ...

  4. 织梦dedecms模板制作时,循环递增autoindex使用方法整理

    文章转载:http://www.maihui123.com/dedecms/2012051964.html 织梦dedecms模板制作时,我们需要每循环一次,变量加一,这是就需要使用到autoinde ...

  5. BASIC-25_蓝桥杯_回形取数

    示例代码: #include <stdio.h>#define N 200 int main(void){ int num[N][N]; int i= 0, j = 0 , k = 0 , ...

  6. 过度使用DBLINK做系统集成会带来的问题

    过度使用DBLINK做系统集成会带来很多问题,问题主要由以下几点: 1. 大量消耗数据库资源: 本地系统每通过DBLINK链接远端系统一次,都会生成一个本地session,如本地session不退出或 ...

  7. Vcenter 和ESXi License过期解决办法

    Vcenter License过期解决办法 用client连接vcenter:  KEY必须用vCenter Server 5 Standard序列号如果使用使用的“vCenter Server 5 ...

  8. [UE4]混合动画以及Try Get Pawn Owner、Get Velocity、VectorLength的使用

    混合动画,可以混合个多动画之间的动画,多个动画相当于关键帧,关键帧之间可以生成混合出过度动画. 实时动态更新Speed参数. 知识点: 一.可以在蓝图中使用“Try Get Pawn Owner”取得 ...

  9. pandas的map函数与apply函数的区别

    import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(4,3),columns=list("ABC ...

  10. 【转】SQL模糊查询

    在进行数据库查询时,有完整查询和模糊查询之分. 一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: 1,% :表示任 ...