自己想改一改,结果发现不能这样,,写出来是错误的,
双字符不能这样弄。。。
1 //简单的控制台 贪吃蛇 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<conio.h> 5 #include<time.h> 6 #include<string.h> 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 else 169 { 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 else 192 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 else 206 over = 1; 207 }