無聊的時候想嘗試寫一下小遊戲,發現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();
}
}
大概效果: