c语言贪吃蛇

原创 2015年11月21日 18:00:28

这个小游戏,无聊时敲得。

1.运行环境ubuntu版本c89下,基本能兼容。

2.实现了非堵塞的输入。

3.每次吃一个,都会变长

4.采用链表完成

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termio.h>

#define TTY_PATH "/dev/tty"
#define STTY_ON  "stty raw -echo -F"
#define STTY_OFF "stty -raw echo -F"

char map[10][10];
char direct = 'a';
typedef struct node 
{
	int x;
	int y;	
	struct node* next;
}Node;
typedef struct food
{
	int x;
	int y;
}Food;

Node* head;
Food* food;
void init_map()//初始化地图
{
	int i,j;
	for(i = 0; i < 10; i++)
		for(j = 0; j < 10; j++)
		{
			if(i==0||i==9||j==0||j==9)
			{
				map[i][j] = '*';
			}
			else
			{
				map[i][j] = ' ';
			}
		}
}

void print()//打印地图
{
	int i,j;
	for(i = 0; i < 10; i++)
	{
		for(j = 0; j < 10; j++)
		{
			printf(" %c ",map[i][j]);
		}
		printf("\n");
	}
}

void init_snake(int n)//初始化n个长度的贪吃蛇
{
	int i = 0;
	Node* pre;
	Node* node;
	node = (Node*)malloc(sizeof(Node));
	node -> x = 4;
	node -> y = 5;
	node -> next = NULL;
	map[node->x][node->y] = '*';
	pre = node;
	head = pre;
	for( i = 1; i < n; i++)
	{
		Node* node_next;
		node_next = (Node*)malloc(sizeof(Node));
		node_next -> x = 4;
		node_next -> y = i+5;
		node_next -> next = NULL;
		map[node_next->x][node_next->y] = '*';
		pre -> next = node_next;
		pre = pre -> next;
	}
}
void init_food()//初始化食物
{
	if(food == NULL)
	{
		Food* f = (Food*)malloc(sizeof(Food));
		food=f;
	}
	food -> x = rand()%8 + 1;
	food -> y = rand()%8 + 1;
	if(map[food->x][food->y] == '*')
		init_food();
	else
		map[food->x][food->y]='@';
}

void eat_food(int x, int y)//吃掉食物后,生成一个新的食物
{
	Node* pre;
	Node* add_node = (Node*)malloc(sizeof(Node));
	add_node -> x = x;
	add_node -> y = y;
	add_node -> next = NULL;
	map[x][y] = '*';
	pre = head;
	while( pre->next )
		pre = pre -> next;

	pre -> next = add_node;

}
int is_over(int x,int y)//判断是否撞墙,撞尾
{
	if(map[x][y] == '*')
	{
		return 1;
	}
	return 0;
}
void gameover()//游戏结算,清空动态分配空间
{
	Node *pre, *last;
	pre = last = head;
	while (pre)
	{
		pre = pre -> next;
		free(last);
		last = pre;
	}
	free(food);
	food = NULL;
	head = NULL;
}
void move(char ch)//移动
{

	if(direct == ch)
		return;
	if(ch == 'a'|| ch=='s'|| ch=='d' || ch=='w')
		if( !((direct=='a' && ch=='d')||
		(direct=='d' && ch=='a')||
		(direct=='s' && ch=='w')||
		(direct=='w' && ch=='s')))
		direct = ch;

	if( !head )
		exit(-1);
	
	Node *pre,*last;
	pre = head;
	int is_eat = 0;
	int last_x;
	int last_y;
	int x1 = pre -> x;
	int y1 = pre -> y;
	
	switch(direct)
	{
		case 'a':	
			y1--;
			break;
		case 'w':
			x1--;
			break;
		case 's':
			x1++;
			break;
		case 'd':
			y1++;
			break;
	}
	if(is_over(x1,y1))
	{
		gameover();
		printf("game over!!!!!\n");
		exit(0);
	}
	if(map[x1][y1] == '@')
	{
		is_eat = 1;
		init_food();
	}
	map[x1][y1] = '*';

	int x2 = pre -> x;
	int y2 = pre -> y;
	
	while( pre )//通过记录两个点,实现贪吃蛇移动
	{
		pre -> x = x1;
		pre -> y = y1;
		if(!pre->next)
		{
			last_x = x2;
			last_y = y2;
			map[x2][y2] = ' ';
			break;
		}
		pre = pre -> next;

		x1 = pre -> x;
		y1 = pre -> y;

		pre -> x = x2;
		pre -> y = y2;

		if(!pre->next)
		{
			last_x = x1;
			last_y = y1;
			map[x1][y1] = ' ';
			break;
		}
		x2 = pre -> next -> x;
		y2 = pre -> next -> y;
		pre = pre -> next;
	}
	if(is_eat)
		eat_food( last_x , last_y);
}


char in_direct()//非堵塞键盘输入
{
	fd_set fd;
	struct timeval tv;
	char ch;
	FD_ZERO(&fd);
	FD_SET(0, &fd);
	tv.tv_sec = 0;
	tv.tv_usec = 10;
	if(select(1, &fd ,NULL, NULL, &tv) > 0)
	{
		ch = getchar(); 
	}
	return ch;
}


int main()
{
	srand(time(NULL));
	init_map();
	init_snake(3);
	init_food();
	int i = 0;
	char ch;
	for(i = 0;; i++)
	{
		usleep(500000);
		system("clear");
		system(STTY_ON TTY_PATH);
		ch = in_direct();
		system(STTY_OFF TTY_PATH);
		move(ch);
		print();
		fflush(stdout);
	}

	return 0;
}



贪吃蛇C语言代码

贪吃蛇C语言代码贪吃蛇C语言代码 手动贪吃蛇 智能贪吃蛇1.手动贪吃蛇/*蛇越长跑得越快*/ /*作者:SGAFPZ*/ #include #include #include #include ...
  • SGAFPZys
  • SGAFPZys
  • 2016年04月18日 15:37
  • 14054

c语言版贪吃蛇《课程设计》

主要运用了光标的移动-.- 教程会在一个月内发布-.-最近考试好多...... 看代码应该能看懂.... 代码: #include #include #include #include #includ...
  • leibniz_zhang
  • leibniz_zhang
  • 2016年06月28日 10:35
  • 4520

纯C语言实现贪吃蛇游戏(VC6.0)

转自C语言网 今天笔者为大家展示C语言写的贪吃蛇游戏,让大家玩一玩自己写的游戏~ 是纯C语言哦~VC6.0开发 无问题   首先,开始界面: 游戏界面如下: ...
  • gin1008
  • gin1008
  • 2016年10月10日 19:51
  • 35022

C语言之贪吃蛇游戏源码

贪吃蛇游戏是我编程以来做的第一个游戏,很兴奋,我记得当时我一直最求代码数量的最小化,即以最少的代码实现功能,有的时候,对换行、括号之类的都下手,呵呵,现在想想都想笑,那些年让我纠结的代码门,你们现在还...
  • huangminqiang201209
  • huangminqiang201209
  • 2012年12月14日 11:51
  • 30529

贪吃蛇C语言实现(简易版)

一 引言 刚学习完C语言,寒假就迫不及待的学习这个贪吃蛇小程序。不得不说,写完还是大有收获的。 二 基本原理 对于贪吃蛇怎么在屏幕上移动,当初自己也是懵逼,哈哈。其实就是不断刷新屏幕...
  • qq_37074040
  • qq_37074040
  • 2017年01月28日 11:09
  • 15735

一个C语言编写的贪吃蛇游戏

在VC6.0平台上,通过C语言和EasyX图形库编写的贪吃蛇小游戏,为了使用图形库函数,建立的文件是.cpp文件,使用的是C语言编写,游戏具有背景音乐,代码长度500行左右,代码和算法,都是我自己源生...
  • wang_dong001
  • wang_dong001
  • 2015年07月27日 15:59
  • 24048

C语言-手把手教你写贪吃蛇AI(上)

源代码: 总共由三个文件组成gluttonous.h,source.c & main.cpp。 gluttonous.h #ifndef SNAKE_H_ #define SNAKE_H_ #incl...
  • kuweicai
  • kuweicai
  • 2017年03月26日 22:38
  • 1144

C语言贪吃蛇70行代码

#include #include #include #include #define MAX_WIDE 50 #define MAX_HIGH 16 short dx...
  • LYH66
  • LYH66
  • 2012年03月19日 10:18
  • 62927

C语言游戏之贪吃蛇--链表实现

早自习时突然想到怎么写贪吃蛇,话不多说,代码如下: 开发环境:vs2015 虽然开始还是出了很多指针问题。。。(很烦C语言指针)调试了很久也大概是可以畅快的玩了。 C语言新手,有很多写得不好的...
  • LYCAYF1
  • LYCAYF1
  • 2017年03月30日 17:37
  • 1178

纯C语言写的贪吃蛇源码

#include #include #include #include #include #define N 225 struct Food { int x; int y; int yes...
  • u011131296
  • u011131296
  • 2013年12月12日 17:48
  • 4283
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言贪吃蛇
举报原因:
原因补充:

(最多只允许输入30个字)