近期学ncurses。用贪吃蛇训练下

思路:不构造链表。蛇头向前进方向打点,蛇尾逐点消失,形成移动。

须要记录蛇头方向,蛇尾方向。并用list仿造队列,增加拐点信息(空间比链表每一个结点开辟空间节省非常多)

思路感觉比較清晰,几个小时就写了 出来

编程环境 ubuntu12.04   安装ncurses :sudo apt-get install ncurses  编译:g++ xx.cpp -lncurses

#include<iostream>
#include<list>
#include<algorithm>
#include<ncurses.h>
#include<signal.h>
#include<sys/time.h>
#include<cstdio>
#include<cstdlib>
using namespace std; /*************定义方向****************/
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4 #define random(x) (rand()%x+1) //用来产生随机数 struct SNode //结点
{
int x;
int y;
//SNode *next;
}fruit; //定义果子 struct Snake
{
SNode front;
SNode back;
list<SNode> turn; //这里用list仿造一个队列
list<int> turn_direction; //2个List主要用来存拐点信息。方便推断
int front_direction; //蛇头的前进方向
int back_direction; //蛇尾的消失方向
int len;
}mysnake; int ch,eat,i;
list<SNode>::iterator turn_iter;
void show(int signumber);
void conctroller(void);
void draw_node(SNode node, char paint);
void end_game();
bool crash(); int main()
{
struct itimerval value;
value.it_value.tv_sec=0;
value.it_value.tv_usec=200000;
value.it_interval.tv_sec=0;
value.it_interval.tv_usec=200000;
signal(SIGALRM,&show);
// setitimer(ITIMER_REAL,&value,NULL); initscr(); //初始化虚拟屏幕
raw(); //禁用行缓冲
noecho(); //关闭键盘回显
keypad(stdscr,TRUE); //开启功能键盘
for(int i=0;i<40;i++)
{
mvaddch(0,i,'-');
mvaddch(21,i,'-');
}
for(int i=0;i<21;i++)
{
mvaddch(i,0,'|');
mvaddch(i,41,'|');
} mysnake.front.x=2;
mysnake.front.y=1;
mysnake.back.x=1;
mysnake.back.y=1;
mysnake.len=2;
fruit.x=random(20);
fruit.y=random(20);
draw_node(mysnake.front,'*');
draw_node(mysnake.back,'*');
draw_node(fruit,'#');
mysnake.front_direction=RIGHT;
mysnake.back_direction=RIGHT;
mvprintw(22,0,"/******Game : snake len:%d by Plss******/",mysnake.len);
refresh(); getch();//等待接收一个空字符,開始游戏
setitimer(ITIMER_REAL,&value,NULL); //开启定时器
while(ch != KEY_F(2))
{
conctroller();
}
endwin();
return 0;
} void conctroller(void)
{
ch=getch();
switch(ch)
{
case KEY_UP:
if(mysnake.front_direction!=DOWN)
{
mysnake.front_direction=UP;
mysnake.turn_direction.push_back(mysnake.front_direction);
mysnake.turn.push_back(mysnake.front);
sleep(100);
}break;
case KEY_DOWN:
if(mysnake.front_direction!=UP)
{
mysnake.front_direction=DOWN;
mysnake.turn_direction.push_back(mysnake.front_direction);
mysnake.turn.push_back(mysnake.front);
sleep(100);
}break;
case KEY_LEFT:
if(mysnake.front_direction!=RIGHT)
{
mysnake.front_direction=LEFT;
mysnake.turn_direction.push_back(mysnake.front_direction);
mysnake.turn.push_back(mysnake.front);
sleep(100);
}break;
case KEY_RIGHT:
if(mysnake.front_direction!=LEFT)
{
mysnake.front_direction=RIGHT;
mysnake.turn_direction.push_back(mysnake.front_direction);
mysnake.turn.push_back(mysnake.front);
sleep(100);
}break;
}
}
void show(int signumber)
{
if(signumber==SIGALRM)
{
eat=0;
draw_node(mysnake.back,' ');
if(mysnake.front.x==fruit.x && mysnake.front.y==fruit.y)
eat=1;
for(int i=0;i<=eat;i++)
{
switch(mysnake.front_direction)
{
case UP: mysnake.front.y--;break;
case DOWN:mysnake.front.y++;break;
case LEFT:mysnake.front.x--;break;
case RIGHT:mysnake.front.x++;break;
}
draw_node(mysnake.front,'*');
}
switch(mysnake.back_direction)
{
case UP:mysnake.back.y--;break;
case DOWN:mysnake.back.y++;break;
case LEFT:mysnake.back.x--;break;
case RIGHT:mysnake.back.x++;break;
}
if(mysnake.turn_direction.size() && (mysnake.back.x==mysnake.turn.front().x && mysnake.back.y==mysnake.turn.front().y))
{
mysnake.back_direction=mysnake.turn_direction.front();
mysnake.turn_direction.pop_front();
mysnake.turn.pop_front();
} if(crash()) end_game();
if(eat)
{
mysnake.len++;
mvprintw(22,0,"/******Game : snake len:%d by Plss******/",mysnake.len);
fruit.x=random(20);
fruit.y=random(20);
draw_node(fruit,'#');
}
refresh();
}
}
void draw_node(SNode node,char paint)
{
mvaddch(node.y,node.x,paint);
} void end_game()
{
struct itimerval value;
value.it_value.tv_sec=0;
value.it_value.tv_usec=0;
value.it_interval.tv_sec=0;
value.it_interval.tv_usec=0;
setitimer(ITIMER_REAL,&value,NULL);
mvprintw(10,18,"Game_over");
}
bool crash()
{
int Max,Min;
SNode tmp;
if(mysnake.front.x>40 || mysnake.front.x<=0 ||mysnake.front.y<=0 || mysnake.front.y>20 )
return true; //撞墙
/*推断是否撞到自己*/
if(!mysnake.turn.empty())
{
i=mysnake.turn.size()-1;
turn_iter = mysnake.turn.end(); while(i--)
{
tmp=*turn_iter;
turn_iter--;
if((*turn_iter).x==tmp.x && (*turn_iter).x==mysnake.front.x)
{
Max=max((*turn_iter).y,tmp.y);
Min=min((*turn_iter).y,tmp.y);
if(mysnake.front.y>=Min && mysnake.front.y<=Max)return true;
}
else if((*turn_iter).y==tmp.y && (*turn_iter).y==mysnake.front.y)
{
Max=max((*turn_iter).x,tmp.x);
Min=min((*turn_iter).x,tmp.x);
if(mysnake.front.x>=Min && mysnake.front.x<=Max)return true;
} }
turn_iter = mysnake.turn.begin();
if((*turn_iter).x==mysnake.back.x && (*turn_iter).x==mysnake.front.x)
{
Max=max((*turn_iter).y,mysnake.back.y);
Min=min((*turn_iter).y,mysnake.back.y);
if(mysnake.front.y>=Min && mysnake.front.y<=Max)return true;
}
else if((*turn_iter).y==mysnake.back.y && (*turn_iter).y==mysnake.front.y)
{
Max=max((*turn_iter).x,mysnake.back.x);
Min=min((*turn_iter).x,mysnake.back.x);
if(mysnake.front.x>=Min && mysnake.front.x<=Max)return true;
}
} return false;
}

贪吃蛇 c++ ncurses的更多相关文章

  1. Linux Curses编程实现贪吃蛇

    curses库 简单而言,提供UNIX中多种终端 操作光标和显示字符 的接口.我们常见的vi就是使用curses实现的.现在一般都用ncurses库. Linux下curses函数库    Linux ...

  2. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  3. 用C++实现的贪吃蛇游戏

    我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...

  4. [LeetCode] Design Snake Game 设计贪吃蛇游戏

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  5. JavaScript-简单的贪吃蛇小游戏

    实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...

  6. juery实现贪吃蛇的游戏

    今天用juery做了一个贪吃蛇的游戏,代码比较简陋,不过作为这些天学习juery的成果,非常有成就感.另外关于代码内容如有雷同不胜荣幸. 更改了下 让头和身子的颜色不一样 这样好区分些,虽然还是不怎么 ...

  7. HTML 5 背离贪吃蛇 写成了类似于屏幕校准

    中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...

  8. 控制台游戏引擎CGE——贪吃蛇

    今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...

  9. 原生JS制作贪吃蛇小游戏

    感情都在代码里,来,干了!... <!doctype html> <html> <head> <meta http-equiv="Content-T ...

随机推荐

  1. zabbix_sender

    转载一个python写的zabbix sender脚本 #!/usr/bin/env python # -*- coding: utf-8 -*- import socket import struc ...

  2. OpenFlow_tutorial_2_Install_Required_Software

    一.Required Software 我操作系统用的 ubuntu 18.04.vm image的OS是ubuntu14.04,这两个系统的GUI应该已经不兼容了,如果使用ubuntu18.04的主 ...

  3. 数据结构算法 - ConcurrentHashMap 源码解析

    五个线程同时往 HashMap 中 put 数据会发生什么? ConcurrentHashMap 是怎么保证线程安全的? 在分析 HashMap 源码时还遗留这两个问题,这次我们站在 Java 多线程 ...

  4. eureka 注册中心

    1.eureka版本更新后,pom依赖名称变化 v1.2.7spring-cloud-starter-eureka-server v2.0.0spring-cloud-starter-netflix- ...

  5. Html 内联元素、外联元素 和 可变元素

    块元素(block element)一般是其他元素的容器元素 块元素一般都从新行开始,它可以容纳内联元素和其他块元素,常见块元素是段落标签'P".“form"这个块元素比较特殊,它 ...

  6. 第3节 mapreduce高级:4、倒排索引的建立

    倒排索引建立 需求分析 需求:有大量的文本(文档.网页),需要建立搜索索引 最终实现的结果就是哪个单词在哪个文章当中出现了多少次 思路分析: 首选将文档的内容全部读取出来,加上文档的名字作为key,文 ...

  7. hdfs深入:08、hdfs的JavaAPI以及如何解决winutils的问题

    /** * 通过url注册的方式访问hdfs,了解,不会用到 * @throws Exception */ 以下为详细代码://1.注册hdfs的url,让java代码能识别hdfs的url形式URL ...

  8. windows/linux 更新python pip

    linux环境下 pip install -U pip windows环境下 python -m pip install -U pip python -m pip install --upgrade ...

  9. 51nod 1021 石子归并 - 区间dp(经典)

    题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1021 经典区间dp,dp[i][j] 表示将从 i 到 j 堆 ...

  10. [Luogu] P4910 帕秋莉的手环

    题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...