您的位置:首页 > 编程语言 > C语言/C++

C语言小游戏——贪吃蛇

2017-12-25 20:36 471 查看
经过几个月的c语言的学习,我们一直在用C语言进行计算,在老师给的提示和模板下,我们尝试着进行写了一下类似贪吃蛇这样的游戏,首先,我们先用了标准C语言库写出了一个只能一步一步操控的“蛇”。

接下来,我又为了蛇可以自己动使用了 “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;
}




但是,这样的代码还有很多毛病,例如不能防止蛇自己碰到自己的情况的出现,也不能很好地走向食物的方向。

我相信,大家一定可以找到一个更好的让蛇 “智能”起来的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: