C 数组游戏之字母爬方格

󰃭 2016-06-02

导读

基于目前已经学习的C语言的知识, 写了一个游戏(游戏规则参考 《C语言程序设计现代方法 第二版的第八章的编程题9》)

规则

编写程序, 生成一种贯穿10 x 10 字符数组(初始时权威字符*), 程序必须随机地从一个元素“走”到顶一个元素, 每次都向上,向下,向左或向右移动一个元素位置。已访问过的元素按访问顺序用字符AZ进行标记,输出的例子如下:

 A  B  C  Z  *  *  *  *  *  *
 *  *  D  Y  *  *  *  *  *  *
 G  F  E  X  W  V  U  T  *  *
 H  I  J  K  L  *  *  S  *  *
 *  *  *  *  M  N  O  R  *  *
 *  *  *  *  *  *  P  Q  *  *
 *  *  *  *  *  *  *  *  *  *
 *  *  *  *  *  *  *  *  *  *
 *  *  *  *  *  *  *  *  *  *
 *  *  *  *  *  *  *  *  *  *

注意, 如果移动到某个位置后 , 上下左右四个位置都已经移动过了, 即四周都被堵住了, 游戏就得提前结束了.

思路

  1. 游戏起点是位于x=0,y=0
  2. 移动方向是随机的4个方向
  3. 每次移动前要判断是否还有位置可以移动,即四个方向是否还有未走过的元素位置
  4. 移动好位置后要继续下一个字母的移动
  5. 打印输出

程序

#include <stdio.h>
#include <stdlib.h>
#define LEN 10
#define DIR_NUM 4 /*0=>up,1=>right,2=>down,3=>left*/
#define True 1
#define False 0
typedef int bool;

int main(void)
{
    /*
    * n 表示10 x 10的方格
    * s 表示每次移动的字母字符
    * r 表示每次随机的移动的方向,0=>up,1=>right,2=>down,3=>left
    * x,y 分表表示n 数组即方格  x,y 的 索引位置
    */
    int n[LEN][LEN] = {0}, s, r, x=0,y=0;
    
    /*用于判断上下左右的位置是否均无路可走*/
    bool bool_p[4] = {True, True, True, True}; 

    n[0][0] = 'A';
    srand((unsigned) time(NULL));
    s = 'B';
    while(s <= 'Z'){

        /*
         * 判断还是否有路可走
         */
        if (y-1 < 0 || n[x][y-1] != 0){
            bool_p[0] = False;
        }

        //printf("[%d][%d]=%d\n",x+1, y,n[x+1][y]);

        if(x+1 > 9 || n[x+1][y] != 0){
            bool_p[1] = False;
        }

        if(y+1 > 9 || n[x][y+1] != 0){
            bool_p[2] = False;
        }

        if(x-1 < 0 || n[x-1][y] != 0){
            bool_p[3] = False;
        }

        if(!bool_p[0] && !bool_p[1] && !bool_p[2] && !bool_p[3]){
            break;
        }

        bool_p[0] = True;
        bool_p[1] = True;
        bool_p[2] = True;
        bool_p[3] = True;

        r = rand() % DIR_NUM;
        switch(r){
            case(0):
                /*如果移动的方向过界或者已经移动过了, 重新获取方向并移动位置*/
                /*下同*/
                if(y-1 >= 0 && n[x][y-1] == 0){ 
                	
                    n[x][--y] = s;
                    s++;
                }
                break;
            case(1):
                if(x+1 <= 9 && n[x+1][y] == 0){
                    n[++x][y] = s;
                    s++;
                }
                break;
            case(2):
                if(y+1 <= 9 && n[x][y+1] == 0){
                    n[x][++y] = s;
                    s++;
                }
                break;
            case(3):
                if(x-1 >=0 && n[x-1][y] == 0){
                    n[--x][y] = s;
                    s++;
                }
                break;
        }
    }

    for(x=0; x<LEN; x++){
        for(y=0;y<LEN;y++){
            if(n[x][y] != 0){
                printf("%3c",n[x][y]);
            }else{
                printf("%3c",'*');
            }
        }
        printf("\n");
    }
}

效果

A  *  *  *  *  *  *  *  *  *
B  *  *  *  *  *  *  Y  X  *
C  D  E  F  G  *  *  Z  W  V
*  *  J  I  H  *  *  Q  R  U
*  *  K  L  M  N  O  P  S  T
*  *  *  *  *  *  *  *  *  *
*  *  *  *  *  *  *  *  *  *
*  *  *  *  *  *  *  *  *  *
*  *  *  *  *  *  *  *  *  *
*  *  *  *  *  *  *  *  *  *

补充

这里是刚写的代码, 还未完整的优化, 比如变量初始话。

程序开始的时候用0表示默认的*的位置, 最后输出的时候转换一下即可

如果文章有问题,欢迎指正