我无聊的时候玩2048时总是觉得自由度太低。。。
所以我就想要自己编一个。。。
然后就有了这个
应该是没有BUG了。。。至少我自己玩是没有的
我把我这个和网上的一些对比了一下。。。
貌似我的好点啊,可以记录最高分,还有彩色的块
不多说了。。。直接上代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<queue>
#include<list>
#include<stack>
#include<set>
#include<map>
#include<string>
#include<algorithm>
#include<functional>
#include<bitset>
#include<ctime>
#include<stdio.h>
#include<time.h>
#include"iostream"
#include"cstdio"
#include"ctime"
#include"algorithm"
#include"string"
#include"cstring"
#include"map"
#include"set"
#include"stack"
#include"bitset"
#include"list"
#include"queue"
#include"vector"
#include"cmath"
#include"functional"
#include"cstdlib"
#include"bitset"
#include"stdio.h"
#include"time.h"
#include<windows.h>
#include<conio.h>
#include<dir.h>
#include<process.h>
#define up 1
#define down 2
#define left 3
#define right 4
using namespace std;
void color(int a){//改变字体颜色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
/*
字
1 深蓝色
2 深绿色
3 深青色
4 深红色
5 深粉色
6 深黄色
7 深白色
8 灰色
9 浅蓝色
10 浅绿色
11 浅青色
12 浅红色
13 浅粉色
14 浅黄色
15 浅白色
背景
1~15 黑色
16~31 深蓝色
32~47 深绿色
48~63 深青色
64~79 深红色
80~95 深粉色
96~111 深黄色
112~127 深白色
128~143 灰色
144~159 浅蓝色
160~175 浅绿色
176~191 浅青色
192~207 浅红色
208~223 浅粉色
224~239 浅黄色
240~255 浅白色
*/
}
void set_color(int num){//初始化数字块的颜色,我只弄到了4096
if(num==0){
color(0);
return;
}
if(num==2){
color(112);
return;
}
if(num==4){
color(96);
return;
}
if(num==8){
color(224);
return;
}
if(num==16){
color(80);
return;
}
if(num==32){
color(208);
return;
}
if(num==64){
color(64);
return;
}
if(num==128){
color(192);
return;
}
if(num==256){
color(16);
return;
}
if(num==512){
color(48);
return;
}
if(num==1024){
color(176);
return;
}
if(num==2048){
color(144);
return;
}
if(num==4096){
color(160);
return;
}
}
void del(int num){//退格(这个非常好用)
for(int i=0; i<num; i++){
printf("\b \b");
}
}
struct node{//用来保存最高分
int val;
string name;
}high[3];
int edge=4;//边长
int game[110][110];//用来保存游戏状态的
int x=1,y=1;//生成新的数的位置
int num=0,score=0;//步数与分数
bool f=true;//是否刷新
void print_screen(){//输出此时状态
system("cls");
color(8);
printf("┏");
for(int i=1; i<=edge; i++){
printf("━━━┳");
}
del(2);
printf("┓\n");
for(int i=1; i<=edge; i++){
printf("┃");
for(int j=1; j<=edge; j++){
set_color(game[i][j]);
printf(" ");
color(8);
printf("┃");
}
printf("\n");
printf("┃");
for(int j=1; j<=edge; j++){
set_color(game[i][j]);
if(game[i][j]!=0)printf("% 5d ",game[i][j]);
else printf(" ");
color(8);
printf("┃");
}
printf("\n");
printf("┃");
for(int j=1; j<=edge; j++){
set_color(game[i][j]);
printf(" ");
color(8);
printf("┃");
}
printf("\n");
if(i!=edge){
printf("┣");
for(int j=1; j<=edge; j++){
printf("━━━╋");
}
del(2);
printf("┫\n");
}
}
printf("┗");
for(int i=1; i<=edge; i++){
printf("━━━┻");
}
del(2);
printf("┛\n");
printf("步数:%d\n",num);
printf("得分:%d\n",score);
}
void randxy(){//随机生成一个新的数字2或4
do{
x=rand()%edge+1;
y=rand()%edge+1;
}while(game[x][y]!=0);
int num=rand()%10;
if(num>=2)game[x][y]=2;
else game[x][y]=4;
}
bool check(){//判断是否死亡
for(int i=1; i<=edge; i++){
for(int j=1; j<=edge; j++){
if(game[i][j]==0){
return true;
}
}
}
for(int i=1; i<=edge; i++){
for(int j=1; j<=edge; j++){
if(i-1>=1 && game[i-1][j]==game[i][j])return true;
if(j-1>=1 && game[i][j-1]==game[i][j])return true;
if(i+1<=edge && game[i+1][j]==game[i][j])return true;
if(j+1<=edge && game[i][j+1]==game[i][j])return true;
}
}
return false;
}
bool check_move(int num){//判断是否可以移动,决定是否刷新
vector<int>v;
bool f1=false;
if(num==up){
for(int j=1; j<=edge; j++){
f1=false;
for(int i=1; i<=edge; i++){
if(game[i][j]!=0 && f1==true)return true;
if(game[i][j]!=0)v.push_back(game[i][j]);
else f1=true;
}
for(int i=0; i<v.size(); i++){
if(i+1<v.size() && v[i]==v[i+1]){
return true;
}
}
v.clear();
}
}
if(num==down){
for(int j=1; j<=edge; j++){
f1=false;
for(int i=edge; i>=1; i--){
if(game[i][j]!=0 && f1==true)return true;
if(game[i][j]!=0)v.push_back(game[i][j]);
else f1=true;
}
for(int i=0; i<v.size(); i++){
if(i+1<v.size() && v[i]==v[i+1]){
return true;
}
}
v.clear();
}
}
if(num==left){
for(int i=1; i<=edge; i++){
f1=false;
for(int j=1; j<=edge; j++){
if(game[i][j]!=0 && f1==true)return true;
if(game[i][j]!=0)v.push_back(game[i][j]);
else f1=true;
}
for(int j=0; j<v.size(); j++){
if(j+1<v.size() && v[j]==v[j+1]){
return true;
}
}
v.clear();
}
}
if(num==right){
for(int i=1; i<=edge; i++){
f1=false;
for(int j=edge; j>=1; j--){
if(game[i][j]!=0 && f1==true)return true;
if(game[i][j]!=0)v.push_back(game[i][j]);
else f1=true;
}
for(int j=0; j<v.size(); j++){
if(j+1<v.size() && v[j]==v[j+1]){
return true;
}
}
v.clear();
}
}
return false;
}
void Merge(int num){//移动后合并
vector<int>v;
if(num==up){
for(int j=1; j<=edge; j++){
for(int i=1; i<=edge; i++){
if(game[i][j]!=0)v.push_back(game[i][j]);
game[i][j]=0;
}
for(int i=0; i<v.size(); i++){
if(i+1<v.size() && v[i]==v[i+1]){
v[i]+=v[i];
f=true;
score+=v[i];
for(int k=i+1; k<v.size(); k++){
if(k+1<v.size()){
v[k]=v[k+1];
}
}
v.pop_back();
}
}
for(int i=1; i<=v.size(); i++){
game[i][j]=v[i-1];
}
v.clear();
}
}
if(num==down){
for(int j=1; j<=edge; j++){
for(int i=edge; i>=1; i--){
if(game[i][j]!=0)v.push_back(game[i][j]);
game[i][j]=0;
}
for(int i=0; i<v.size(); i++){
if(i+1<v.size() && v[i]==v[i+1]){
v[i]+=v[i];
f=true;
score+=v[i];
for(int k=i+1; k<v.size(); k++){
if(k+1<v.size()){
v[k]=v[k+1];
}
}
v.pop_back();
}
}
for(int i=edge,k=0; k<v.size(); i--,k++){
game[i][j]=v[k];
}
v.clear();
}
}
if(num==left){
for(int i=1; i<=edge; i++){
for(int j=1; j<=edge; j++){
if(game[i][j]!=0)v.push_back(game[i][j]);
game[i][j]=0;
}
for(int j=0; j<v.size(); j++){
if(j+1<v.size() && v[j]==v[j+1]){
v[j]+=v[j];
f=true;
score+=v[j];
for(int k=j+1; k<v.size(); k++){
if(k+1<v.size()){
v[k]=v[k+1];
}
}
v.pop_back();
}
}
for(int j=1,k=0; k<v.size(); j++,k++){
game[i][j]=v[k];
}
v.clear();
}
}
if(num==right){
for(int i=1; i<=edge; i++){
for(int j=edge; j>=1; j--){
if(game[i][j]!=0)v.push_back(game[i][j]);
game[i][j]=0;
}
for(int j=0; j<v.size(); j++){
if(j+1<v.size() && v[j]==v[j+1]){
v[j]+=v[j];
f=true;
score+=v[j];
for(int k=j+1; k<v.size(); k++){
if(k+1<v.size()){
v[k]=v[k+1];
}
}
v.pop_back();
}
}
for(int j=edge,k=0; k<v.size(); j--,k++){
game[i][j]=v[k];
}
v.clear();
}
}
}
void set_edge(){//选择边长
char c;
system("cls");
printf("请选择边长:\n");
printf("1.4*4\n");
printf("2.5*5\n");
printf("3.6*6\n");
while(1){
c=getch();
if(c=='1'){
edge=4;
break;
}
if(c=='2'){
edge=5;
break;
}
if(c=='3'){
edge=6;
break;
}
}
}
void high_score(){//显示最高分
system("cls");
color(6);
printf("4*4\n");
printf("最厉害的人:");
if(high[0].val)cout<<high[0].name<<endl;
else cout<<"无"<<endl;
printf("获得的分数:%d\n",high[0].val);
printf("\n");
color(9);
printf("5*5\n");
printf("最厉害的人:");
if(high[1].val)cout<<high[1].name<<endl;
else cout<<"无"<<endl;
printf("获得的分数:%d\n",high[1].val);
printf("\n");
color(10);
printf("6*6\n");
printf("最厉害的人:");
if(high[2].val)cout<<high[2].name<<endl;
else cout<<"无"<<endl;
printf("获得的分数:%d\n",high[2].val);
printf("\n");
system("pause");
}
void start(){//游戏开始界面
char c;
kaishi:
system("cls");
color(14);
printf("欢迎进入无聊的2048\n");
color(10);
printf("designed by ");
color(9);
printf("everlasting\n");
color(14);
printf("\n");
color(11);
printf("\n");
printf("1.开始游戏\n");
printf("2.查看高分榜\n");
printf("0.退出游戏\n");
while(1){
c=getch();
if(c=='1'){
break;
}
if(c=='2'){
high_score();
goto kaishi;
}
if(c=='0'){
exit(0);
}
}
}
string finding="C:\\Program Files\\2048.high_score";//最高分的文档存储位置
WIN32_FIND_DATA file;
void dead(){//死后记录下成绩,看是否是最高分
system("cls");
printf("您最后的得分为:%d\n",score);
printf("请留下您的昵称:");
string s;
cin>>s;
if(score>=high[edge-4].val){
high[edge-4].name=s;
high[edge-4].val=score;
}
freopen(finding.c_str(),"w",stdout);
for(int i=0;i<3; i++){
if(high[i].val){
cout<<1<<endl;
cout<<high[i].name<<' '<<high[i].val<<endl;
}
else cout<<0<<endl;
}
}
int main(){
SetConsoleTitle("2048 v2.0 --everlasting");
mkdir("C:\\Program Files (x64)");
SetFileAttributes("C:\\Program Files (x64)",FILE_ATTRIBUTE_HIDDEN);
if(FindFirstFile(finding.c_str(),&file)!=INVALID_HANDLE_VALUE){//如果存在,读入最高分
freopen(finding.c_str(),"r",stdin);
for(int i=0; i<3; i++){
int a;
cin>>a;
high[i].val=0;
if(a==1)cin>>high[i].name>>high[i].val;
}
fclose(stdin);
freopen("CON","r",stdin);
}
srand(time(NULL));
memset(game,0,sizeof(game));
char c;
start();
set_edge();
while(check()){
if(f==true){
randxy();
print_screen();
num++;
}
f=false;
c=getch();
if(c=='H'){
f=check_move(up);
Merge(up);
}
if(c=='P'){
f=check_move(down);
Merge(down);
}
if(c=='K'){
f=check_move(left);
Merge(left);
}
if(c=='M'){
f=check_move(right);
Merge(right);
}
}
dead();
return 0;
}