c++小游戏——2048
#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的更多相关文章
- c语言----<项目>_小游戏<2048>
2048 小游戏 主要是针对逻辑思维的一个训练. 主要学习方面:1.随机数产生的概率.2.行与列在进行移动的时候几种情况.3.MessageBox的使用 #include <iostream&g ...
- C语言小游戏: 2048.c
概要:2048.c是一个C语言编写的2048游戏,本文将详细分析它的源码和实现.C语言是一种经典实用的编程语言,本身也不复杂,但是学会C语言和能够编写实用的程序还是有一道鸿沟的.本文试图通过一个例子展 ...
- JavaScript小游戏--2048(PC端)
1.初始化棋局 $(document).ready(function() { prepare_for_mobile(); //适配移动端 new_game(); }); 2.开始新游戏 functio ...
- C语言小游戏——2048
2048 2048这款游戏的玩法很简单,每次可以选择上下左右滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢.相撞时会相加. ...
- 用C++、Qt实现的小游戏2048
窗口布局与游戏截图: 实现思路: 1.使用二维数组模拟整个游戏网格,并将二维数组中每个数的大小用作游戏中每个网格中的数据. 2.将对游戏的数据及数据的操作(即玩家的操作对游戏数据的影响)作为一个类,游 ...
- JavaScript小游戏--2048(移动端)
HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...
- JavaScript小游戏--2048(程序流程图)
- .NET手撸2048小游戏
.NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEng ...
- jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
随机推荐
- MyCat的初步了解
MyCat 1 开源数据库中间件 MyCat 如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据 ...
- Windows RabbitMQ 安装
操作系统 Win10 企业版 目标: 在win10上安装RabbitMQ 安装步骤 1.安装RabbitMQ需要先安装Erlang语言开发包,下载地址:http://www.erlang.org/d ...
- Delphi 7下IGDIPlus库的使用
IGDI+是一个免费开源封装微软GDI+功能的Delphi库,该库使得可以用Delphi语言代码快速简短的实现复杂GDI+应用程序.官方网站:http://www.mitov.com/html/igd ...
- 去除文件属性(使用SetFileAttributes API函数)
FILE_ATTRIBUTE_ARCHIVE 文件存档(备份或移动时会对文件做标记).FILE_ATTRIBUTE_ENCRYPTED 加密(对文件来说是内容加密,对目录来说是对将来新建的文件默认为加 ...
- 伪元素黑魔法:一个替代onerror解决图片加载失败的方案
问题的引出是这样的,在一个项目中有大量的页面主体是table做数据展示,所以就封装了一个table的组件,提供动态渲染的方案.有个问题是数据类型中有图片,对于图片的加载失败我们需要做容错.一般我们的思 ...
- Codility------CyclicRotation
Task description A zero-indexed array A consisting of N integers is given. Rotation of the array mea ...
- 快速理解类的访问控制(public,protected,private)
接触过面向对象编程的朋友们都知道类中的访问控制符无非有三个,public, protected, private. 理解他就先从期望他达到的效果先说吧 Public: 使成员对于整个程序内(类内类外) ...
- 如何在虚拟环境里运行spyder?如解决import tensorflow as tf 出现importError:no module named 'tensorflow'
问题描述:我们安装tensorflow时,通过activate tensorflow把tensorflow安装在虚拟环境里了,当我们在spyder里想要使用tensorflow时,就会发现如下图所以情 ...
- 求你了,再问你Java内存模型的时候别再给我讲堆栈方法区了…
GitHub 4.1k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 4.1k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 4.1k Star 的 ...
- C语言实现贪吃蛇
日期:2018.9.11 用时:150min 项目:贪吃蛇(C语言--数组 结构体实现) 开发工具:vs2013 关键知识:数组,结构体,图形库,键位操作 源代码: #include<std ...