2048 小游戏 主要是针对逻辑思维的一个训练.

主要学习方面:1.随机数产生的概率.2.行与列在进行移动的时候几种情况.3.MessageBox的使用

#include <iostream>
#include <time.h>
#include <conio.h>
#include <windows.h>
using namespace std;
int board[4][4] = {0}; //二维数组
int if_need_rand; //是否生成随机数
int if_game_over; //游戏结束
void showGame() { //打印边框
system("cls"); //刷新屏幕
printf("┏━━━┳━━━┳━━━┳━━━┓\n");
for (int i = 0; i < 4; i++) {
printf("┃");
for (int j = 0; j < 4;j++) {
if (board[i][j]==0) {
printf(" ┃");
}
else {
printf("%3d┃",board[i][j]);
}
}
if (i<3) {
printf("\n┣━━━╋━━━╋━━━╋━━━┫\n");
}
else {
printf("\n┗━━━┻━━━┻━━━┻━━━┛\n");
}
}
}
//设计随机数
void addRand() {
//随机数种子
srand((unsigned)time(NULL));
int i, j;//行列
while (1) {
i = rand() % 4;
j = rand() % 4;
if (board[i][j]==0) {
//三目运算符,几率时2分之一
board[i][j] = (rand() % 3 ? 2 : 4);
break;
}
else {
continue;
}
}
}
//初始化
void initGame() {
if_need_rand = 1;
if_game_over = 0;
int i, j;
i = rand() % 4;
j = rand() % 4;
board[i][j] = 2;
//将数组内值,赋值为0;重新初始化
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; j++) {
board[i][j] = 0;
}
}
addRand();
showGame();
}
//方向分为上下左右
//左移
void moveleft() {
for (int i = 0; i < 4;i++) {
for (int j = 1, k = 0; j < 4;++j) {
//先找到K项后面第一个不为0的项
if (board[i][j]!=0) {
//分为三个情况.相等,k项是0,不等
//相等
if (board[i][k]==board[i][j]) {
board[i][k++] <<= 1; //k++先赋值给k而后k++到下一个位置,进行判断
board[i][j] = 0;
if_need_rand = 1;
}else
//k项是0
if (board[i][k]==0) {
board[i][k] = board[i][j];
board[i][j] = 0;
if_need_rand = 1;
}
//k项与j项不等,有两种情况,j项就在k项后边,
//所以不能将j项赋值为0
else {
board[i][++k] = board[i][j];
if (j!=k) {
board[i][j] = 0;
if_need_rand = 1;
}
}
}
}
}
}
//右移
void moveRinght() {
for (int i = 0; i < 4; i++) {
for (int j = 2, k = 3; j >= 0; j--) {
//先找到K项后面第一个不为0的项
if (board[i][j] != 0) {
//分为三个情况.相等,k项是0,不等
//相等
if (board[i][k] == board[i][j]) {
board[i][k--] <<= 1;
board[i][j] = 0;
if_need_rand = 1;
}
else
//k项是0
if (board[i][k] == 0) {
board[i][k] = board[i][j];
board[i][j] = 0;
if_need_rand = 1;
}
//k项与j项不等,有两种情况,j项就在k项后边,
//所以不能将j项赋值为0
else {
board[i][--k] = board[i][j];
if (j != k) {
board[i][j] = 0;
if_need_rand = 1;
}
}
}
}
}
}
//上移
void moveup() {
for (int i = 0; i < 4; i++) {
for (int j = 1, k = 0; j < 4; ++j) {
//先找到K项后面第一个不为0的项
if (board[j][i] != 0) {
//分为三个情况.相等,k项是0,不等
//相等
if (board[k][i] == board[j][i]) {
board[k++][i] <<= 1;
board[j][i] = 0;
if_need_rand = 1;
}
else
//k项是0
if (board[k][i] == 0) {
board[k][i] = board[j][i];
board[j][i] = 0;
if_need_rand = 1;
}
//k项与j项不等,有两种情况,j项就在k项后边,
//所以不能将j项赋值为0
else {
board[++k][i] = board[j][i];
if (j != k) {
board[j][i] = 0;
if_need_rand = 1;
}
}
}
}
}
}
//下移
void moveDown() {
for (int i = 0; i < 4; i++) {
for (int j = 2, k = 3; j >=0; --j) {
//先找到K项后面第一个不为0的项
if (board[j][i] != 0) {
//分为三个情况.相等,k项是0,不等
//相等
if (board[k][i] == board[j][i]) {
board[k--][i] <<= 1;
board[j][i] = 0;
if_need_rand = 1;
}
else
//k项是0
if (board[k][i] == 0) {
board[k][i] = board[j][i];
board[j][i] = 0;
if_need_rand = 1;
}
//k项与j项不等,有两种情况,j项就在k项后边,
//所以不能将j项赋值为0
else {
board[--k][i] = board[j][i];
if (j != k) {
board[j][i] = 0;
if_need_rand = 1;
}
}
}
}
}
}
//查看有没有空着的格子
int getNull() {
int n = 0;
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
if (board[i][j] == 0) {
n++;
}
}
}
return n;
}
//比较相邻的两个数,是否相等
void gameOver() {
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 startGame() {
on:
initGame();
while (1) {
if_need_rand = 0;//首先将随机值设为0.
switch (_getch())
{
case 'a':
case 'A':
case 75:
moveleft();
break;
case 'd':
case 'D':
case 77:
moveRinght();
break;
case 'w':
case 'W':
case 72:
moveup();
break;
case 's':
case 'S':
case 80:
moveDown();
default:
break;
}
if (if_need_rand) {
addRand();
showGame();
}
//游戏判断
if (getNull()==0) {
gameOver();
if (if_game_over) {
if (MessageBox(NULL,L"是否重来一局!",L"游戏结束",MB_YESNO)==IDYES) {
goto on;
}
else {
return;
}
}
}
}
} int main() {
startGame();
return 0;
}

c语言----<项目>_小游戏<2048>的更多相关文章

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

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

  2. 简单的C语言猜数字小游戏

    猜数字小游戏可谓是C语言最为基础的一个知识点了,我们可以在此基础上进行延伸,实现随机数的猜测,然后是加入再来一局的模式,等等.这里是抛砖引玉,希望你能做出你的经典之作. #include <st ...

  3. 【源码项目+解析】C语言/C++开发,打造一个小项目扫雷小游戏!

    一直说写个几百行的小项目,于是我写了一个控制台的扫雷,没有想到精简完了代码才200行左右,不过考虑到这是我精简过后的,浓缩才是精华嘛,我就发出来大家一起学习啦,看到程序跑起来能玩,感觉还是蛮有成就感的 ...

  4. C语言小游戏——2048

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

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

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

  6. 【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

    俄罗斯方块的核心玩法非常简单,所以制作起来并不是很复杂,我准备先用2篇文字的篇幅详细讲解一下俄罗斯方块的制作方法. 今天咱们算是第一篇,主要讲解俄罗斯方块中如何定义方块,以及如何实现方块的移动.旋转. ...

  7. 【C语言程序设计】小游戏之俄罗斯方块(二)!适合初学者上手、练手!

    第二篇,主要实现俄罗斯方块中的主体部分,包括容器的数据结构以及容器的相关操作,特别是大方块和容器之间的交互逻辑,包括碰撞检测,消除检测等等. 1. 容器的表示 大方块的实现涉及到位运算,而容器同样如此 ...

  8. python项目实战-小游戏1

    项目规则: 1.玩家和敌人分别从现有的角色中选择3个角色 2.随机生成目前的血量,和攻击量 3.游戏规则:当玩家向敌人发起攻击,敌人当前的血量=之前的血量-玩家的血量,同理 4.3局两胜 5.自定义玩 ...

  9. Java_太阳系_行星模型_小游戏练习_详细注释

    //实现MyFrame--实现绘制窗口,和实现重写 重画窗口线程类 package cn.xiaocangtian.Test; import java.awt.Frame; import java.a ...

随机推荐

  1. WPF中得到一个控件相对其他控件的坐标

    加入想得到按钮btnTest左上角相对于主窗体winTest的坐标,可以用如下方法:btnTest.TranslatePoint(new Point(0, 0), winTest)这个方法返回一个Po ...

  2. navigationController背景图,文字,事件定义

    //设置背景图片 [self.navigationController.navigationBar setBackgroundImage:imag forBarMetrics:UIBarMetrics ...

  3. 初识powershell、nuget powershell 调试

    初识powershell.nuget powershell 调试 补充 此文仅当做powershell的初步认识体验,关于nuget包里此脚本的使用官方已在vs2017停止支持,请看此文文末 前言 老 ...

  4. .Net Core in Docker - 在容器内编译发布并运行

    Docker可以说是现在微服务,DevOps的基础,咱们.Net Core自然也得上Docker..Net Core发布到Docker容器的教程网上也有不少,但是今天还是想来写一写. 你搜.Net c ...

  5. ASP.NET MVC Areas View 引用 外部母版视图

    ASP.NET MVC Area => Areas View 引用 外部母版视图 创建项目:MVCSite.Area 创建mvc area 1.Areas View 引用 外部母版视图 1.1 ...

  6. The service definition selected is invalid

    吐槽下 最近在学Java 听闻Java生态很好 社区很多 但实际操作起来确实另一番风景 不多说了 说正事 添加WebService服务Client时有密码认证得服务 Eclipse抛出 The ser ...

  7. Web Server IIS7部署网站常遇到的错误及解决办法

    IIS7部署网站常遇到的错误及解决办法 经常遇到问题: 1.错误:403.14-Forbidden Web 服务器被配置为不列出此目录的内容及Login on failed for "IIS ...

  8. Restframework 权限permission 组件实例-2

    1.在视图类里添加权限组件 class BookView(APIView): authentication_classes = [UserAuth] permission_classes = [SVI ...

  9. CentOS 6 - 升级内核

    有的时候,需要升级Linux内核,今天我就是在CentOS 6中升级内核,在没有升级内核之前,我的CentOS 6只有2.6.32这一个内核,也是默认启动的内核.下面就开始一步步操作升级内核了! 一, ...

  10. Python3.5 学习十一

    关于消息队列 PY 中应用程序里对于消息队列的使用: 1 threading QUEUE 2 进程QUEUE 父进程.父进程下的子进程间进行交互 RabbitMQ 消息队列 :用于应用程序之间,可跨平 ...