/*
贪吃蛇身子节点
1.行坐标
2.列坐标
3.下一个节点的位置(地址/指针)
贪吃蛇身子显示
如何显示蛇身子的一个节点:
设该节点:行坐标2,列坐标为2
if(hang==x.hang && lie==x.lie)
{
printw("[]");
}
*/
#include <curses.h>
#include <stdlib.h>
struct Snake
{
int hang;
int lie;
struct Snake *next;
};
struct Snake *head = NULL;//头和尾巴 全局变量
struct Snake *tail = NULL;
void initNcurse()
{
initscr();
keypad(stdscr,1);
}
int hasSnakeNode(int i, int j)//打印蛇身子
{
struct Snake *p;
p = head;
while(p !=NULL){
if(p->hang==i && p->lie==j){
return 1;
}
p = p->next;
}
return 0;
}
void gamePic()//创建贪吃蛇地图
{
int hang;
int lei;
move(0,0);
for(hang=0;hang<20;hang++){
if(hang==0){//打印0行0列至0行19列为"--"
for(lei=0;lei<20;lei++){
printw("--");
}
printw("\n");//打印完换行
}
if(hang>=0 && hang<19){//打印0行-18行的0列和20列为"|"
for(lei=0;lei<=20;lei++){
if(lei==0 || lei==20){
printw("|");
}else if(hasSnakeNode(hang,lei)){
printw("[]");
}
else{
printw(" ");
}
}
printw("\n");
}
if(hang==19){//打印19行0列至0行19列为"--"
for(lei=0;lei<20;lei++){
printw("--");
}
printw("\n");
printw("Bylonghaiyang");
}
}
}
void addNode()//增加蛇的身子(节点)
{
struct Snake *new =(struct Snake *)malloc(sizeof(struct Snake));
new->hang = tail->hang;
new->lie = tail->lie+1;
new->next = NULL;
tail->next =new;
tail = new;
}
void initSnake()//初始化蛇的身子 2,2
{
struct Snake *p=NULL;
while(head!=NULL){ //如果贪吃蛇撞墙了重新初始化贪吃蛇位置之前 释放掉原来贪吃蛇的内存
p = head;
head = head->next;
free(p);
}
head = (struct Snake *)malloc(sizeof(struct Snake));
head->hang =2;
head->lie =2;
head->next = NULL;
tail = head;//先初始化一个节点行列为2 这个节点既是头又是尾
addNode();//增加蛇的身子(节点)
addNode();
addNode();
}
void deleNode()
{
struct Snake *p;
p = head;
head = head -> next;
free(p);
}
void moveSnake()//移动蛇先在原节点尾部增加一个节点,再删除头节点
{
addNode();
deleNode();
if (tail->hang==0 || tail->lie==0 || tail->hang==20 || tail->lie==20){ //判断贪吃蛇是否撞墙
initSnake();
}
}
int main()
{
int con;
initNcurse();
initSnake();
gamePic();
while(1){
con = getch();//获取键盘动作
if(con == KEY_RIGHT){
moveSnake();//获取向右操作后右移动蛇
gamePic();//移动后地图重新扫描
}
}
getch();
endwin();
return 0;
}
C语言实现贪吃蛇demo7贪吃蛇不想活了撞墙找死.c
最新推荐文章于 2025-07-14 12:06:11 发布