• 我的小游戏之2048


      八月初心血来潮,花了一天时间写了一个控制台版的2048。代码很烂,玩到后面会有延迟现象。先做下记录,以后有时间把移动和合并的代码再优化下。

      代码如下: 

      1 #include<iostream>
      2 #include <iomanip>
      3 #include<cstring>
      4 #include<cstdlib>
      5 #include<ctime>
      6 using namespace std;
      7 
      8 class Board {
      9     public:
     10         int board[4][4];  //棋盘数组 
     11         int n;  //已存在数字个数 
     12         Board();  //构造函数
     13         void randx();  //随机生成数字2/4
     14         void print();  //打印棋盘
     15         bool check();  //检查是否GameOver 
     16         bool up();  //向上操作 
     17         bool down();  //向下操作
     18         bool left();  //向左操作
     19         bool right();  //向右操作
     20 };
     21 
     22 Board::Board()  //构造函数 
     23 {
     24     memset(board,0,sizeof(board));  //初始化为0 
     25     n=0;    
     26 }
     27 void Board::randx()  //随机生成数字2/4 
     28 {
     29     while(true)
     30     {
     31         srand(time(NULL)); 
     32         int x=rand()%16;  //产生随机次序 
     33         if(board[x/4][x%4]==0)
     34         {
     35             srand(time(NULL)); 
     36             board[x/4][x%4]=rand()%2==0?2:4;  //产生随机数字2/4 
     37             n++;
     38             break;
     39         }
     40     }
     41 }
     42 void Board::print() //打印棋盘 
     43 {
     44     int i,j,k;
     45     for(i=0;i<4;i++)
     46     {
     47         for(k=0;k<33;k++)  //打印棋盘符'-' 
     48             cout<<'-'; 
     49         cout<<endl;
     50         for(j=0;j<4;j++)
     51         {
     52             if(board[i][j]==0)  //打印棋子 
     53                 cout<<"| "<<setw(6)<<" ";
     54             else
     55                 cout<<"| "<<setw(5)<<board[i][j]<<" ";
     56         }
     57         cout<<"|"<<endl;
     58     }
     59     for(k=0;k<33;k++)
     60             cout<<'-'; 
     61     cout<<endl;
     62 } 
     63 bool Board::check()  //检查是否GameOver 
     64 {
     65     bool flag=true;
     66     for(int i=0;flag==true,i<4;i++) 
     67         for(int j=0;flag==true,j<4;j++)
     68         {
     69             if(j<3&&board[i][j]==board[i][j+1])  //是否存在左右相等 
     70                 flag=false;
     71             if(i<3&&board[i][j]==board[i+1][j])  //是否存在上下相等 
     72                 flag=false;
     73         } 
     74     return flag;
     75 }
     76 bool Board::up()  //向上操作
     77 {
     78     int i,j;
     79     bool flag=false;
     80     for(j=0;j<4;j++){
     81         if(board[0][j]&&board[1][j]&&board[2][j]&&board[3][j])
     82             continue;
     83         for(i=1;i<=3;i++)
     84         {
     85             if(board[i][j]==0)
     86                 continue;
     87             int k=0;
     88             while(k<i&&board[k][j])k++;
     89             if(k<i)
     90             {
     91                 board[k][j]=board[i][j];
     92                 board[i][j]=0;
     93                 flag=true;
     94             }
     95         }
     96     }
     97     for(j=0;j<4;j++)  //向上合并 
     98     {
     99         if(board[0][j]&&board[1][j]&&board[0][j]==board[1][j])  //上1上2相等 
    100         {
    101             board[0][j]*=2;
    102             flag=true;
    103             if(board[2][j]&&board[3][j]&&board[2][j]==board[3][j])
    104             {
    105                 board[1][j]=board[2][j]*2;
    106                 board[2][j]=board[3][j]=0;
    107                 n-=2;
    108             }
    109             else
    110             {
    111                 board[1][j]=board[2][j];
    112                 board[2][j]=board[3][j];
    113                 board[3][j]=0;
    114                 n--;
    115             }
    116         }
    117         else
    118         {
    119             if(board[1][j]&&board[2][j]&&board[1][j]==board[2][j])  //中间相等 
    120             {
    121                 board[1][j]*=2;
    122                 board[2][j]=board[3][j];
    123                 board[3][j]=0;
    124                 flag=true;
    125                 n--;
    126             }
    127             else
    128             {
    129                 if(board[2][j]&&board[3][j]&&board[2][j]==board[3][j])  //下1下2相等 
    130                 {
    131                     board[2][j]*=2;
    132                     board[3][j]=0;
    133                     flag=true;
    134                     n--;
    135                 }
    136             }
    137         }
    138     }
    139     return flag;
    140 }
    141 bool Board::down()  //向下操作
    142 {
    143     int i,j;
    144     bool flag=false;
    145     for(j=0;j<4;j++){
    146         if(board[0][j]&&board[1][j]&&board[2][j]&&board[3][j])
    147             continue;
    148         for(i=2;i>=0;i--)
    149         {
    150             if(board[i][j]==0)
    151                 continue;
    152             int k=3;
    153             while(k>i&&board[k][j])k--;
    154             if(k>i)
    155             {
    156                 board[k][j]=board[i][j];
    157                 board[i][j]=0;
    158                 flag=true;
    159             }
    160         }
    161     }
    162     for(j=0;j<4;j++)  //向下合并 
    163     {
    164         if(board[3][j]&&board[2][j]&&board[3][j]==board[2][j])  //下1下2相等 
    165         {
    166             board[3][j]*=2;
    167             flag=true;
    168             if(board[1][j]&&board[0][j]&&board[1][j]==board[0][j])
    169             {
    170                 board[2][j]=board[1][j]*2;
    171                 board[1][j]=board[0][j]=0;
    172                 n-=2;
    173             }
    174             else
    175             {
    176                 board[2][j]=board[1][j];
    177                 board[1][j]=board[0][j];
    178                 board[0][j]=0;
    179                 n--;
    180             }
    181         }
    182         else
    183         {
    184             if(board[2][j]&&board[1][j]&&board[2][j]==board[1][j])  //中间相等 
    185             {
    186                 board[2][j]*=2;
    187                 board[1][j]=board[0][j];
    188                 board[0][j]=0;
    189                 flag=true;
    190                 n--;
    191             }
    192             else
    193             {
    194                 if(board[1][j]&&board[0][j]&&board[1][j]==board[0][j])  //上1上2相等 
    195                 {
    196                     board[1][j]*=2;
    197                     board[0][j]=0;
    198                     flag=true;
    199                     n--;
    200                 }
    201             }
    202         }
    203     }
    204     return flag;
    205 }
    206     
    207 bool Board::left()  //向左操作
    208 {
    209     int i,j;
    210     bool flag=false;
    211     for(i=0;i<4;i++){
    212         if(board[i][0]&&board[i][1]&&board[i][2]&&board[i][3])
    213             continue;
    214         for(j=1;j<=3;j++)
    215         {
    216             if(board[i][j]==0)
    217                 continue;
    218             int k=0;
    219             while(k<j&&board[i][k])k++;
    220             if(k<j)
    221             {
    222                 board[i][k]=board[i][j];
    223                 board[i][j]=0;
    224                 flag=true;
    225             }
    226         }
    227     }
    228     for(i=0;i<4;i++)  //向左合并 
    229     {
    230         if(board[i][0]&&board[i][1]&&board[i][0]==board[i][1])  //左1左2相等 
    231         {
    232             board[i][0]*=2;
    233             flag=true;
    234             if(board[i][2]&&board[i][3]&&board[i][2]==board[i][3])
    235             {
    236                 board[i][1]=board[i][2]*2;
    237                 board[i][2]=board[i][3]=0;
    238                 n-=2;
    239             }
    240             else
    241             {
    242                 board[i][1]=board[i][2];
    243                 board[i][2]=board[i][3];
    244                 board[i][3]=0;
    245                 n--;
    246             }
    247         }
    248         else
    249         {
    250             if(board[i][1]&&board[i][2]&&board[i][1]==board[i][2])  //中间相等 
    251             {
    252                 board[i][1]*=2;
    253                 board[i][2]=board[i][3];
    254                 board[i][3]=0;
    255                 flag=true;
    256                 n--;
    257             }
    258             else
    259             {
    260                 if(board[i][2]&&board[i][3]&&board[i][2]==board[i][3])  //右1右2相等 
    261                 {
    262                     board[i][2]*=2;
    263                     board[i][3]=0;
    264                     flag=true;
    265                     n--;
    266                 }
    267             }
    268         }
    269     }
    270     return flag;
    271 }
    272 bool Board::right()  //向右操作
    273 {
    274     int i,j;
    275     bool flag=false;
    276     for(i=0;i<4;i++){
    277         if(board[i][0]&&board[i][1]&&board[i][2]&&board[i][3])
    278             continue;
    279         for(j=2;j>=0;j--)
    280         {
    281             if(board[i][j]==0)
    282                 continue;
    283             int k=3;
    284             while(k>j&&board[i][k])k--;
    285             if(k>j)
    286             {
    287                 board[i][k]=board[i][j];
    288                 board[i][j]=0;
    289                 flag=true;
    290             }
    291         }
    292     }
    293     for(i=0;i<4;i++)  //向右合并 
    294     {
    295         if(board[i][3]&&board[i][2]&&board[i][3]==board[i][2])  //右1右2相等 
    296         {
    297             board[i][3]*=2;
    298             flag=true;
    299             if(board[i][1]&&board[i][0]&&board[i][1]==board[i][0])
    300             {
    301                 board[i][2]=board[i][1]*2;
    302                 board[i][1]=board[i][0]=0;
    303                 n-=2;
    304             }
    305             else
    306             {
    307                 board[i][2]=board[i][1];
    308                 board[i][1]=board[i][0];
    309                 board[i][0]=0;
    310                 n--;
    311             }
    312         }
    313         else
    314         {
    315             if(board[i][2]&&board[i][1]&&board[i][2]==board[i][1])  //中间相等 
    316             {
    317                 board[i][2]*=2;
    318                 board[i][1]=board[i][0];
    319                 board[i][0]=0;
    320                 flag=true;
    321                 n--;
    322             }
    323             else
    324             {
    325                 if(board[i][1]&&board[i][0]&&board[i][1]==board[i][0])  //左1左2相等 
    326                 {
    327                     board[i][1]*=2;
    328                     board[i][0]=0;
    329                     flag=true;
    330                     n--;
    331                 }
    332             }
    333         }
    334     }
    335     return flag;
    336 }
    337 int main()
    338 {
    339     while(true)
    340     {
    341         system("cls");  
    342         cout<<"Welcome To 2048 !"<<endl;
    343         cout<<"Press w(up)/s(down)/a(left)/d(right)"<<endl;
    344         Board b;
    345         b.randx();  //随机产生两个数字 
    346         b.randx();
    347         b.print(); 
    348         char ch;
    349         while(true)
    350         {
    351             bool flag=false; //判断是否改变标志 
    352             cin>>ch;
    353             switch(ch)
    354             {
    355                 case 'w':  //向上操作
    356                     flag=b.up();
    357                     break;
    358                 case 's':  //向下操作
    359                     flag=b.down();
    360                     break;
    361                 case 'a':  //向左操作
    362                     flag=b.left();
    363                     break;
    364                 case 'd':  //向右操作
    365                     flag=b.right();
    366                     break;
    367                 default:
    368                     break;        
    369             }
    370             if(flag)  //无改变则不随机产生数字 
    371             { 
    372                 b.randx();
    373             }
    374             system("cls"); 
    375             b.print();
    376             if(b.n==16&&b.check())  //判断是否GameOver 
    377                 break;
    378         }
    379         cout<<"Sorry ! Game Over !"<<endl;
    380         cout<<"Try again ?(y/others)"<<endl;
    381         cin>>ch;
    382         if(ch!='y')
    383         break;
    384     }
    385     return 0;
    386 }
  • 相关阅读:
    高德地图SDK大致使用
    AFNetworking 使用
    蓝牙相关
    svn 常用命令
    通过AutoLayout显示三个等宽视图
    适配相关 --AutoLayout ---SizeClass
    常用网页
    UIViewController加载过程
    UIApplication相关
    实现消息转发功能(调用非自己类方法)
  • 原文地址:https://www.cnblogs.com/levicode/p/3925840.html
Copyright © 2020-2023  润新知