C语言小游戏——贪吃蛇
2017-12-25 20:36
471 查看
经过几个月的c语言的学习,我们一直在用C语言进行计算,在老师给的提示和模板下,我们尝试着进行写了一下类似贪吃蛇这样的游戏,首先,我们先用了标准C语言库写出了一个只能一步一步操控的“蛇”。
接下来,我又为了蛇可以自己动使用了 “windows.h” 中的 sleep ()函数, 又为了可以随机产生食物,使用了 中的 rand() 函数。
最后,我们为了蛇能自己找食物,做了一下尝试,得到最后的智能蛇的代码。
但是,这样的代码还有很多毛病,例如不能防止蛇自己碰到自己的情况的出现,也不能很好地走向食物的方向。
我相信,大家一定可以找到一个更好的让蛇 “智能”起来的方法。
接下来,我又为了蛇可以自己动使用了 “windows.h” 中的 sleep ()函数, 又为了可以随机产生食物,使用了 中的 rand() 函数。
最后,我们为了蛇能自己找食物,做了一下尝试,得到最后的智能蛇的代码。
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> #include <conio.h> #define SNAKE_MAX_LENGTH 100 #define SNAKE_HEAD 'H' #define SNAKE_BODY 'X' #define SNAKE_FOOD 'S' #define BLANK_CELL ' ' #define WALL_CELL '*' void snakeMove(void); void moveup(void); void movedown(void); void moveleft(void); void moveright(void); void put_money(void); void if_snake_eat(void); void buildmap(void); void printmap(void); int gameover(void); void snake_eat(void); void start(void); void moveon(void); void move_auto(void); void lenthright(void); void lenthleft(void); void lenthup(void); void lenthdown(void); int if_die_up(void); int if_die_down(void); int if_die_right(void); int if_die_left(void); char map[12][13]= {"************", "*XXXXH *", "* *", "* *", "* *", "* *", "* *", "* *", "* *", "* *", "* *", "************"}; int score = 0; int snakeX[SNAKE_MAX_LENGTH] = {1,2,3,4,5}; int snakeY[SNAKE_MAX_LENGTH] = {1,1,1,1,1}; int snakeLength = 5; int moneyx; int moneyy; int i,j,k; int lengthright,lengthdown,lengthleft,lengthup; char move = 'd'; int main() { put_money(); start(); while(gameover()) { // snakeMove(); moveon(); if_snake_eat(); buildmap(); system("cls"); printf("score = %d\n", score); printmap(); } } 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 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 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; } 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 ++) { cf3f 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 (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; } void start() { printf("score = %d\n", score); for(i = 0; i < 12; i ++) { for (j = 0; j < 12; j ++) { printf("%c",map[i][j]); } printf("\n"); } } void moveon() { Sleep(500); move_auto(); 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 move_auto() { //本来向右走 if (move == 'd') { if(snakeX[snakeLength - 1] < moneyx) { if (snakeY[snakeLength - 1] < moneyy) { lenthright(); lenthdown(); if(lengthright > lengthdown) move = 's'; } if(snakeY[snakeLength - 1] > moneyy) { lenthup(); lenthright(); if(lengthup < lengthright) move = 'w'; } } if (snakeX[snakeLength - 1] == moneyx) { if (snakeY[snakeLength - 1] < moneyy) move = 's'; else move = 'w'; } if (snakeX[snakeLength - 1] > moneyx) { lenthdown(); lenthup(); if(lengthdown > lengthup) move = 'w'; else move = 's'; } } //本来向左走; if (move == 'a') { if(snakeX[snakeLength - 1] > moneyx) { if (snakeY[snakeLength - 1] < moneyy) { lenthleft(); lenthdown(); if(lengthleft > lengthdown) move = 's'; } if(snakeY[snakeLength - 1] > moneyy) { lenthup(); lenthleft(); if(lengthup < lengthleft) move = 'w'; } } if (snakeX[snakeLength - 1] == moneyx) { if (snakeY[snakeLength - 1] < moneyy) move = 's'; else move = 'w'; } if (snakeX[snakeLength - 1] < moneyx) { lenthdown(); lenthup(); if(lengthdown > lengthup) move = 'w'; else move = 's'; } } //本来向上走; if (move == 'w') { if(snakeY[snakeLength - 1] > moneyy) { if (snakeX[snakeLength - 1] < moneyx) { lenthright(); lenthup(); if(lengthup > lengthright) move = 'd'; } if(snakeX[snakeLength - 1] > moneyx) { lenthup(); lenthleft(); if(lengthleft < lengthup) move = 'a'; } } if (snakeY[snakeLength - 1] == moneyy) { if (snakeX[snakeLength - 1] < moneyx) move = 'd'; else move = 'a'; } if (snakeY[snakeLength - 1] < moneyy) { lenthleft(); lenthright(); if(lengthleft > lengthright) move = 'd'; else move = 'a'; } } //本来向下走; if (move == 's') { if(snakeY[snakeLength - 1] < moneyy) { if (snakeX[snakeLength - 1] < moneyx) { lenthright(); lenthdown(); if(lengthdown > lengthright){ if (if_die_right()) move = 'd'; } } if(snakeX[snakeLength - 1] > moneyx) { lenthdown(); lenthleft(); if(lengthleft < lengthdown) { if (if_die_left()) move = 'a'; } } } if (snakeY[snakeLength - 1] == moneyy) { if (snakeX[snakeLength - 1] < moneyx){ if (if_die_right()) move = 'd'; else move = 'a'; } else { if (if_die_left()) move = 'a'; else move = 'd'; } } if (snakeY[snakeLength - 1] > moneyy) { lenthleft(); lenthright(); if(lengthleft > lengthright){ if (if_die_right()) move = 'd'; else move = 'a'; } else { if (if_die_left()) move = 'a'; else move = 'd'; } } } } void lenthright() { lengthright = (snakeX[snakeLength - 1] + 1 - moneyx) * (snakeX[snakeLength - 1] + 1 - moneyx) + (snakeY[snakeLength - 1] - moneyy) * (snakeY[snakeLength - 1] - moneyy); return; } void lenthdown() { lengthdown = (snakeY[snakeLength - 1] + 1 - moneyy) * (snakeY[snakeLength - 1] + 1 - moneyy) + (snakeX[snakeLength - 1] - moneyx) * (snakeX[snakeLength - 1] - moneyx); return; } void lenthleft() { lengthleft = (snakeX[snakeLength - 1] - 1 - moneyx) * (snakeX[snakeLength - 1] - 1 - moneyx) + (snakeY[snakeLength - 1] - moneyy) * (snakeY[snakeLength - 1] - moneyy); return; } void lenthup() { lengthup = (snakeY[snakeLength - 1] - 1 - moneyy) * (snakeY[snakeLength - 1] - 1 - moneyy) + (snakeX[snakeLength - 1] - moneyx) * (snakeX[snakeLength - 1] - moneyx); return; } int if_die_up() { for (i = 0; i < snakeLength - 1; i ++) { if (snakeX[i] == snakeX[snakeLength - 1] && (snakeY[i] == snakeY[snakeLength - 1] - 1)) return 0; } return 1; } int if_die_down() { for (i = 0; i < snakeLength - 1; i ++) { if (snakeX[i] == snakeX[snakeLength - 1] && (snakeY[i] == snakeY[snakeLength - 1] + 1)) return 0; } return 1; } int if_die_left() { for (i = 0; i < snakeLength - 1; i ++) { if ((snakeX[i] == snakeX[snakeLength - 1] - 1) && snakeY[i] == snakeY[snakeLength - 1]) return 0; } return 1; } int if_die_right() { for (i = 0; i < snakeLength - 1; i ++) { if ((snakeX[i] == snakeX[snakeLength - 1] + 1) && snakeY[i] == snakeY[snakeLength - 1]) return 0; } return 1; }
但是,这样的代码还有很多毛病,例如不能防止蛇自己碰到自己的情况的出现,也不能很好地走向食物的方向。
我相信,大家一定可以找到一个更好的让蛇 “智能”起来的方法。