Game2048
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的更多相关文章
- 软件工程(FZU2015)赛季得分榜,第10回合(alpha冲刺)
目录 第一回合 第二回合 第三回合 第四回合 第五回合 第6回合 第7回合 第8回合 第9回合 第10回合 第11回合 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分 ...
- 软件工程(FZU2015)赛季得分榜,第11回合(beta冲刺+SE总结)
目录 第一回合 第二回合 第三回合 第四回合 第五回合 第6回合 第7回合 第8回合 第9回合 第10回合 第11回合 增补作业 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分:b ...
- Cocos2d-x 3.2 学习笔记(十一)Game 2048
一.规则 游戏2048的规则很简单 2+2=4 4+4=8 8+8=16 16+16=32 ……1024+1024=2048 这游戏挺火的……不过做起来也不难,就用cocos2dx做一下,首先我也没 ...
- Android项目开发实战-2048游戏
<2048>是一款比较流行的数字游戏,最早于2014年3月20日发行.原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台.这款游戏是基于&l ...
- Android 之 2048 的游戏逻辑分析
继续学习了极客学院的实战路径课程,讲到了2048游戏的编写过程,我在这里作个总结分享给大家(结果会附源代码和我改写后的代码): 这里主要包括两个方面:1.2048界面的绘制 2.2048算法逻辑的 ...
- android 之 adb 启动问题的一般解决办法
有时,当我们打开eclipse准备运行Android项目时,虚拟机会启动不了,并且会出现下面的报错. [2015-10-07 16:47:46 - Game2048] ---------------- ...
- 最少javascript代码完成一个2048游戏
原生javascript代码写的2048游戏.建议在谷歌浏览器下跑.'WASD'控制方向.演示地址请移步:http://runjs.cn/detail/bp8baf8b 直接贴代码~ html: &l ...
- Andorid游戏2048开发(一)
最近有一款Android平台下的游戏很是火爆----2048.下面记录一下开发过程.由于笔者是Android开发的初学者,所以希望借以此文熟悉整个Android开发的流程. 首先创建Game2048的 ...
- Android(java)学习笔记181:利用Service在后台播放背景音乐
1.在android应用程序里,有一种没有UI的类(android.app.Service)——Service.简单来说,Service是一个 background process(背景程序),通过背 ...
随机推荐
- java 环境变量与安装目录
JDK安装完成后有如下文件夹 bin:存放JDK的各种工具命令,如javac.java等命令. jre:运行java程序所必须的JRE环境 lib:JDK工具命令的实际执行程序,如tools.jar中 ...
- C#,SOAP1.1与1.2的发布与禁用(SOAP 1.2 in .NET Framework 2.0)
来源:https://www.codeproject.com/Articles/11878/SOAP-in-NET-Framework SOAP 1.2 in .NET Framework 2.0 ...
- phonegap 2.9 IOS Xcode 搭建环境
一:下载phoneGap2.9和安装Xcode5(目前最新版) 选择2.9是因为3.0以上坑爹版本编译神马的要在有网络情况. 二: 下载phonegap后解压到你的指定文件夹中,解压后找到create ...
- Zabbix监控windows的CPU利用率和其他资源
zabbix的WEB端--配置-模板--Template OS Windows--项目--创建项目 名称:UserPerfCountercpu 键值:UserPerfCountercpu 数据类型:数 ...
- js轮播插件
// Tween算法 var Tween = { // t:当前步数 // b:初始位置 // c:总距离 // d:总步数 // Linear:匀速 Linear: function(t,b,c,d ...
- 通过Vim+少量插件配置一个高效简洁的IDE
最近本人在看<TCP/IP Illustrated Volume2:The Implementation>这本书,自然要下载4.4BSD-Lite的源代码配合书本一起研读.以前学习Vim的 ...
- Hadoop(1.2.1)安装
背景知识: 1.数据分布存储,不是复制存储 2.数据不动,代码动,由于分布式存储,所以把代码移动到数据的地方计算. 3.数据如何分割,hadoop提供的分割文件的编程接口 安装: 1.安装JDK 1. ...
- 文件读写’r'和’rb’区别
2012年08月22日 ⁄ 综合 ⁄ 共 849字 ⁄ 字号 小 中 大 ⁄ 评论关闭不管何种语言在进行文件读写时,大家都知道有以下模式: r,rb,w,wb 那么在读写文件时,有无b标识的的主要区别 ...
- Openstack kvm win7镜像制作
本文地址http://www.cnblogs.com/tcicy/p/7790956.html 网上找了很多为openstack制作win7镜像的文章,总是不成功 自己写一下,以便大家查看. 我使用c ...
- 39. 在linux下装好Tomcat要给 tomcat/bin/下面所有.sh的文件执行权限
chmod a+x *.sh(赋予可执行的权限)