【C++/控制台】2048小游戏

server/2025/1/11 6:47:18/

源代码:

#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>// #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)const int W = 4;
const int H = 4;
int board[H][W];
int score;
const int keymap[4] = {72, 80, 75, 77}; // 依次为上下左右
const int dx[4] = {-1, 1, 0, 0};        // 依次对应上下左右
const int dy[4] = {0, 0, -1, 1};// 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384  (超过这个数字的从头开始)
const int color[] = {15,8,6,14,4,2,12,5,13,3,10,11,1,9,
};/*  颜色说明:* 0 = 黑色       8 = 灰色* 1 = 蓝色       9 = 淡蓝色* 2 = 绿色       10 = 淡绿色* 3 = 浅绿色     11 = 淡浅绿色* 4 = 红色       12 = 淡红色* 5 = 紫色       13 = 淡紫色* 6 = 黄色       14 = 淡黄色* 7 = 白色       15 = 亮白色*/
bool judge() {for (int i = 0; i < H; i++)for (int j = 0; j < W; j++) {if (board[i][j] == 0)return false;else if (i < 3 && j < 3)if (board[i][j] == board[i + 1][j] || board[i][j] == board[i][j + 1])return false;}return true;
}void Set_Color(int color) {HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | color);
}void display() {system("cls");for (int i = 0; i < H; i++) {for (int j = 0; j < W; j++) {if (board[i][j] == 0)printf("     ");else {Set_Color(color[(int)log2(board[i][j]) - 1]); // 根据数字设置颜色printf("%-5d", board[i][j]);Set_Color(7);}if (j < 3)putchar('|');}putchar('\n');for (int r = 0; r < 23; r++)putchar('-');putchar('\n');}printf("当前得分: %d", score);
}void move(int dir) {int x = 0, y = 0;if (dy[dir]) {// 水平移动for (int i = 0; i < H; i++) {// 遍历每一行y = (dy[dir] == 1) ? 3 : 0;int j = y;int top = y;while (abs(j - y) < 3) {j -= dy[dir];if (board[i][top] == 0 && board[i][j] != 0) {board[i][top] = board[i][j];board[i][j] = 0;} else if (board[i][top] != 0 && board[i][j] == board[i][top]) {board[i][top] *= 2;score += board[i][top];board[i][j] = 0;} else if (board[i][top] * board[i][j] != 0 && board[i][top] != board[i][j]) {top -= dy[dir];if (j != top) {board[i][top] = board[i][j];board[i][j] = 0;}}}}} else if (dx[dir]) {// 垂直移动for (int j = 0; j < W; j++) {// 遍历每一列x = (dx[dir] == 1) ? 3 : 0;int i = x;int top = x;while (abs(i - x) < 3) {i -= dx[dir];if (board[top][j] == 0 && board[i][j] != 0) {board[top][j] = board[i][j];board[i][j] = 0;} else if (board[top][j] != 0 && board[i][j] == board[top][j]) {board[top][j] *= 2;score += board[top][j];board[i][j] = 0;} else if (board[top][j] * board[i][j] != 0 && board[top][j] != board[i][j]) {top -= dx[dir];if (i != top) {board[top][j] = board[i][j];board[i][j] = 0;}}}}}
}void newNum() {int flag = 0;int n = 0;for (int i = 0; i < 4; i++)for (int j = 0; j < 4; j++)if (board[i][j] == 0)n++;srand((unsigned)time(NULL));if (n == 0)return;int end = rand() % n;int t = 0;for (int i = 0; i < 4 && !flag; i++)for (int j = 0; j < 4 && !flag; j++) {if (board[i][j] == 0) {if (t == end) {board[i][j] += 2;flag = 1;} elset++;}}
}void play() {newNum();display();while (true) {int ch = _getch();for (int i = 0; i < 4; i++) {if (ch == keymap[i]) {move(i);if (judge())return;newNum();display();}}Sleep(10); // 防止连按}
}void init() {system("mode con:cols=24 lines=10");memset(board, 0, sizeof(board));score = 0;
}int main() {init();play();system("cls");printf("\n\n\tGAME OVER!");printf("\n\n\tSCORE:%d", score);getchar();
}

运行结果:


http://www.ppmy.cn/server/157394.html

相关文章

【C++】揭开C++类与对象的神秘面纱(首卷)(类的基础操作详解、实例化艺术及this指针的深究)

文章目录 一、类的定义1.类定义格式2.类访问限定符3.类域 二、类的实例化1.实例化概念2.对象的大小 三、隐藏的this指针与相关练习1.this指针的引入与介绍练习1练习2练习3 一、类的定义 1.类定义格式 在讲解类的作用之前&#xff0c;我们来看看类是如何定义的&#xff0c;在C中…

HarmonyOS开发:ArkTS初识

ArkTS基本语法 ArkTS语言简介 ArkTS是鸿蒙生态的应用开发语言。基本语法风格与TypeScript&#xff08;简称TS&#xff09;相似&#xff0c;在TS的生态基础上进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。 基本语法概述 扩展能力 基础语法&#xff1a…

系统架构设计师考点—计算机网络

一、备考指南 计算机网络知识主要考查的是网络体系结构、网络协议、IP地址、网络规划设计等&#xff0c;同时也是重点考点&#xff0c;在系统架构设计师的考试中只会在选择题里考查&#xff0c;占3~5分。 二、计算机按分布范围分类 三、传输介质 1、双绞线 双绞线将多根铜线按…

【GIt原理与使用】Git远程仓库

一、理解分布式版本控制系统 我们目前所说的所有内容&#xff08;工作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#xff0c;都是在本地&#xff01;也就是在你的笔记本或者计算机上。而我们的 Git 其实是分布式版本控制系统&#xff01;什么意思呢&#xff1f…

micro-app【微前端系列教程】禁用样式隔离

全局禁用样式隔离 所有应用的样式隔离都会停止 import microApp from micro-zoe/micro-appmicroApp.start({disableScopecss: true, // 默认值false })指定子应用取消禁用样式隔离 <micro-app namexx urlxx disableScopecssfalse></micro-app>指定子应用禁用样式…

Spring Boot3 配合ProxySQL实现对 MySQL 主从同步的读写分离和负载均衡

将 ProxySQL 配合 Spring Boot 使用&#xff0c;主要的目的是在 Spring Boot 应用程序中实现对 MySQL 主从同步的读写分离和负载均衡。这样&#xff0c;你可以利用 ProxySQL 自动将写操作路由到主库&#xff0c;而将读操作路由到从库。 1. 准备工作 确保你的 MySQL 主从同步环…

PHP民宿酒店预订系统小程序源码

&#x1f3e1;民宿酒店预订系统 基于ThinkPHPuniappuView框架精心构建的多门店民宿酒店预订管理系统&#xff0c;能够迅速为您搭建起专属的、功能全面且操作便捷的民宿酒店预订小程序。 该系统不仅涵盖了预订、退房、WIFI连接、用户反馈、周边信息展示等核心功能&#xff0c;更…

机器人避障不再“智障”:HEIGHT——拥挤复杂环境下机器人导航的新架构

导读&#xff1a; 由于环境中静态障碍物和动态障碍物的约束&#xff0c;机器人在密集且交互复杂的人群中导航&#xff0c;往往面临碰撞与延迟等安全与效率问题。举个简单的例子&#xff0c;商城和车站中的送餐机器人往往在人流量较大时就会停在原地无法运作&#xff0c;因为它不…