#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <windows.h> void start_game();
void reset_game();
void move_left();
void move_right();
void move_up();
void move_down(); void refresh_show();
void add_rand_num();
void check_game_over();
int get_null_count(); int board[4][4];
int score;
int best;
int if_need_add_num;
int if_game_over; int main()
{
start_game();
} void start_game()
{
reset_game();
char cmd;
while (1)
{
cmd = getch(); if (if_game_over)
{
if (cmd == 'y' || cmd == 'Y')
{
reset_game();
continue;
}
else if (cmd == 'n' || cmd == 'N')
{
return;
}
else
{
continue;
}
} if_need_add_num = 0;
switch (cmd)
{
case 'a':
case 'A':
case 75 :
move_left();
break;
case 's':
case 'S':
case 80 :
move_down();
break;
case 'w':
case 'W':
case 72 :
move_up();
break;
case 'd':
case 'D':
case 77 :
move_right();
break;
}
score > best ? best = score : 1;
if (if_need_add_num)
{
add_rand_num();
refresh_show();
}
}
}
void reset_game()
{
score = 0;
if_need_add_num = 1;
if_game_over = 0;
int n = rand() % 16;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
board[i][j] = (n-- == 0 ? 2 : 0);
}
}
add_rand_num();
system("cls");
refresh_show();
}
void add_rand_num()
{
srand(time(0));
int n = rand() % get_null_count();
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (board[i][j] == 0 && n-- == 0)
{
board[i][j] = (rand() % 3 ? 2 : 4);
return;
}
}
}
}
int get_null_count()
{
int n = 0;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
board[i][j] == 0 ? n++ : 1;
}
}
return n;
}
void check_game_over()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
if (board[i][j] == board[i][j+1] || board[j][i] == board[j+1][i])
{
if_game_over = 0;
return;
}
}
}
if_game_over = 1;
}
void move_left()
{
for (int i = 0; i < 4; i++)
{
for (int j = 1, k = 0; j < 4; j++)
{
if (board[i][j] > 0)
{
if (board[i][k] == board[i][j])
{
score += board[i][k++] <<= 1;
board[i][j] = 0;
if_need_add_num = 1;
}
else if (board[i][k] == 0)
{
board[i][k] = board[i][j];
board[i][j] = 0;
if_need_add_num = 1;
}
else
{
board[i][++k] = board[i][j];
if (j != k)
{
board[i][j] = 0;
if_need_add_num = 1;
}
}
}
}
}
}
void move_right()
{
for (int i = 0; i < 4; i++)
{
for (int j = 2, k = 3; j >= 0; j--)
{
if (board[i][j] > 0)
{
if (board[i][k] == board[i][j])
{
score += board[i][k--] <<= 1;
board[i][j] = 0;
if_need_add_num = 1;
}
else if (board[i][k] == 0)
{
board[i][k] = board[i][j];
board[i][j] = 0;
if_need_add_num = 1;
}
else
{
board[i][--k] = board[i][j];
if (j != k)
{
board[i][j] = 0;
if_need_add_num = 1;
}
}
}
}
}
}
void move_up()
{
for (int i = 0; i < 4; i++)
{
for (int j = 1, k = 0; j < 4; j++)
{
if (board[j][i] > 0)
{
if (board[k][i] == board[j][i])
{
score += board[k++][i] <<= 1;
board[j][i] = 0;
if_need_add_num = 1;
}
else if (board[k][i] == 0)
{
board[k][i] = board[j][i];
board[j][i] = 0;
if_need_add_num = 1;
}
else
{
board[++k][i] = board[j][i];
if (j != k)
{
board[j][i] = 0;
if_need_add_num = 1;
}
}
}
}
}
}
void move_down()
{
for (int i = 0; i < 4; i++)
{
for (int j = 2, k = 3; j >= 0; j--)
{
if (board[j][i] > 0)
{
if (board[k][i] == board[j][i])
{
score += board[k--][i] <<= 1;
board[j][i] = 0;
if_need_add_num = 1;
}
else if (board[k][i] == 0)
{
board[k][i] = board[j][i];
board[j][i] = 0;
if_need_add_num = 1;
}
else
{
board[--k][i] = board[j][i];
if (j != k)
{
board[j][i] = 0;
if_need_add_num = 1;
}
}
}
}
}
}
void refresh_show()
{
COORD pos = {0, 0};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); printf("\n\n\n\n");
printf(" GAME: 2048 SCORE: %06d BEST: %06d\n", score, best);
printf(" --------------------------------------------------\n\n");
printf(" ┌──┬──┬──┬──┐\n");
for (int i = 0; i < 4; i++)
{
printf(" │");
for (int j = 0; j < 4; j++)
{
if (board[i][j] != 0)
{
if (board[i][j] < 10)
{
printf(" %d │", board[i][j]);
}
else if (board[i][j] < 100)
{
printf(" %d │", board[i][j]);
}
else if (board[i][j] < 1000)
{
printf(" %d│", board[i][j]);
}
else if (board[i][j] < 10000)
{
printf("%4d│", board[i][j]);
}
else
{
int n = board[i][j];
for (int k = 1; k < 20; k++)
{
n >>= 1;
if (n == 1)
{
printf("2^%02d│", k);
break;
}
}
}
}
else printf(" │");
} if (i < 3)
{
printf("\n ├──┼──┼──┼──┤\n");
}
else
{
printf("\n └──┴──┴──┴──┘\n");
}
} printf("\n");
printf(" --------------------------------------------------\n");
printf(" W↑ A← D→ ↓S"); if (get_null_count() == 0)
{
check_game_over();
if (if_game_over)
{
printf("\r GAME OVER! TRY THE GAME AGAIN? [Y/N]");
}
}
}

c++小游戏——2048的更多相关文章

  1. c语言----<项目>_小游戏<2048>

    2048 小游戏 主要是针对逻辑思维的一个训练. 主要学习方面:1.随机数产生的概率.2.行与列在进行移动的时候几种情况.3.MessageBox的使用 #include <iostream&g ...

  2. C语言小游戏: 2048.c

    概要:2048.c是一个C语言编写的2048游戏,本文将详细分析它的源码和实现.C语言是一种经典实用的编程语言,本身也不复杂,但是学会C语言和能够编写实用的程序还是有一道鸿沟的.本文试图通过一个例子展 ...

  3. JavaScript小游戏--2048(PC端)

    1.初始化棋局 $(document).ready(function() { prepare_for_mobile(); //适配移动端 new_game(); }); 2.开始新游戏 functio ...

  4. C语言小游戏——2048

      2048   2048这款游戏的玩法很简单,每次可以选择上下左右滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢.相撞时会相加. ...

  5. 用C++、Qt实现的小游戏2048

    窗口布局与游戏截图: 实现思路: 1.使用二维数组模拟整个游戏网格,并将二维数组中每个数的大小用作游戏中每个网格中的数据. 2.将对游戏的数据及数据的操作(即玩家的操作对游戏数据的影响)作为一个类,游 ...

  6. JavaScript小游戏--2048(移动端)

    HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...

  7. JavaScript小游戏--2048(程序流程图)

  8. .NET手撸2048小游戏

    .NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEng ...

  9. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

随机推荐

  1. Waveform基于JavaScript的开源多声道音乐波形编辑器

    快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中.   <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...

  2. VS2008下QT整合OGRE

    环境配置如下:VS2008 QT版本:4.8.1 OGRE版本: 1.7.4 请先配置好QT  for vs2008  : 下载QT VS2008的包,然后下个QT VS的插件 版本必须是VS2008 ...

  3. Delphi类与方法(几十篇)

    http://www.cnblogs.com/del/category/114896.html

  4. windows 消息列表

    private const UInt32 WM_ACTIVATE = 0x0006; private const UInt32 WM_ACTIVATEAPP = 0x001C; private con ...

  5. Kafka Topic的详细信息 捎带主要的安装步骤

    1. 安装步骤 Kafka伪分布式安装的思路跟Zookeeper的伪分布式安装思路完全一样,不过比Zookeeper稍微简单些(不需要创建myid文件), 主要是针对每个Kafka服务器配置一个单独的 ...

  6. Spring单例模式多线程安全问题-有状态的Bean

    Spring单例与线程安全小结 一.Spring单例模式与线程安全 Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思 ...

  7. 剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

    一.概述 1.1 数字人类的概要 数字人类(Digital Human)是利用计算机模拟真实人类的一种综合性的渲染技术.也被称为虚拟人类.超真实人类.照片级人类. 它是一种技术和艺术相结合的综合性模拟 ...

  8. CS代码代写, 程序代写, java代写, python代写, c/c++代写,csdaixie,daixie,作业代写,代写

    互联网一线工程师程序代写 微信联系 当天完成特色: 互联网一线工程师 24-48小时完成.用心代写/辅导/帮助客户CS作业. 客户反馈与评价 服务质量:保证honor code,代码原创.参考课程sl ...

  9. php.ini Xdebug配置

    在此记录: xdebug.profiler_output_dir="H:\install\phpStudy\tmp\xdebug"xdebug.trace_output_dir=& ...

  10. 10 关于DOM的操作

    一.JavaScript的组成 JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:文档对象 ...