C语言项目--贪吃蛇

C语言项目–贪吃蛇之

前情提要:我使用的是Linus环境。在其他编译器上运行可能会有问题。
直接看源码:
大致运行脉络:
在这里插入图片描述

#include <stdlib.h>
#include <curses.h>
#include <pthread.h>

#define UP    1
#define DOWN  -1
#define LEFT  2
#define RIGHT -2

typedef struct Sna
{
        int row;
        int column;
        struct Sna *next;
}Snake;

Snake *head = NULL;
Snake *tail = NULL;
int key;
int dir;

Snake food;

void initFood()
{	//0-19
	//1-18
	int x = rand() % 18 + 1;
	int y = rand() % 18 + 1;
	
	food.row = x;
	food.column = y;
}

//ncurses初始化
void initNcurses()
{
	initscr();
    keypad(stdscr,1);//使用getch获取字符不包括方向键,keypad则是允许能够获取到方向键
	noecho();
}

void addNode(){
	Snake *tempNode = (Snake *)malloc(sizeof(Snake));
	switch(dir){
		case UP:
			tempNode->row = tail->row - 1;
			tempNode->column = tail->column;
			break;
		case DOWN:	
			tempNode->row = tail->row + 1;
			tempNode->column = tail->column;
			break;
		case LEFT:	
			tempNode->row = tail->row;
			tempNode->column = tail->column - 1;
			break;
		case RIGHT:		
			tempNode->row = tail->row;
			tempNode->column = tail->column +1;
			break;
	}
	
	tempNode->next = NULL;
	tail->next = tempNode;
	tail = tempNode;	
}

void initSnakeNode(){
	dir = RIGHT;
	Snake *temp;
	while(head != NULL){
		temp = head;
		head = head->next;
		free(temp);
	}

	head = (Snake *)malloc(sizeof(Snake));

	head->row = 2;
	head->column = 2;
	head->next = NULL;

	tail = head;	
	
	addNode();
	addNode();
}

int hasSnakeNode(int i,int j){
	Snake *p = head;
	while(p != NULL){
		if(p->row == i && p->column == j){
			return 1;
		}
		p = p->next;
	}	
	return 0;
}

int hasFood(int i,int j){
	
	if(food.row == i && food.column == j){
		return 1;
	}
	return 0;	
}

void gamePic()
{	
	int i;
	int j;	
	move(0,0);

	for(i = 0;i < 20;i++){
		if(i == 0 || i == 19){
			for(j = 0;j < 20;j++){
                        	printw("--");
                        }
		}else{
			for(j = 0;j < 21;j++){
                        	if(j == 0 || j == 20){
					printw("|");
				}else if(hasSnakeNode(i,j)){
					printw("[]");
				}else if(hasFood(i,j)){
					printw("##");
				}else{
					printw("  ");
				}
			}
		}
		printw("\n");
	}
	printw("by OaiqOaiqLi");

}

void deleteNode()
{
	Snake *tempNode = head;
	head = head->next;
	free(tempNode);
}

int ifSnakeDie()
{
	Snake *tempNode = head;
	if(tail->row == 0 || tail->row == 20 || tail->column == 0 || tail->column == 20	){
		return 1;
	}

	while(tempNode->next != NULL){
		if(tempNode->row == tail->row && tempNode->column == tail->column){
			return 1;
		}
		tempNode = tempNode->next;
	}

	return 0;
}

void moveSnake()
{
	addNode();
	if(hasFood(tail->row,tail->column)){
		initFood();
	}else{
		deleteNode();
	}

	if(ifSnakeDie()){
		initSnakeNode();		
	}
}

void *refreshPic()
{
	while(1){
		moveSnake();
		gamePic();
		
		refresh();
		usleep(100000);
	}	
}

void turn(int direction)
{
	if(abs(dir) != abs(direction)){
		dir = direction;
	}
	
}

void *changeDir()
{
	while(1){
		key = getch();
		switch(key){
			case KEY_DOWN:
				turn(DOWN);
				break;
			case KEY_UP:
				turn(UP);
				break;
			case KEY_LEFT:
				turn(LEFT);
				break;
			case KEY_RIGHT:
				turn(RIGHT);
				break;
		}	
	}
}

int main()
{	
	pthread_t p1;
	pthread_t p2;
	
	initNcurses();	
	initSnakeNode();
	initFood();

	gamePic();
	
	pthread_create(&p1,NULL,refreshPic,NULL);
	pthread_create(&p2,NULL,changeDir,NULL);

	while(1);

	getch();
	endwin();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值