c语言贪吃蛇数组实现
头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include <string.h>
void menu();
void my_printback();
void initsnake();
void snackmove();
void drawsnack();
void playermove();
int judge();
void creatfood();
void eatfood();
void prscore();
主函数
#include"game.h"
int main(void) {
menu();//打印菜单
char input;
input = _getch();//从键盘获取一个输入,不用回车
initsnake();//初始化蛇
while (input==' ') {
system("cls");//刷新控制台
creatfood();//创造食物
if (judge() == 0) {//判断蛇是不是死亡,蛇头触碰边界或者身体
printf(" snack death\n");
break;
}
playermove();//玩家移动 必须玩家先移动,在蛇动,通过玩家移动改变蛇动
snackmove();//蛇动起来 ,如果先蛇动的话,
//打印的是玩家没改变的坐标(假如打印蛇已经挨着边界了,即使玩家移动,此时并不会改变蛇的坐标
//,蛇会向前继续移动一次,打印的是蛇两个身体,蛇头此时挨着边界,再次判断会死亡)
eatfood();//蛇吃食物
drawsnack();//将蛇的坐标赋给背景
my_printback();//打印背景
prscore();
Sleep(1000);//延迟1000毫秒
}
printf("已退出游戏\n");
return 0;
}
游戏函数
#include"game.h"
char background[20][48] = {//注意一个方块占两个字节
"■■■■■■■■■■■■■■■■■■■■■■■\n",//一行用了47个字节
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■■■■■■■■■■■■■■■■■■■■■■■\n",
};
enum { north = -1, south = 1, east = 2, west = -2 };
int food = 1,score=0;
snacklen = 2;//蛇的长度,从0开始
snackboard[20][3] = { 0 };//设置蛇的数组一共20节,每个节点存放x坐标,y坐标,蛇的方向
void menu(){
printf("\n\n\n\n\n\n");
printf("\t\t\t\t\t <<贪吃蛇游戏>>\n");
printf("\t\t\t\t\t<<空格开始游戏>>\n");
printf("\t\t\t\t\t <<0 退出游戏>>\n");
}
void my_printback() {
int i;
for (i = 0; i < 20; i++) {
printf("%s", background[i]);
}
}
void initsnake() {
srand((unsigned int)time(NULL));//这是初始化蛇头坐标
int x = rand() % 18 + 1;//上下边界1-18范围,边框不能取
int y = rand() % 17+ 3;//左右边界3-20,3是为了好的游戏体验,20是右边界,后面还有两个蛇身体
snackboard[0][0] = x;
snackboard[0][1] = y*2;
snackboard[0][2] = west;//设置蛇头,假设都往左边移动
snackboard[1][0] = x;
snackboard[1][1] = y * 2+2;
snackboard[1][2] = west;
snackboard[2][0] = x;
snackboard[2][1] = y * 2+4;
snackboard[2][2] = west;
}
void drawsnack() {
int i;
for (i = 0; snackboard[i][0] != 0; i++) {//当蛇坐标为0时不赋值
strncpy(&background[snackboard[i][0]][snackboard[i][1]], "■", 2);
//将蛇的坐标赋给背景并给改坐标赋方块
}
}
void snackmove() {
for (int j = 0;snackboard[j][0]!=0; j++) {//每次把上一次的蛇清空
strncpy(&background[snackboard[j][0]][snackboard[j][1]], " ", 2);
}
int i=19;
while (snackboard[i][0] == 0) {//确定蛇的最后一个节点
i--;
}
i--;//确定蛇的倒数第二个节点
for (; i >= 0; i--) {
snackboard[i + 1][0] = snackboard[i][0];
snackboard[i + 1][1] = snackboard[i][1];
snackboard[i + 1][2] = snackboard[i][2];
}
if (snackboard[0][2] == west || snackboard[0][2] == east) {//对蛇头位置发生改变,注意在蛇头方向不同需要分情况
snackboard[0][1] += snackboard[0][2];
}
if (snackboard[0][2] == north || snackboard[0][2] == south) {
snackboard[0][0] += snackboard[0][2];
}
}
void playermove(){
if (GetAsyncKeyState('W')) //从键盘获取值,注意必须大写
{
snackboard[0][2] = north;
}
if (GetAsyncKeyState('S')) //从键盘获取值,注意必须大写
{
snackboard[0][2] = south;
}
if (GetAsyncKeyState('A')) //从键盘获取值,注意必须大写
{
snackboard[0][2] = west;
}
if (GetAsyncKeyState('D')) //从键盘获取值,注意必须大写
{
snackboard[0][2] = east;
}
}
int judge() {
if (snackboard[0][0] == 0 || snackboard[0][0] ==19|| snackboard[0][1] == 44 || snackboard[0][1] == 0) {
//判断蛇头坐标是不是等于边界坐标
return 0;
}
for (int i = 1; snackboard[i][0] != 0; i++) {//对蛇身体进行遍历,与蛇头坐标相同就死亡
if (snackboard[0][0] == snackboard[i][0] && (snackboard[0][1] == snackboard[i][1])) {
return 0;
}
}
return 1;
}