c++實現簡陋版2048(控制檯)

無聊的時候想嘗試寫一下小遊戲,發現2048看起來是最容易的(無積分)
主要的點:

getch():頭文件:conio.h;一個不回顯函數,當用戶按下某個字符時,函數自動讀取,無需按回車
system(“cls”): 頭文件:stdlib.h;是在C語言程序中,調用系統命令cls完成清屏操作。
以及win的句柄什麼的,沒怎麼學,過段時間仔細看看win32的API

具體邏輯:(代碼整潔之道還沒有看,變量命名和邏輯比較混亂)

void logicW()
{
 for(int i=0;i<xy;++i)
 {
  int wasd[xy]={0};
  int hold=0;
  int temp=0;
  for(int j=0;j<xy;++j)//把一行(列)的非零數字拉到一個數組裏
  {
   if(gameNum[j][i])
   {
    wasd[hold++]=gameNum[j][i];
    gameNum[j][i]=0;
   }
  }
  for(int xoy=1;xoy<hold;++xoy)//檢測是否存在相鄰的數字相等,相等則相加
  {
   if(wasd[xoy]==wasd[xoy-1])
   {
    wasd[xoy-1]+=wasd[xoy];
    wasd[xoy]=0;
   }
  }
  for(int xoy=0;xoy<hold;++xoy)//把處理過的數值填充進去
  {
   if(wasd[xoy])
   {
    gameNum[temp++][i]=wasd[xoy];
   }
  }
 }
}

以下是完整代碼:(沒精簡優化,估計也不會)

#include<iostream>
#include<windows.h>
#include<conio.h>
#include<ctime>
#define xy 4
using namespace std;
void console() {
 //win的句柄,用於調整控制檯
 SetConsoleTitle("2048 Bate 1.1   by LDAx");
 HANDLE hand;
 COORD size = {80, 25};
 hand=GetStdHandle(STD_OUTPUT_HANDLE);
 SMALL_RECT rt = {0,0,45,30};
 SetConsoleWindowInfo(hand,true,&rt);
 SetConsoleScreenBufferSize(hand, size);
}
void blueprint() {
 //不放循環直接打吧
 cout<<endl;
 cout<<"      ****     ****         *      ****  "<<endl;
 cout<<"     *    *   *    *      * *     *    * "<<endl;
 cout<<"        *     *    *    *   *      ****  "<<endl;
 cout<<"      *       *    *   * * ** *   *    * "<<endl;
 cout<<"     ******    ****         *      ****  "<<endl;
 cout<<endl;
 cout<<"   **************************************"<<endl;
 cout<<"   **************************************"<<endl;
 cout<<endl;
}
int gameNum[xy][xy]= {0};
//打印數
void pN(int xN,int yN) {
 if(gameNum[xN][yN]) {
  printf("%4d ",gameNum[xN][yN]);
 } else {
  cout<<"     ";
 }
}
//打印圖,有時間改成循環的
void gameprint() {
 cout<<"      -------------------------------   "<<endl;
 cout<<"     |       |       |       |       |  "<<endl;
 cout<<"     | ";
 pN(0,0);
 cout<<" | ";
 pN(0,1);
 cout<<" | ";
 pN(0,2);
 cout<<" | ";
 pN(0,3);
 cout<<" |  "<<endl;
 cout<<"     |       |       |       |       |  "<<endl;
 cout<<"      -------------------------------   "<<endl;
 cout<<"     |       |       |       |       |  "<<endl;
 cout<<"     | ";
 pN(1,0);
 cout<<" | ";
 pN(1,1);
 cout<<" | ";
 pN(1,2);
 cout<<" | ";
 pN(1,3);
 cout<<" |  "<<endl;
 cout<<"     |       |       |       |       |  "<<endl;
 cout<<"      -------------------------------   "<<endl;
 cout<<"     |       |       |       |       |  "<<endl;
 cout<<"     | ";
 pN(2,0);
 cout<<" | ";
 pN(2,1);
 cout<<" | ";
 pN(2,2);
 cout<<" | ";
 pN(2,3);
 cout<<" |  "<<endl;
 cout<<"     |       |       |       |       |  "<<endl;
 cout<<"      -------------------------------   "<<endl;
 cout<<"     |       |       |       |       |  "<<endl;
 cout<<"     | ";
 pN(3,0);
 cout<<" | ";
 pN(3,1);
 cout<<" | ";
 pN(3,2);
 cout<<" | ";
 pN(3,3);
 cout<<" |  "<<endl;
 cout<<"     |       |       |       |       |  "<<endl;
 cout<<"      -------------------------------   "<<endl;
}
//清零
void newGame() {
// for(int i=0;i<xy;++i)
// {
//  for(int j=0;j<xy;++j)
//  {
//   gameNum[i][j]=0;
//  }
// }
 memset(gameNum,0,sizeof(int)*xy*xy);
}

//結束判定
bool gameover() {
 for(int i=0; i<xy; ++i) {
  for(int j=0; j<xy; ++j) {
   if(!gameNum[i][j]) {
    return false;
   }
  }
 }
 cout<<"   ***********  GAME OVER  *************"<<endl;
 cout<<"   *******  press R to new game  *******"<<endl;
 char r;
 do {
  r=getch();
 } while(r!='r'&&r!='R');
 newGame();
 return true;
}

//新數字判定
void newNum() {
 srand((int)time(0));//取時間做種子,這個東西還挺耗時的,別放循環裏
 int xT,yT;
 do {
  xT=rand()%xy;
  yT=rand()%xy;
 } while(gameNum[xT][yT]);
 gameNum[xT][yT]=(rand()%2+1)*2;
}

//WASD的邏輯,考慮四個整合成一個
void logicW() {
 for(int i=0; i<xy; ++i) {
  int wasd[xy]= {0};
  int hold=0;
  int temp=0;
  for(int j=0; j<xy; ++j) {
   if(gameNum[j][i]) {
    wasd[hold++]=gameNum[j][i];
    gameNum[j][i]=0;
   }
  }
  for(int xoy=1; xoy<hold; ++xoy) {
   if(wasd[xoy]==wasd[xoy-1]) {
    wasd[xoy-1]+=wasd[xoy];
    wasd[xoy]=0;
   }
  }
  for(int xoy=0; xoy<hold; ++xoy) {
   if(wasd[xoy]) {
    gameNum[temp++][i]=wasd[xoy];
   }
  }
 }
}
void logicS() {
 for(int i=0; i<xy; ++i) {
  int wasd[xy]= {0};
  int hold=0;
  int temp=xy-1;
  for(int j=0; j<xy; ++j) {
   if(gameNum[j][i]) {
    wasd[hold++]=gameNum[j][i];
    gameNum[j][i]=0;
   }
  }
  for(int xoy=hold-2; xoy>=0; --xoy) {
   if(wasd[xoy]==wasd[xoy+1]) {
    wasd[xoy+1]+=wasd[xoy];
    wasd[xoy]=0;
   }
  }
  for(int xoy=hold-1; xoy>=0; --xoy) {
   if(wasd[xoy]) {
    gameNum[temp--][i]=wasd[xoy];
   }
  }
 }
}
void logicA() {
 for(int i=0; i<xy; ++i) {
  int wasd[xy]= {0};
  int hold=0;
  int temp=0;
  for(int j=0; j<xy; ++j) {
   if(gameNum[i][j]) {
    wasd[hold++]=gameNum[i][j];
    gameNum[i][j]=0;
   }
  }
  for(int xoy=1; xoy<hold; ++xoy) {
   if(wasd[xoy]==wasd[xoy-1]) {
    wasd[xoy-1]+=wasd[xoy];
    wasd[xoy]=0;
   }
  }
  for(int xoy=0; xoy<hold; ++xoy) {
   if(wasd[xoy]) {
    gameNum[i][temp++]=wasd[xoy];
   }
  }
 }
}
void logicD() {
 for(int i=0; i<xy; ++i) {
  int wasd[xy]= {0};
  int hold=0;
  int temp=xy-1;
  for(int j=0; j<xy; ++j) {
   if(gameNum[i][j]) {
    wasd[hold++]=gameNum[i][j];
    gameNum[i][j]=0;
   }
  }
  for(int xoy=hold-2; xoy>=0; --xoy) {
   if(wasd[xoy]==wasd[xoy+1]) {
    wasd[xoy+1]+=wasd[xoy];
    wasd[xoy]=0;
   }
  }
  for(int xoy=hold-1; xoy>=0; --xoy) {
   if(wasd[xoy]) {
    gameNum[i][temp--]=wasd[xoy];
   }
  }
 }
}
void logic(char key)
{
	switch (key){
		case 'r':
		case 'R':
			newGame();
			break;
		case 'w':
		case 'W':
			logicW();
			break;
		case 'a':
		case 'A':
			logicA();
			break;
		case 's':
		case 'S':
			logicS();
			break;
		case 'd':
		case 'D':
			logicD();
			break;
		default :
			key=getch();
			logic(key);
	}
}

int main() {
 console();
 blueprint();
 gameprint();
 while(1) {
  char key;
  key=getch(); //實時讀取key
  logic(key);
  gameover();
  newNum();
  system("cls");
  blueprint();
  gameprint();
 }
}

大概效果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章