经过一段时间的C语言的学习和实践,我们也可以开始学习写一下简单的小游戏,例如贪吃蛇。
下面来介绍一下我的贪吃蛇;
贪吃蛇分为几个部分:
- 蛇的移动
- 食物的生成
- 蛇的伸长
- 蛇的控制
- 死亡的判断
- 地图的输出
首先是蛇的移动:
分别从4个方向的移动。
void moveup() {
for (i = 0; i < snakeLength - 1; i ++) {
snakeY[i] = snakeY[i + 1];
snakeX[i] = snakeX[i + 1];
}
snakeY[snakeLength - 1] --;
return;
}
void movedown() {
for (i = 0; i < snakeLength - 1; i ++) {
snakeY[i] = snakeY[i + 1];
snakeX[i] = snakeX[i + 1];
}
snakeY[snakeLength - 1] ++;
return;
}
void moveleft() {
for (i = 0; i < snakeLength - 1; i ++) {
snakeY[i] = snakeY[i + 1];
snakeX[i] = snakeX[i + 1];
}
snakeX[snakeLength - 1] --;
return;
}
void moveright() {
for (i = 0; i < snakeLength - 1; i ++) {
snakeY[i] = snakeY[i + 1];
snakeX[i] = snakeX[i + 1];
}
snakeX[snakeLength - 1] ++;
return;
}
然后是食物的随机生成。使用到了伪随机数这一函数。
void put_money() {
moneyx = rand() % 10 + 1;
moneyy = rand() % 10 + 1;
for (i = 0; i < snakeLength; i ++) {
if (moneyx == snakeX[i] && moneyy == snakeY[i]) put_money();
}
return;
}
蛇的伸长应该是关键,我们应该想一下,蛇怎么才可以伸长,我也是参考了别人的代码才知道如何让蛇伸长的。
void if_snake_eat() {
if(snakeX[snakeLength - 1] == moneyx && snakeY[snakeLength - 1] == moneyy){
snake_eat();
put_money();
}
return;
}
void snake_eat() {
score ++;
snakeLength ++;
for (i = snakeLength - 1; i > 1; i --) {
snakeY[i] = snakeY[i - 1];
snakeX[i] = snakeX[i - 1];
}
return;
}
蛇的控制就比较简单了,但是为了不用按ENTER 就可以读取,使用了getch 函数,
void snakeMove(){
Sleep(50);
while(kbhit()) {
move = getch();
}
switch (move) {
case 'w':
case 'W': moveup(); return;
case 'a':
case 'A': moveleft();return;
case 's':
case 'S': movedown(); return;
case 'd':
case 'D': moveright(); return;
}
}
然后是地图的构建和输出
void buildmap() {
for(i = 0; i < 12; i ++) {
map[i][0] = '*';
}
for(i = 0; i < 12; i ++) {
map[i][11] = '*';
}
for(i = 1; i < 11; i ++) {
map[0][i] = '*';
map[11][i] = '*';
}
for (i = 1; i < 11; i ++) {
for (j = 1; j < 11; j ++) {
map[i][j] = ' ';
}
}
for (i = 0; i < snakeLength - 1; i ++) {
map[snakeX[i]][snakeY[i]] = 'X';
}
map[snakeX[snakeLength - 1]][snakeY[snakeLength - 1]] = 'H';
map[moneyx][moneyy] = '$';
}
void printmap() {
for (i = 0; i < 12; i ++) {
for (j = 0; j < 12; j ++) {
printf("%c",map[j][i]);
}
printf("\n");
}
return;
}
最后是死亡的判断
int gameover() {
if (score == 95) {
system("cls");
printf("YOU WIN\n");
buildmap();
printmap();
return 0;
}
if (snakeX[snakeLength - 1] == 11 || snakeX[snakeLength - 1] == 0 || snakeY[snakeLength - 1] == 11 || snakeY[snakeLength - 1] == 0 ) {
system("cls");
printf("GAME OVER\n");
printf("Your score is %d", score);
return 0;
}
for (i = 0; i < snakeLength - 1; i ++) {
if(snakeX[snakeLength - 1] == snakeX[i] && snakeY[snakeLength - 1] == snakeY[i]) {
system("cls");
printf("GAME OVER\n");
printf("Your score is %d", score);
return 0;
}
}
return 1;
}
最后我还为了让蛇能变得最长,写了一个很耍赖的算法,让蛇走Z字形的路径,最后走满了整个地图。
具体代码如下:
void move_auto(void) {
if(move == 'd') {
if (snakeX[snakeLength - 1] == 10) move = 's'; return;
}
if(move == 'a') {
if (snakeX[snakeLength - 1] == 2) {
if (snakeY[snakeLength - 1] != 10) move = 's';
return;
}
if (snakeX[snakeLength - 1] == 1) move = 'w';
}
if (move == 's') {
if (snakeX[snakeLength - 1] == 2) move = 'd';
if (snakeX[snakeLength - 1] == 10) move = 'a';
return;
}
if (move == 'w') {
if (snakeY[snakeLength - 1] == 1) move = 'd';
return;
}
}
这是最终结果
大家也可以自己试着写一下算法,让蛇更快走完。
本人能力有限,只能用最笨的方法咯。