/*
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
*/
#include <bits/stdc++.h>
#include <conio.h>
#include <windows.h>
#define sp(x1,y1,x2,y2) swap(a[x1][y1],a[x2][y2])
using namespace std;
int a[4][4];
int over=0;
void rgb_init()
{
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwInMode, dwOutMode;
GetConsoleMode(hIn, &dwInMode);
GetConsoleMode(hOut, &dwOutMode);
dwInMode |= 0x0200;
dwOutMode |= 0x0004;
SetConsoleMode(hIn, dwInMode);
SetConsoleMode(hOut, dwOutMode);
}
void rgb_set(int wr,int wg,int wb,int br,int bg,int bb)
{
printf("\033[38;2;%d;%d;%dm\033[48;2;%d;%d;%dm",wr,wg,wb,br,bg,bb);
}
void start()
{
cout<<"正在初始化...";
rgb_init();
srand(time(0));
memset(a,0,sizeof(a));
over=0;
system("cls");
}
void rd()
{
int h=rand()%4,w=rand()%4;
while(a[h][w])
{
h=rand()%4,w=rand()%4;
}
a[h][w]=2;
}
void print()
{
for(int i=0; i<4; ++i)
{
if(i)
{
cout<<"├";
}
else
{
cout<<"┌";
}
for(int j=0;j<4;++j)
{
cout<<"────";
if(i)
{
cout<<"┼";
}
else
{
cout<<"┬";
}
}
cout<<"\b";
if(i)
{
cout<<"┤";
}
else
{
cout<<"┐";
}
cout<<'\n';
for(int j=0; j<4; ++j)
{
cout<<"│";
switch(a[i][j])
{
case 2:
rgb_set(255,255,120,0,0,0);
break;
case 4:
rgb_set(80,120,0,0,0,0);
break;
case 8:
rgb_set(230,90,60,0,0,0);
break;
case 16:
rgb_set(0,0,255,0,0,0);
break;
case 32:
rgb_set(10,200,200,0,0,0);
break;
case 64:
rgb_set(255,200,200,0,0,0);
break;
case 128:
rgb_set(255,100,200,0,0,0);
break;
case 256:
rgb_set(255,100,0,0,0,0);
break;
case 512:
rgb_set(127,255,212,0,0,0);
break;
case 1024:
rgb_set(200,200,230,0,0,0);
break;
case 2048:
rgb_set(129,0,0,0,0,0);
break;
case 4096:
rgb_set(144,238,144,0,0,0);
break;
case 8192:
rgb_set(238,210,238,0,0,0);
break;
}
if(a[i][j])
{
cout<<setw(4)<<a[i][j];
}
else
{
cout<<" ";
}
rgb_set(255,255,255,0,0,0);
}
cout<<"│\n";
}
cout<<"└────┴────┴────┴────┘\n";
}
bool aa()
{
bool ok=0;
for(int k=0; k<4; ++k)
{
for(int i=0; i<4; ++i)
{
for(int j=1; j<4; ++j)
{
if(a[i][j]!=0&&a[i][j-1]==0)
{
ok=1;
sp(i,j,i,j-1);
}
}
}
}
return ok;
}
bool aaa()
{
bool ok=aa();
for(int i=0; i<4; ++i)
{
for(int j=1; j<4; ++j)
{
if(a[i][j]==a[i][j-1]&&a[i][j]!=0)
{
a[i][j-1]*=2;
ok=1;
a[i][j]=0;
}
}
}
return (aa()+ok>0);
}
bool dd()
{
bool ok=0;
for(int k=0; k<4; ++k)
{
for(int i=0; i<4; ++i)
{
for(int j=3; j>0; --j)
{
if(a[i][j-1]!=0&&a[i][j]==0)
{
ok=1;
sp(i,j-1,i,j);
}
}
}
}
return ok;
}
bool ddd()
{
bool ok=dd();
for(int i=0; i<4; ++i)
{
for(int j=3; j>0; --j)
{
if(a[i][j]==a[i][j-1]&&a[i][j]!=0)
{
a[i][j]*=2;
ok=1;
a[i][j-1]=0;
}
}
}
return (dd()+ok>0);
}
bool ww()
{
bool ok=0;
for(int k=0; k<4; ++k)
{
for(int i=0; i<4; ++i)
{
for(int j=1; j<4; ++j)
{
if(a[j][i]!=0&&a[j-1][i]==0)
{
ok=1;
sp(j,i,j-1,i);
}
}
}
}
return ok;
}
bool www()
{
bool ok=ww();
for(int i=0; i<4; ++i)
{
for(int j=1; j<4; ++j)
{
if(a[j][i]==a[j-1][i]&&a[j][i]!=0)
{
a[j-1][i]*=2;
ok=1;
a[j][i]=0;
}
}
}
return (ww()+ok>0);
}
bool ss()
{
bool ok=0;
for(int k=0; k<4; ++k)
{
for(int i=0; i<4; ++i)
{
for(int j=3; j>0; --j)
{
if(a[j-1][i]!=0&&a[j][i]==0)
{
ok=1;
sp(j-1,i,j,i);
}
}
}
}
return ok;
}
bool sss()
{
bool ok=ss();
for(int i=0; i<4; ++i)
{
for(int j=3; j>0; --j)
{
if(a[j][i]==a[j-1][i]&&a[j][i]!=0)
{
a[j][i]*=2;
ok=1;
a[j-1][i]=0;
}
}
}
return (ss()+ok>0);
}
int check()
{
bool o1=1,o2=0;
for(int i=0;i<4;i+=2)
{
for(int j=0;j<4;j+=2)
{
if(a[i][j]==a[i][j+1]||a[i][j]==a[i+1][j]||a[i+1][j+1]==a[i][j+1]||a[i+1][j+1]==a[i+1][j])
{
o1=0;
}
}
}
for(int i=0;i<4;++i)
{
for(int j=0;j<4;++j)
{
if(a[i][j]>=2048)
{
o2=1;
}
}
}
return (o1?o1:(o2-over)*2);
}
int main()
{
start();
system("pause");
system("cls");
rd();
print();
while(1)
{
switch(check())
{
case 1:
system("cls");
cout<<"你输了。\n想要再来一次吗?\n";
system("pause");
start();
rd();
print();
break;
case 2:
system("cls");
cout<<"你赢了。还要继续吗?";
system("pause");
system("cls");
cout<<"按a继续游戏,按b从新开始";
char c;
while(c=getchar())
{
if(c=='a')
{
print();
over=1;
break;
}
else
{
if(c=='b')
{
start();
rd();
print();
break;
}
}
}
break;
}
char c=getch();
switch(c)
{
case 'a':
if(aaa())
{
break;
}
else
{
continue;
}
case 'd':
if(ddd())
{
break;
}
else
{
continue;
}
case 'w':
if(www())
{
break;
}
else
{
continue;
}
case 's':
if(sss())
{
break;
}
else
{
continue;
}
default:
continue;
}
system("cls");
rd();
print();
}
return 0;
}
#include <iostream>
#include <iomanip>
#include <windows.h>
#include <conio.h>
#include <ctime>
using namespace std;
const int SIZE = 4;
int a[SIZE][SIZE];
bool over = false;
void rgb_init()
{
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwInMode, dwOutMode;
GetConsoleMode(hIn, &dwInMode);
GetConsoleMode(hOut, &dwOutMode);
dwInMode |= 0x0200;
dwOutMode |= 0x0004;
SetConsoleMode(hIn, dwInMode);
SetConsoleMode(hOut, dwOutMode);
}
void rgb_set(int wr, int wg, int wb, int br, int bg, int bb)
{
printf("\033[38;2;%d;%d;%dm\033[48;2;%d;%d;%dm", wr, wg, wb, br, bg, bb);
}
void start()
{
cout << "正在初始化...";
rgb_init();
srand(time(0));
memset(a, 0, sizeof(a));
over = false;
system("cls");
}
void rd()
{
int h = rand() % SIZE, w = rand() % SIZE;
while (a[h][w])
{
h = rand() % SIZE, w = rand() % SIZE;
}
a[h][w] = 2;
}
void print()
{
for (int i = 0; i < SIZE; ++i)
{
if (i)
{
cout << "├";
}
else
{
cout << "┌";
}
for (int j = 0; j < SIZE; ++j)
{
cout << "────";
if (i)
{
cout << "┼";
}
else
{
cout << "┬";
}
}
cout << "\b";
if (i)
{
cout << "┤";
}
else
{
cout << "┐";
}
cout << '\n';
for (int j = 0; j < SIZE; ++j)
{
cout << "│";
switch (a[i][j])
{
case 2:
rgb_set(255, 255, 120, 0, 0, 0);
break;
case 4:
rgb_set(80, 120, 0, 0, 0, 0);
break;
case 8:
rgb_set(230, 90, 60, 0, 0, 0);
break;
case 16:
rgb_set(0, 0, 255, 0, 0, 0);
break;
case 32:
rgb_set(10, 200, 200, 0, 0, 0);
break;
case 64:
rgb_set(255, 200, 200, 0, 0, 0);
break;
case 128:
rgb_set(255, 100, 200, 0, 0, 0);
break;
case 256:
rgb_set(255, 100, 0, 0, 0, 0);
break;
case 512:
rgb_set(127, 255, 212, 0, 0, 0);
break;
case 1024:
rgb_set(200, 200, 230, 0, 0, 0);
break;
case 2048:
rgb_set(129, 0, 0, 0, 0, 0);
break;
case 4096:
rgb_set(144, 238, 144, 0, 0, 0);
break;
case 8192:
rgb_set(238, 210, 238, 0, 0, 0);
break;
default:
rgb_set(255, 255, 255, 0, 0, 0);
break;
}
if (a[i][j])
{
cout << setw(4) << a[i][j];
}
else
{
cout << " ";
}
}
cout << "│\n";
}
cout << "└────┴────┴────┴────┘\n";
}
bool moveLeft()
{
bool hasMoved = false;
for (int i = 0; i < SIZE; ++i)
{
int k = 0;
for (int j = 1; j < SIZE; ++j)
{
if (a[i][j] != 0)
{
if (a[i][j] == a[i][k])
{
a[i][k] *= 2;
a[i][j] = 0;
hasMoved = true;
}
else if (a[i][k] == 0)
{
a[i][k] = a[i][j];
a[i][j] = 0;
hasMoved = true;
}
else
{
++k;
a[i][k] = a[i][j];
if (k != j)
{
a[i][j] = 0;
hasMoved = true;
}
}
}
}
}
return hasMoved;
}
bool moveRight()
{
bool hasMoved = false;
for (int i = 0; i < SIZE; ++i)
{
int k = SIZE - 1;
for (int j = SIZE - 2; j >= 0; --j)
{
if (a[i][j] != 0)
{
if (a[i][j] == a[i][k])
{
a[i][k] *= 2;
a[i][j] = 0;
hasMoved = true;
}
else if (a[i][k] == 0)
{
a[i][k] = a[i][j];
a[i][j] = 0;
hasMoved = true;
}
else
{
--k;
a[i][k] = a[i][j];
if (k != j)
{
a[i][j] = 0;
hasMoved = true;
}
}
}
}
}
return hasMoved;
}
bool moveUp()
{
bool hasMoved = false;
for (int j = 0; j < SIZE; ++j)
{
int k = 0;
for (int i = 1; i < SIZE; ++i)
{
if (a[i][j] != 0)
{
if (a[i][j] == a[k][j])
{
a[k][j] *= 2;
a[i][j] = 0;
hasMoved = true;
}
else if (a[k][j] == 0)
{
a[k][j] = a[i][j];
a[i][j] = 0;
hasMoved = true;
}
else
{
++k;
a[k][j] = a[i][j];
if (k != i)
{
a[i][j] = 0;
hasMoved = true;
}
}
}
}
}
return hasMoved;
}
bool moveDown()
{
bool hasMoved = false;
for (int j = 0; j < SIZE; ++j)
{
int k = SIZE - 1;
for (int i = SIZE - 2; i >= 0; --i)
{
if (a[i][j] != 0)
{
if (a[i][j] == a[k][j])
{
a[k][j] *= 2;
a[i][j] = 0;
hasMoved = true;
}
else if (a[k][j] == 0)
{
a[k][j] = a[i][j];
a[i][j] = 0;
hasMoved = true;
}
else
{
--k;
a[k][j] = a[i][j];
if (k != i)
{
a[i][j] = 0;
hasMoved = true;
}
}
}
}
}
return hasMoved;
}
bool check()
{
bool hasEmptyCell = false;
for (int i = 0; i < SIZE; ++i)
{
for (int j = 0; j < SIZE; ++j)
{
if (a[i][j] == 0)
{
hasEmptyCell = true;
}
if (a[i][j] >= 2048)
{
return true; // Win condition
}
if (i < SIZE - 1 && a[i][j] == a[i + 1][j])
{
return false; // Continue playing
}
if (j < SIZE - 1 && a[i][j] == a[i][j + 1])
{
return false; // Continue playing
}
}
}
if (!hasEmptyCell)
{
return true; // Lose condition
}
return false; // Continue playing
}
int main()
{
start();
system("pause");
system("cls");
rd();
print();
while (true)
{
if (check())
{
system("cls");
cout << "游戏结束\n";
cout << "按a重新开始,按其他键退出\n";
char c = _getch();
if (c == 'a')
{
start();
rd();
print();
}
else
{
break;
}
}
else
{
char c = _getch();
bool hasMoved = false;
switch (c)
{
case 'a':
hasMoved = moveLeft();
break;
case 'd':
hasMoved = moveRight();
break;
case 'w':
hasMoved = moveUp();
break;
case 's':
hasMoved = moveDown();
break;
default:
continue;
}
if (hasMoved)
{
system("cls");
rd();
print();
}
}
}
return 0;
}
删除了不必要的头文件引用,并添加了必要的头文件。
删除了无用的预编译指令。
修改了变量名,使其更具有可读性。
简化了移动操作的代码,使用了单一的函数来处理四个方向的移动。
修改了游戏结束的判断逻辑,使用了更简洁的方式。
使用了_getch()函数替代getchar()函数,以避免不必要的换行符输入。
优化了界面显示的逻辑,使代码更加简洁和易读。
以下是对代码进行优化的一些建议:
创建动态链接库和静态库的步骤差不多,只不过要选中相应的选项。
打开Visual Studio选择创建新项选择动态链接库(DLL),点击下一步
分别创建用于声明和定义函数的头文件.h和源文件.cpp
MSVC编译器提供了一系列C/C++的扩展来指定符号的导入导出,即__declspec属性关键字。
__declspec(dllexport) 表示该符号是从本DLL导出的符号。
__declspec(dllimport) 表示该符号是从别的DLL中导入的。
因此我们可以用一个一个宏来定义我们的导出导入关键字,如果定义了宏就设置了__declspec(dllexport)修饰符,若未定义则设置__declspec(dllimport)。
现在我们头文件中一个用于加法和减法的函数并加上宏定义的修饰符,以及声明一个需要导出的类的函数。
在我们创建的.cpp文件中包含我们的.h头文件并且实现我们的函数
calc.h
#ifndef CALC_H__2832ab37_92f0_4fa4_ad9c_7c5570c90c7f
#define CALC_H__2832ab37_92f0_4fa4_ad9c_7c5570c90c7f
//define CALC_API macro to export or import
#ifdef DYNAMICLIBRARY_EXPORTS
#define CALC_API __declspec(dllexport)
#else
#define CALC_API __declspec(dllimport)
#endif
CALC_API int Add(int x, int y);
class CALC_API Rectangle
{
public:
Rectangle(unsigned int length = 0, unsigned int width = 0);
unsigned int Area() const;
private:
unsigned int m_uiLength;
unsigned int m_uiWidth;
};
#endif
test.cpp
#define CALC_API __declspec(dllexport)
#include "calc.h"
#include <iostream>
using namespace std;
int Add(int x, int y)
{
return x + y;
}
Rectangle::Rectangle(unsigned int length /* = 0 */, unsigned int width /* = 0 */)
{
this->m_uiLength = length;
this->m_uiWidth = width;
}
unsigned int Rectangle::Area() const
{
return this->m_uiLength * this->m_uiWidth;
会生成lib dll文件这里复制这两个和.h文件到新文件夹
这里dll文件在和主文件放一起,lib文件放自己创建的lib文件夹里
#include"./include/calc.h"
#include <iostream>
using namespace std;
#pragma comment(lib, "./lib/Dll2.lib")
int main()
{
cout << "1 + 3 = " << Add(1, 3) << endl;
return EXIT_SUCCESS;
这里再用一下类
#include"./include/calc.h"
#include <iostream>
using namespace std;
#pragma comment(lib, "./lib/Dll2.lib")
int main()
{
cout << "1 + 3 = " << Add(1, 3) << endl;
int input1, input2;
cout << "input number 1" << endl;
cin >> input1;
cout << "input number 1" << endl;
cin >> input2;
cout << "the area of the square" << endl;
Rectangle rect(input1, input2);
cout << rect.Area() << endl;
return EXIT_SUCCESS;
}
效果
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
#include <windows.h>
using namespace std;
int a[4][4];
int over = 0;
void start() {
cout << "正在初始化..." << endl;
srand(time(0));
memset(a, 0, sizeof(a));
over = 0;
system("cls");
}
void rd() {
int h = rand() % 4, w = rand() % 4;
while (a[h][w]) {
h = rand() % 4;
w = rand() % 4;
}
a[h][w] = 2;
}
void print() {
system("cls");
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
cout << setw(6) << a[i][j];
}
cout << endl;
}
}
bool moveLeft() {
bool ok = false;
for (int i = 0; i < 4; ++i) {
for (int j = 1; j < 4; ++j) {
if (a[i][j] != 0 && a[i][j - 1] == 0) {
ok = true;
swap(a[i][j], a[i][j - 1]);
}
}
}
return ok;
}
bool mergeLeft() {
bool ok = false;
for (int i = 0; i < 4; ++i) {
for (int j = 1; j < 4; ++j) {
if (a[i][j] == a[i][j - 1] && a[i][j] != 0) {
a[i][j - 1] *= 2;
a[i][j] = 0;
ok = true;
}
}
}
return ok;
}
bool moveRight() {
bool ok = false;
for (int i = 0; i < 4; ++i) {
for (int j = 2; j >= 0; --j) {
if (a[i][j] != 0 && a[i][j + 1] == 0) {
ok = true;
swap(a[i][j], a[i][j + 1]);
}
}
}
return ok;
}
bool mergeRight() {
bool ok = false;
for (int i = 0; i < 4; ++i) {
for (int j = 2; j >= 0; --j) {
if (a[i][j] == a[i][j + 1] && a[i][j] != 0) {
a[i][j + 1] *= 2;
a[i][j] = 0;
ok = true;
}
}
}
return ok;
}
bool moveUp() {
bool ok = false;
for (int i = 1; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
if (a[i][j] != 0 && a[i - 1][j] == 0) {
ok = true;
swap(a[i][j], a[i - 1][j]);
}
}
}
return ok;
}
bool mergeUp() {
bool ok = false;
for (int i = 1; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
if (a[i][j] == a[i - 1][j] && a[i][j] != 0) {
a[i - 1][j] *= 2;
a[i][j] = 0;
ok = true;
}
}
}
return ok;
}
bool moveDown() {
bool ok = false;
for (int i = 2; i >= 0; --i) {
for (int j = 0; j < 4; ++j) {
if (a[i][j] != 0 && a[i + 1][j] == 0) {
ok = true;
swap(a[i][j], a[i + 1][j]);
}
}
}
return ok;
}
bool mergeDown() {
bool ok = false;
for (int i = 2; i >= 0; --i) {
for (int j = 0; j < 4; ++j) {
if (a[i][j] == a[i + 1][j] && a[i][j] != 0) {
a[i + 1][j] *= 2;
a[i][j] = 0;
ok = true;
}
}
}
return ok;
}
bool check() {
bool o1 = true, o2 = false;
for (int i = 0; i < 4; i += 2) {
for (int j = 0; j < 4; j += 2) {
if (a[i][j] == a[i][j + 1] || a[i][j] == a[i + 1][j] || a[i + 1][j + 1] == a[i][j + 1] || a[i + 1][j + 1] == a[i + 1][j]) {
o1 = false;
}
}
}
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
if (a[i][j] >= 2048) {
o2 = true;
}
}
}
return o1 ? o1 : (o2 - over) * 2;
}
int main() {
start();
rd();
print();
while (1) {
switch (check()) {
case 1:
cout << "你输了。\n想要再来一次吗?" << endl;
start();
rd();
print();
break;
case 2:
cout << "你赢了。还要继续吗?" << endl;
cout << "按a继续游戏,按b重新开始" << endl;
char c;
cin >> c;
if (c == 'a') {
print();
over = 1;
} else if (c == 'b') {
start();
rd();
print();
}
break;
}
char c;
cin >> c;
switch (c) {
case 'a':
if (moveLeft() || mergeLeft()) {
break;
} else {
continue;
}
case 'd':
if (moveRight() || mergeRight()) {
break;
} else {
continue;
}
case 'w':
if (moveUp() || mergeUp()) {
break;
} else {
continue;
}
case 's':
if (moveDown() || mergeDown()) {
break;
} else {
continue;
}
default:
continue;
}
rd();
print();
}
return 0;
}