字符游戏-贪吃蛇


贪吃蛇游戏的设计思路很简单,相信有过一些编程经验的同学都不至于束手无策,可在我刚刚接触编程时,这个小小的贪吃蛇游戏可是让我费了不少脑筋,即使软导老师已经把伪代码告诉了我们,我还是花费了好大的功夫。

话不多说,我们现在就开始吧,首先我们整理一下思路。首先打印地图,然后用两个一维数组来表示蛇头的坐标,对蛇身而言用类似队列的方法,在进行操作后,身体上每一块都标名其更前(靠进头部为前)一块的相对位置。其中有个生产食物的函数,我们利用随机数生成函数生成食物坐标,并且判断蛇头是否触碰到食物。同时为了实现蛇的自动行走我们还需要用到while(!kbhit()) +Sleep()的类似结构。下面是我的代码。

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>




#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define WALL_CELL '*'
#define food $


void snake_move();
void output();
int gameover();
void creat_food();
void move(char choice, int snake_location_y[], int snake_location_x[], char map[][12]);
void gotoxy(int x, int y);


char map[12][12] = {
"***********",
"*XXXXH    *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"***********",
};


int snake_length = 5;
int snake_location_x[144] = { 5, 4, 3, 2, 1 };
int snake_location_y[144] = { 1, 1, 1, 1, 1 };
int food_x;
int food_y;




int main() {
creat_food();
char choice;
output();
while (1) {
choice = getch();
      snake_move();
move(choice, snake_location_y, snake_location_x, map);
if (!gameover()) {
printf("gameove\n");
return 0;
}
else {
system("cls");
output();
}
while (!kbhit())
{
Sleep(100);
snake_move();
move(choice, snake_location_y, snake_location_x, map);
if (!gameover()) {
printf("gameove\n");
return 0;
}
else {
system("cls");
output();
}
}
}
return 0;
}


void snake_move() {
int i;
map[snake_location_y[snake_length - 1]][snake_location_x[snake_length - 1]] = ' ';
for (i = snake_length - 1; i > 0; i--) {
snake_location_x[i] = snake_location_x[i - 1];
snake_location_y[i] = snake_location_y[i - 1];
map[snake_location_y[i]][snake_location_x[i]] = 'X';
}
}


int gameover() {
if (snake_location_x[0] == 10 || snake_location_x[0] == 0) {
return 0;
}
if (snake_location_y[0] == 10 || snake_location_y[0] == 0) {
return 0;
}
for (int i = 1; i < snake_length; i++) {
if (snake_location_x[0] == snake_location_x[i] && snake_location_y[0] == snake_location_y[i]) {
return 0;
}
}
return 1;
}
void output() {
for (int i = 0; i <= 11; i++) {
for (int j = 0; j <= 11; j++) {
printf("%c", map[i][j]);
}
printf("\n");
}
}
void creat_food() {
srand((unsigned)(time(NULL)));
food_x = rand() % 9 + 1;
food_y = rand() % 9 + 1;
while (map[food_y][food_x] != ' ') {
food_x = rand() % 9 + 1;
food_y = rand() % 9 + 1;
}
map[food_y][food_x] = '$';
}
void move(char choice, int snake_location_y[], int snake_location_x[], char map[][12])
{
if (choice == 'w') {
snake_location_y[0] -= 1;
map[snake_location_y[0]][snake_location_x[0]] = 'H';
}
if (choice == 's') {
snake_location_y[0] += 1;
map[snake_location_y[0]][snake_location_x[0]] = 'H';
}
if (choice == 'a') {
snake_location_x[0] -= 1;
map[snake_location_y[0]][snake_location_x[0]] = 'H';
}
if (choice == 'd') {
snake_location_x[0] += 1;
map[snake_location_y[0]][snake_location_x[0]] = 'H';
}
if (snake_location_x[0] == food_x && snake_location_y[0] == food_y) {
creat_food();
snake_length++;
snake_location_x[snake_length - 1] = snake_location_x[snake_length - 2];
snake_location_y[snake_length - 1] = snake_location_y[snake_length - 2];
map[snake_location_y[snake_length - 1]][snake_location_x[snake_length - 1]] = 'X';
}
}
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

由于笔者采用的是刷新屏幕的方法,所以在游戏的过程中会出现闪屏的现象,为了解决这个问题,我们需要用到局部刷新的方法,那为何我不用呢?因为博主还不会....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值