当前位置: 首页 > 工具软件 > 2048.c > 使用案例 >

c/c++设计2048小游戏

慕容修伟
2023-12-01

相信很多刚学编程的小伙伴在有了一定知识储备后手开始痒痒了,是不是等着写出人生第一个2048呢~ 下面就由同是初学者的我给大家分享一个简单2048游戏代码 首先,我们需要一个4乘4二维数组来储存每个格子的数字,然后需要一个打印数字的函数,接下来就是玩家操作了,所以我们还需要一个能够上下左右滑动的函数,那合并相同数字之后呢?当然是生成新数字啦,so,还需要一个生成数字的函数(偷偷说一句,这里要用到随机函数,不过很简单的),那玩家要是中途退出游戏怎么办?没错,我们还需要一个退出游戏的函数,而且还要判断输赢,最后还可以计分。嗯,思路大概就是这样。 废话不多说,代码马上送来:

#include
#include<windows.h>//光标移动以及文字颜色需要
#include<time.h>
#include<conio.h>//确认按键函数需要
using namespace std;

const int field=4,field_num=4;//一个格子为四个字符,共有四个格
const int row_length=32;//行的长度
const int rank_length=16;//列的长度
int score=0;//计分
char ch=‘0’;//用来确认退出游戏

//prototype
void cursor_pos(int x, int y);//光标移动
BOOL SetConsoleColor(WORD wAttributes);//设置文字颜色
void square();//4乘4方格
void surface();//界面
void digit_print(int digit[][4]);//打印数字
void new_digit(int digit[][field_num]);//新的数字生成
void move_up(int digit[][field_num]);//上滑
void move_down(int digit[][field_num]);//下滑
void move_right(int digit[][field_num]);//右滑
void move_left(int digit[][field_num]);//左滑
bool move(int digit[][field_num]);//响应玩家操作
void game_start();//游戏开始
bool game_over(int digit[][field_num]);//游戏结束
bool game_win(int digit[][field_num]);//赢了

int main()
{
int choice=1;
while(choice==1)
{
system(“cls”);//清屏
score=0;//更新得分
ch=‘0’;//防止ch为f而退出游戏
surface();//打印界面
SetConsoleColor( FOREGROUND_GREEN|FOREGROUND_RED);//设置数字颜色
game_start();//游戏开始
SetConsoleColor(7 );//恢复默认颜色即白色
cursor_pos(0,rank_length+field);
cout<<“请输入选择:\n1.开始游戏 任意键退出程序\n”;
cin>>choice;
}
}

//definition
void cursor_pos(int x, int y)//光标移动,需要头文件windows.h
{
HANDLE out;
out = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = { SHORT(x),SHORT(y) };
SetConsoleCursorPosition(out, pos);
}
BOOL SetConsoleColor(WORD wAttributes)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (hConsole == INVALID_HANDLE_VALUE)
return FALSE;

return SetConsoleTextAttribute(hConsole, wAttributes);  

}
void surface()
{
square();//4乘4方块
int x,y;
for(y=0;y<rank_length;y++)
{
cursor_pos(row_length+field,y);
cout<<’|’;
}
string rules[4]=
{“滑动方向:上(w/W),下(s/S),左(a/A),右(d/D);退出游戏(f/F)”,
“没滑动一次,所有的数字都往滑动方向靠拢,”,
“相同数字在相撞时会相加,随之空白处新出现一个数字”,
“拼凑出2048这个数字就算赢,若16个格子都是不能叠加的数字就算输!”
};
for(y=0;y<4;y++)//打印规则
{
cursor_pos(row_length+field+1,y);
cout<<rules[y]<<endl;
}
}
void square()
{
int row,rank;
for(rank=0;rank<=rank_length;rank+=field)
for(row=0;row<=row_length;row++)
{
cursor_pos(row,rank);
cout<<’_’;
}
for(row=0;row<=row_length;row+=2*field)
for(rank=0;rank<=rank_length;rank++)
{
if(rank==rank_length)cursor_pos(row,rank);
else cursor_pos(row,rank+1);
cout<<’|’;
}
}

void digit_print(int digit[][field_num])
{

int i,j;
for(i=0;i<field_num;i++)
for(j=0;j<field_num;j++)
{
cursor_pos(i2field+2,jfield+2);
cout<<" ";//格式化,空格要足够覆盖2048 四位
if(digit[i][j]!=0)
{
cursor_pos(i
2field+2,jfield+2);
cout<<digit[i][j];//打印数字
}
}
cursor_pos(0,rank_length+1);
}
void new_digit(int digit[][field_num])
{
bool flag=false;int x,y;
for(y=0;y<field_num;y++)
for(x=0;x<field_num;x++)
if(digit[x][y]0)flag=true;//检查是否全部空格都有数字
if(flag
false)return; //如果是,则不用生成数字

srand(time(NULL));//随机函数
while(1)
{
int i=rand()%field_num,j=rand()%field_num;
//生成0-3区间的数字,与数组等同
if(digit[i][j]0)//在空格生成
{
digit[i][j]=(rand()%4
0)?4:2;//随机生成2和4,生成2的概率较大
break;
}
}
}
void move_up(int digit[][field_num])
{
int x,y,run;
for(x=0;x<field_num;x++)
for(y=0;y<field_num;y++)//首先合并相同数字
{
if(digit[x][y]!=0)
for(run=y+1;run<field_num;run++)//遍历寻找相同数字
if(digit[x][run]!=0)
{
if(digit[x][run]==digit[x][y])//让相同数字合并
{
digit[x][y]=2;digit[x][run]=0;score+=digit[x][y]/2;
}
break;
//无论有没有合并,都要跳出寻找相同数字这以循环,因为中间有数字间隔
}
}
for(x=0;x<field_num;x++)
for(y=0;y<field_num;y++)//然后向指定方向靠拢
{
if(digit[x][y]==0)//找到空格
for(run=y+1;run<field_num;run++)
if(digit[x][run]!=0)
{
digit[x][y]=digit[x][run];digit[x][run]=0;break;//数字移动
}
}
}
void move_down(int digit[][field_num])//同上
{
int x,y,run;
for(x=0;x<field_num;x++)
for(y=field_num-1;y>=0;y–)
{
if(digit[x][y]!=0)
for(run=y-1;run>=0;run–)
if(digit[x][run]!=0)
{
if(digit[x][run]==digit[x][y])
{
digit[x][y]
=2;digit[x][run]=0;score+=digit[x][y]/2;
}
break;
}
}
for(x=0;x<field_num;x++)
for(y=field_num-1;y>=0;y–)
{
if(digit[x][y]==0)
for(run=y-1;run>=0;run–)
if(digit[x][run]!=0)
{
digit[x][y]=digit[x][run];digit[x][run]=0;break;
}
}
}
void move_left(int digit[][field_num])//同上
{
int x,y,run;
for(y=0;y<field_num;y++)
for(x=0;x<field_num;x++)
{
if(digit[x][y]!=0)
for(run=x+1;run<field_num;run++)
if(digit[run][y]!=0)
{
if(digit[run][y]==digit[x][y])
{
digit[x][y]=2;digit[run][y]=0;score+=digit[x][y]/2;
}
break;
}
}
for(y=0;y<field_num;y++)
for(x=0;x<field_num;x++)
{
if(digit[x][y]==0)
for(run=x+1;run<field_num;run++)
if(digit[run][y]!=0)
{
digit[x][y]=digit[run][y];digit[run][y]=0;break;
}
}
}
void move_right(int digit[][field_num])//同上
{
int x,y,run;
for(y=0;y<field_num;y++)
for(x=field_num-1;x>=0;x–)
if(digit[x][y]!=0)
for(run=x-1;run>=0;run–)
if(digit[run][y]!=0)
{
if(digit[run][y]==digit[x][y])
{
digit[x][y]
=2;digit[run][y]=0;score+=digit[x][y]/2;
}
break;
}
for(y=0;y<field_num;y++)
for(x=field_num-1;x>=0;x–)
if(digit[x][y]0)
for(run=x-1;run>=0;run–)
if(digit[run][y]!=0)
{
digit[x][y]=digit[run][y];digit[run][y]=0;break;
}
}
bool move(int digit[][field_num])
{
int x,y,run;
if (_kbhit())//检查是否有按键
{
switch (_getch())//检查方向字符
{
case ‘w’:
case ‘W’:move_up(digit);break;
case ‘s’:
case ‘S’:move_down(digit);break;
case ‘a’:
case ‘A’:move_left(digit);break;
case ‘d’:
case ‘D’:move_right(digit);break;
case ‘f’:
case ‘F’:ch=‘f’;//用来退出游戏
default :return false;//其他按键无效
}
return true;
}
}
void game_start()
{
int digit[field_num][field_num]={0};
digit[0][0]=digit[0][1]=2;
digit_print(digit);//初始数字
while(1)
{
if(game_win(digit))return;
if(move(digit))//有效方向按键
{
new_digit(digit);
digit_print(digit);
cursor_pos(row_length+field+1,field+1);
cout<<“得分:”<<score;
}
if(game_over(digit))return;
}
}
bool game_over(int digit[][field_num])
{
int x,y;
if(ch
’f’)//如果按了F或f,则退出游戏
{
cursor_pos(row_length+field+1,field+1);
cout<<“游戏结束!”;
cursor_pos(row_length+field+1,field+2);
cout<<“您的得分为:”<<score;
return true;
}
//判断是否已经满格并且已无法合并

for(x=0;x<field_num-1;x++)
for(y=0;y<field_num-1;y++)//检查前三行三列
if(digit[x][y]==0||digit[x][y]==digit[x+1][y]
||digit[x][y]==digit[x][y+1])return false;

y=field_num-1;//检查第四行
for(x=0;x<field_num-1;x++)
if(digit[x][y]==digit[x+1][y]||digit[x][y]==0||digit[x+1][y]==0)return false;

x=field_num-1;//检查第四列
for(y=0;y<field_num-1;y++)
if(digit[x][y]==digit[x][y+1]||digit[x][y]==0||digit[x][y+1]==0)return false;
//满格且已经无法合并,游戏结束
cursor_pos(row_length+field+1,field+1);
cout<<“游戏结束!”;
cursor_pos(row_length+field+1,field+2);
cout<<“您的得分为:”<<score;
return true;
}
bool game_win(int digit[][field_num])
{
int x,y;
for(x=0;x<field_num;x++)
for(y=0;y<field_num;y++)
if(digit[x][y]==2048)//出现2048,赢了
{
cursor_pos(row_length+field+1,field+1);
cout<<“恭喜恭喜!您赢了!”;
cursor_pos(row_length+field+1,field+2);
cout<<“您的得分为:”<<score;
return true;
}
return false;
}

注:本人是在dev c++编译器里编译上述代码的,其实其他编译器也无妨,毕竟是兼容的。本人也是初学者,还请各位大神指教。

 类似资料: