自己想改一改,结果发现不能这样,,写出来是错误的,
双字符不能这样弄。。。
1 //简单的控制台 贪吃蛇 2 #include3 #include 4 #include 5 #include 6 #include 7 8 #define H 30 9 #define L 30 10 11 int key; //用来存放按键 12 int length = 1, over = 0; //蛇的长度, 结束 13 int dx[4]={ 0,0,-1,1}; //控制方向,左右,上下 14 int dy[4]={-1,1,0,0};char Sharps[][3] = { "□", "■", "◆", " "};//蛇头,蛇身,食物,空白处。 15 char *GameMap[H*L][3]; 16 17 18 19 struct Snake 20 { 21 int x, y; 22 int dir; //存放当前节点的方向,0,1,2,3分别表示左右上下 23 24 }Snake[H*L]; 25 void Initial();//地图初始化函数 26 void Create_Food();//食物随机产生函数 27 void Game();//游戏函数 28 void Button();//取按键,判断方向函数 29 void Move();//蛇移动函数 30 void Check_Border();//越界检查函数 31 void Check_Head(int x, int y);//蛇头移动检查函数 32 33 34 int main() 35 { 36 Initial(); 37 Game(); 38 39 return 0; 40 } 41 42 43 void Initial() 44 { 45 int i, j; 46 int hx, hy; 47 48 system("title By:Lee Snake");//控制台标题 49 // memset(GameMap, ' ',sizeof(GameMap));//初始化地图全部为空 50 51 system("cls"); 52 srand(time(0)); 53 hx=rand()%H; 54 hy=rand()%L; 55 *GameMap[hx * L+ hy] = "□"; 56 Snake[0].x = hx; 57 Snake[0].y = hy; 58 59 Create_Food(); //随机产生食物 60 61 for(i = 0; i < H; i++) //地图显示 62 { 63 for(j = 0; j < L; j++) 64 printf("%s", *GameMap[i*L+j]); //将蛇头 和 其他 字符 打印出来 65 printf("\n"); 66 } 67 printf("\n小小C语言贪吃蛇\n"); 68 printf("按任意方向键开始游戏\n"); 69 70 getch(); //先接受一个按键,使蛇开始往该方向走 71 Button(); //取出按键,并判断方向 72 } 73 74 75 void Create_Food() 76 { 77 int fx, fy; 78 while(1) 79 { 80 fx=rand()&H; 81 fy=rand()%L; 82 83 if(*GameMap[fx*fy]==" ") 84 { 85 *GameMap[fx*fy] = Sharps[2]; 86 break; 87 } 88 } 89 } 90 91 void Game() 92 { 93 int i, j; 94 95 while(1) 96 { 97 _sleep(200); 98 99 Button();100 Move();101 102 if(over)103 {104 printf("\n\n啊噢,你输了,Gameover !!\n\n");105 printf(" >_<\n");106 getchar();107 break;108 }109 system("cls");110 for(i = 0; i < H; i++)111 {112 for(j = 0; j < L; j++)113 {114 printf("%s", *GameMap[i*L+j]);115 printf("\n");116 }117 118 printf("\n小小C语言贪吃蛇\n");119 printf("按任意方向键开始游戏\n");120 }121 }122 }123 124 void Button()125 {126 if(kbhit()!=0)127 {128 while(kbhit()!=0)129 key = getch();130 131 switch(key)132 {133 case 75: Snake[0].dir = 0; break;134 case 77: Snake[0].dir = 1; break;135 case 72: Snake[0].dir = 2; break;136 case 80: Snake[0].dir = 3; break;137 }138 }139 }140 141 142 143 void Move()144 {145 int i, x, y;146 int tmp = length;147 x = Snake[0].x; 148 y = Snake[0].y; 149 *GameMap[x*L+y] = " ";150 Snake[0].x = Snake[0].x + dx[ Snake[0].dir ];151 Snake[0].y = Snake[0].y + dy[ Snake[0].dir ];152 153 Check_Border(); //蛇头是否越界154 Check_Head(x, y);155 156 if(length == tmp)157 for(i = 1; i < length; i++)158 {159 if(i == 1)160 *GameMap[Snake[i].x * L+Snake[i].y]=" ";161 162 if(i == length - 1)163 {164 Snake[i].x = x;165 Snake[i].y = y;166 Snake[i].dir = Snake[0].dir;167 }168 else169 {170 Snake[i].x = Snake[i+1].x;171 Snake[i].y = Snake[i+1].y;172 Snake[i].dir = Snake[i+1].dir; 173 }174 175 *GameMap[Snake[i].x * L+ Snake[i].y] = Sharps[1];176 }177 178 }179 180 void Check_Border() //检查蛇头是否越界181 {182 if(Snake[0].x < 0 || Snake[0].x >= H || Snake[0].y < 0 || Snake[0].y >= L)183 over = 1;184 }185 186 void Check_Head(int x, int y) //检查蛇头移动后的位置情况187 {188 189 if(*GameMap[ Snake[0].x * L + Snake[0].y ] == " ") //为空190 *GameMap[ Snake[0].x * L + Snake[0].y ] = Sharps[0];191 else192 if(*GameMap[ Snake[0].x * L + Snake[0].y ] == Sharps[2]) //为食物193 {194 *GameMap[ Snake[0].x * L + Snake[0].y ] = Sharps[0];195 196 Snake[length].x = x; //新增加的蛇身为蛇头后面的那个197 Snake[length].y = y;198 Snake[length].dir = Snake[0].dir;199 200 *GameMap[ Snake[length].x * L + Snake[length].y ] = Sharps[1]; 201 length++;202 203 Create_Food(); //食物吃完了马上再产生一个食物204 }205 else206 over = 1;207 }