^_^一个小游戏,贪吃蛇,C语言实现嘎嘎在linux环境下编译通过 7k7k小游戏贪吃蛇
//mysnake1.0.c
//编译命令:ccmysnake1.0.c -lcurses -o mysnake1.0
//用方向键控制蛇的方向
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <signal.h>
#include <sys/time.h>
#define NUM60
structdirect//用来表示方向的
{
int cx;
int cy;
};
typedef structnode//链表的结点
{
int cx;
int cy;
struct node *back;
struct node *next;
}node;
void initGame();//初始化游戏
int setTicker(int);//设置计时器
void show();//显示整个画面
void showInformation();//显示游戏信息(前两行)
void showSnake();//显示蛇的身体
void getOrder();//从键盘中获取命令
void over(int i);//完成游戏结束后的提示信息
void creatLink();//(带头尾结点)双向链表以及它的操作
void insertNode(int x,int y);
void deleteNode();
void deleteLink();
int ch;//输入的命令
int hour,minute,second;//时分秒
int length,tTime,level;//(蛇的)长度,计时器,(游戏)等级
struct directdir,food;//蛇的前进方向,食物的位置
node *head,*tail;//链表的头尾结点
int main()
{
initscr();
initGame();
signal(SIGALRM, show);
getOrder();
endwin();
return 0;
}
void initGame()
{
cbreak();//把终端的CBREAK模式打开
noecho();//关闭回显
curs_set(0);//把光标置为不可见
keypad(stdscr, true);//使用用户终端的键盘上的小键盘
srand(time(0));//设置随机数种子
//初始化各项数据
hour = minute = second = tTime= 0;
length = 1;
dir.cx = 1;
dir.cy = 0;
ch= 'A';
food.cx = rand() % COLS;
food.cy = rand() % (LINES-2)+ 2;
creatLink();
setTicker(20);
}
//设置计时器(这个函数是书本上的例子,有改动)
int setTicker(int n_msecs)
{
struct itimerval new_timeset;
longn_sec, n_usecs;
n_sec= n_msecs / 1000;
n_usecs = ( n_msecs % 1000) * 1000L;
new_timeset.it_interval.tv_sec= n_sec;
new_timeset.it_interval.tv_usec = n_usecs;
n_msecs = 1;
n_sec= n_msecs / 1000;
n_usecs = ( n_msecs % 1000) * 1000L;
new_timeset.it_value.tv_sec= n_sec;
new_timeset.it_value.tv_usec= n_usecs;
return setitimer(ITIMER_REAL, &new_timeset, NULL);
}
void showInformation()
{
tTime++;
if(tTime >= 1000000)//
tTime = 0;
if(1!= tTime %50)
return;
move(0, 3);
//显示时间
printw("time: %d:%d:%d %c", hour,minute, second);
second++;
if(second > NUM)
{
second = 0;
minute++;
}
if(minute > NUM)
{
minute = 0;
hour++;
}
//显示长度,等级
move(1, 0);
int i;
for(i=0;i<COLS;i++)
addstr("-");
move(0, COLS/2-5);
printw("length: %d",length);
move(0, COLS-10);
level= length / 3+ 1;
printw("level: %d",level);
}
//蛇的表示是用一个带头尾结点的双向链表来表示的,
//蛇的每一次前进,都是在链表的头部增加一个节点,在尾部删除一个节点
//如果蛇吃了一个食物,那就不用删除节点了
void showSnake()
{
if(1!= tTime %(30-level))
return;
//判断蛇的长度有没有改变
bool lenChange = false;
//显示食物
move(food.cy, food.cx);
printw("@");
//如果蛇碰到墙,则游戏结束
if((COLS-1==head->next->cx &&1==dir.cx)
|| (0==head->next->cx &&-1==dir.cx)
|| (LINES-1==head->next->cy &&1==dir.cy)
|| (2==head->next->cy &&-1==dir.cy))
{
over(1);
return;
}
//如果蛇头砬到自己的身体,则游戏结束
if('*'== mvinch(head->next->cy+dir.cy,head->next->cx+dir.cx))
{
over(2);
return;
}
insertNode(head->next->cx+dir.cx,head->next->cy+dir.cy);
//蛇吃了一个“食物”
if(head->next->cx==food.cx &&head->next->cy==food.cy)
{
lenChange = true;
length++;
//恭喜你,通关了
if(length >= 50)
{
over(3);
return;
}
//重新设置食物的位置
food.cx = rand() % COLS;
food.cy = rand() % (LINES-2)+ 2;
}
if(!lenChange)
{
move(tail->back->cy, tail->back->cx);
printw(" ");
deleteNode();
}
move(head->next->cy, head->next->cx);
printw("*");
}
void show()
{
signal(SIGALRM,show);//设置中断信号
showInformation();
showSnake();
refresh();//刷新真实屏幕
}
void getOrder()
{
//建立一个死循环,来读取来自键盘的命令
while(1)
{
ch = getch();
if(KEY_LEFT == ch)
{
dir.cx = -1;
dir.cy = 0;
}
else if(KEY_UP == ch)
{
dir.cx = 0;
dir.cy = -1;
}
else if(KEY_RIGHT == ch)
{
dir.cx = 1;
dir.cy = 0;
}
else if(KEY_DOWN == ch)
{
dir.cx = 0;
dir.cy = 1;
}
setTicker(20);
}
}
void over(int i)
{
//显示结束原因
move(0, 0);
int j;
for(j=0;j<COLS;j++)
addstr(" ");
move(0, 2);
if(1== i)
addstr("Crash the wall. Game over");
else if(2== i)
addstr("Crash itself. Game over");
else if(3== i)
addstr("Mission Complete");
setTicker(0);//关闭计时器
deleteLink();//释放链表的空间
}
//创建一个双向链表
void creatLink()
{
node*temp =(node *)malloc( sizeof(node));
head= (node *)malloc( sizeof(node));
tail= (node *)malloc( sizeof(node));
temp->cx =5;
temp->cy =10;
head->back =tail->next =NULL;
head->next =temp;
temp->next =tail;
tail->back =temp;
temp->back =head;
}
//在链表的头部(非头结点)插入一个结点
void insertNode(int x,int y)
{
node*temp =(node *)malloc( sizeof(node));
temp->cx =x;
temp->cy =y;
temp->next =head->next;
head->next =temp;
temp->back =head;
temp->next->back =temp;
}
//删除链表的(非尾结点的)最后一个结点
void deleteNode()
{
node*temp =tail->back;
node*bTemp =temp->back;
bTemp->next =tail;
tail->back =bTemp;
temp->next =temp->back =NULL;
free(temp);
temp= NULL;
}
//删除整个链表
void deleteLink()
{
while(head->next !=tail)
deleteNode();
head->next =tail->back =NULL;
free(head);
free(tail);
}
更多阅读
在淘宝上买流量卡,遇到了一个骗子卖家,该怎么办? 淘宝卖家常遇到的问题
昨天从网上买了一个流量卡,上面写的很好,276元36个G的,零月租,可是需要到付。卖家用的顺风,昨天发,今天就到了。我支付了顺风到付费用,可是卖家没有给我开通,说必须先确认收货,然后往他支付宝里打50元开通费才给开通。详细说明里面没有。我感
亲爱的,我的魂丢在了新疆组诗 徐小帆 最早的组诗
亲爱的,我的魂丢在了新疆(组诗)徐小帆醉美的美媚你是我的山你是我的水你是我的醉美亲爱的除了你还有谁让我这样幸福这样光辉日子插上了翅膀飞啊飞这就是大爱的磅礴小爱的芳菲这也是命运的奇迹人生的无悔你是我的肝你是我的
转载 一个央视主持人,5亿豪宅,钱是咋来的?这是一个迷 央视主持人
本文转载自铮铮铁汉《【转载】一个央视主持人,5亿豪宅,钱是咋来的?这是一个迷》赵忠祥简介:中国中央电视台主持人。在中央电视台工作40余年,担任过新闻、专题、综艺等各类重要节目的播音与主持工作。赵忠祥戴的是假发总统、官员、名人、
*,C语言星号的秘密 c语言星号
星号的秘密1、乘法运算符2、定义指针int *p = 0; 还是 int* p = 0;?后一种比较容易这样理解:定义了一个变量p,它是指针型的(更详细一点,是指向int的指针型),相比而言,前面一种定义似乎是定义了*P这个奇怪的东西。但
找一个谈得来,合脾气,在一起舒坦,分开久了有点想念的人 分开了有点想念
有人问我 失去的东西还会回来吗 怎么说呢 嗯 还是会的吧 只是 我曾经丢过一枚扣子 等到后来找到那扣子时 我已经换了一件衣服我要的是一个知道我全部缺点后,却依然爱我到死的人。等待太久得来的东西 多半已经不是当初自己想要的样子