zoukankan      html  css  js  c++  java
  • 2048小游戏(C语言版)

      1 #include <climits>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <stack>
      5 #include <string>
      6 #include <map>
      7 #include <vector>
      8 #include <cmath>
      9 
     10 
     11 /*
     12 玩法说明:编译运行后,输入一个整数n,表示自己想玩的游戏中是n*n的表格,现在手机上或者电脑上一般都是4*4的,所以我们可以输入4,回车就可以开始游戏了。
     13 
     14 游戏开始后a s d w表示方向左 下 右 上四个方向。 
     15 
     16 正如真实版的2048一样,会输出两个表格,move 表格显示按输入方向平移后的结果,fill 表格显示又随机填充一个格子后的表格
     17 */
     18 using namespace std;
     19 
     20 const int MAXX = 10;
     21 
     22 int box[MAXX][MAXX];
     23 
     24 void moveLeft(int n, bool &ret){
     25     for (int i = 0; i < n; ++i){
     26         for (int j = 0; j < n; ++j){
     27             int k;
     28             for (k = j - 1; k >= 0; --k){
     29                 if (box[i][k] != -1){
     30                     break;
     31                 }
     32             }
     33             box[i][k + 1] = box[i][j];
     34 
     35             if ((k + 1) != j){
     36                 box[i][j] = -1;
     37                 ret = true;
     38             }
     39         }
     40     }
     41 }
     42 
     43 void mergeLeft(int n, bool &ret){
     44     for (int i = 0; i < n; ++i){
     45         for (int j = 0; j < n - 1; ++j){
     46             if (box[i][j] == -1)continue;
     47 
     48             if (box[i][j] == box[i][j + 1]){
     49                 box[i][j] *= 2;
     50                 box[i][j + 1] = -1;
     51                 ret = true;
     52                 ++j;
     53             }
     54         }
     55     }
     56 }
     57 
     58 bool left(int n){
     59     bool ret = false;
     60     moveLeft(n, ret);
     61     mergeLeft(n, ret);
     62     moveLeft(n, ret);
     63     return ret;
     64 }
     65 
     66 void moveRight(int n, bool &ret){
     67     for (int i = 0; i < n; ++i){
     68         for (int j = n - 1; j >= 0; --j){
     69             if (box[i][j] == -1)continue;
     70 
     71             int k;
     72             for (k = j + 1; k < n; ++k){
     73                 if (box[i][k] != -1){
     74                     break;
     75                 }
     76             }
     77 
     78             box[i][k - 1] = box[i][j];
     79             if ((k - 1) != j){
     80                 box[i][j] = -1;
     81                 ret = true;
     82             }
     83         }
     84     }
     85 }
     86 
     87 void mergeRight(int n, bool &ret){
     88     for (int i = 0; i < n; ++i){
     89         for (int j = n - 1; j >0; --j){
     90             if (box[i][j] == -1)continue;
     91 
     92             if (box[i][j] == box[i][j - 1]){
     93                 box[i][j] *= 2;
     94                 box[i][j - 1] = -1;
     95                 ret = true;
     96                 --j;
     97             }
     98         }
     99     }
    100 }
    101 
    102 bool right(int n){
    103     bool ret = false;
    104     moveRight(n, ret);
    105     mergeRight(n, ret);
    106     moveRight(n, ret);
    107     return ret;
    108 }
    109 
    110 void moveUp(int n, bool &ret){
    111     for (int j = 0; j < n; ++j){
    112         for (int i = 0; i < n; ++i){
    113             int k;
    114             for (k = i - 1; k >= 0; --k){
    115                 if (box[k][j] != -1){
    116                     break;
    117                 }
    118             }
    119             box[k + 1][j] = box[i][j];
    120 
    121             if ((k + 1) != i){
    122                 box[i][j] = -1;
    123                 ret = true;
    124             }
    125         }
    126     }
    127 }
    128 
    129 void mergeUp(int n, bool &ret){
    130     for (int j = 0; j < n; ++j){
    131         for (int i = 0; i < n - 1; ++i){
    132             if (box[i][j] == -1)continue;
    133 
    134             if (box[i][j] == box[i + 1][j]){
    135                 box[i][j] *= 2;
    136                 box[i + 1][j] = -1;
    137                 ret = true;
    138                 ++i;
    139             }
    140         }
    141     }
    142 }
    143 
    144 bool up(int n){
    145     bool ret = false;
    146     moveUp(n, ret);
    147     mergeUp(n, ret);
    148     moveUp(n, ret);
    149     return ret;
    150 }
    151 
    152 void moveDown(int n, bool &ret){
    153     for (int j = 0; j < n; ++j){
    154         for (int i = n - 1; i >= 0; --i){
    155             if (box[i][j] == -1)continue;
    156 
    157             int k;
    158             for (k = i + 1; k < n; ++k){
    159                 if (box[k][j] != -1)break;
    160             }
    161 
    162             box[k - 1][j] = box[i][j];
    163 
    164             if ((k - 1) != i){
    165                 box[i][j] = -1;
    166                 ret = true;
    167             }
    168         }
    169     }
    170 }
    171 
    172 void mergeDown(int n, bool &ret){
    173     for (int j = 0; j < n; ++j){
    174         for (int i = n - 1; i > 0; --i){
    175             if (box[i][j] == -1)continue;
    176 
    177             if (box[i][j] == box[i - 1][j]){
    178                 box[i][j] *= 2;
    179                 box[i - 1][j] = -1;
    180                 ret = true;
    181                 --i;
    182             }
    183         }
    184     }
    185 }
    186 
    187 bool down(int n){
    188     bool ret = false;
    189     moveDown(n, ret);
    190     mergeDown(n, ret);
    191     moveDown(n, ret);
    192     return ret;
    193 }
    194 
    195 void line(int n){
    196     for (int i = 0; i < n; ++i){
    197         printf("--------");
    198     }
    199     printf("-");
    200     printf("
    ");
    201 }
    202 
    203 void print(int n){
    204     for (int i = 0; i < n; ++i){
    205         line(n);
    206         for (int j = 0; j < n; ++j){
    207             printf("|");
    208             if (box[i][j] == -1){
    209                 printf("	");
    210                 continue;
    211             }
    212 
    213             printf("%2d	", box[i][j]);
    214         }
    215         printf("|");
    216         printf("
    ");
    217     }
    218     line(n);
    219 }
    220 
    221 bool isFull(int n){
    222     bool mark = true;
    223     for (int i = 0; i < n; ++i){
    224         for (int j = 0; j < n; ++j){
    225             if (box[i][j] == -1){
    226                 mark = false;
    227                 return mark;
    228             }
    229         }
    230     }
    231     return mark;
    232 }
    233 
    234 bool isOver(int n){
    235     if (!isFull(n)){
    236         return false;
    237     }
    238     for (int i = 0; i < n; ++i){
    239         for (int j = 0; j < n; ++j){
    240             if (box[i][j] == box[i][j + 1] || box[i][j] == box[i + 1][j]){
    241                 return false;
    242             }
    243         }
    244     }
    245     return true;
    246 }
    247 
    248 void fillBox(int n){
    249     int i, j, num;
    250 
    251     if (isFull(n)){
    252         return;
    253     }
    254 
    255     while (true){
    256         i = rand() % n;
    257         j = rand() % n;
    258         num = rand() % 2 == 0 ? 2 : 4;
    259 
    260         if (box[i][j] == -1){
    261             box[i][j] = num;
    262             break;
    263         }
    264     }
    265 }
    266 
    267 int main(){
    268     //freopen("in.txt", "r", stdin);
    269     memset(box, -1, sizeof(box));
    270 
    271     int n;
    272     bool mark;
    273     scanf("%d%*c", &n);
    274 
    275     fillBox(n);
    276     fillBox(n);
    277     print(n);
    278 
    279     while (true){
    280         char ch;
    281         scanf("%c%*c", &ch);
    282         if (ch == 'a'){
    283             mark = left(n);
    284         }
    285         else if (ch == 'd'){
    286             mark = right(n);
    287         }
    288         else if (ch == 'w'){
    289             mark = up(n);
    290         }
    291         else if (ch == 's'){
    292             mark = down(n);
    293         }
    294         else{
    295             continue;
    296         }
    297         system("cls");
    298         printf("Move:
    ");
    299         print(n);
    300         if (!mark){
    301             continue;
    302         }
    303         fillBox(n);
    304         printf("Fill:
    ");
    305         print(n);
    306 
    307         if (isOver(n)){
    308             printf("
    
    Game Over!
    
    ");
    309             break;
    310         }
    311     }
    312     
    313     
    314     return 0;
    315 }
  • 相关阅读:
    Vue.js 章6 v-model与表单
    Vue.js 简单购物车开发
    Vue.js实战 章五:内置指令
    Vue stage3
    Vue初接触 stage1
    前端代码的一些恶优化
    websocket介绍 以及 vue websocket使用案例
    回忆一下跨域
    如何使用Flexible这样的一库来完成H5页面的终端适配
    css 输入px单位的数值 直接转换为rem的插件
  • 原文地址:https://www.cnblogs.com/zhjsll/p/3890907.html
Copyright © 2011-2022 走看看