无聊的时候想尝试写一下小游戏,发现2048看起来是最容易的(无积分) getch():头文件:conio.h;一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车 具体逻辑:(代码整洁之道还没有看,变量命名和逻辑比较混乱) 以下是完整代码:(没精简优化,估计也不会) 大概效果:
主要的点:
system(“cls”): 头文件:stdlib.h;是在C语言程序中,调用系统命令cls完成清屏操作。
以及win的句柄什么的,没怎么学,过段时间仔细看看win32的APIvoid 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(); } }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算