贪吃蛇 c++ ncurses
近期学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的更多相关文章
- Linux Curses编程实现贪吃蛇
curses库 简单而言,提供UNIX中多种终端 操作光标和显示字符 的接口.我们常见的vi就是使用curses实现的.现在一般都用ncurses库. Linux下curses函数库 Linux ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- 用C++实现的贪吃蛇游戏
我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...
- [LeetCode] Design Snake Game 设计贪吃蛇游戏
Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...
- JavaScript-简单的贪吃蛇小游戏
实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...
- juery实现贪吃蛇的游戏
今天用juery做了一个贪吃蛇的游戏,代码比较简陋,不过作为这些天学习juery的成果,非常有成就感.另外关于代码内容如有雷同不胜荣幸. 更改了下 让头和身子的颜色不一样 这样好区分些,虽然还是不怎么 ...
- HTML 5 背离贪吃蛇 写成了类似于屏幕校准
中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...
- 控制台游戏引擎CGE——贪吃蛇
今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...
- 原生JS制作贪吃蛇小游戏
感情都在代码里,来,干了!... <!doctype html> <html> <head> <meta http-equiv="Content-T ...
随机推荐
- CAD使用GetxDataString读数据(com接口)
主要用到函数说明: MxDrawEntity::GetxDataString2 读取一个字符扩展数据,详细说明如下: 参数 说明 [in] LONG lItem 该值所在位置 [out, retval ...
- ubuntu apt-update NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
Fetched 28.1 MB in 11s (2344 kB/s) W: GPG error: http://archive.canonical.com xenial Release: The fo ...
- 2.10.2 section元素
section元素 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> & ...
- delphi byte to of set
最佳方案 type // Controls.TCMMouseWheel relies on TShiftState not exceeding 2 bytes in size TShiftState ...
- ICMP协议和ping命令
当网络不通的情况下,通常会想到ping命令,ping一下,但是ping命令内部如何执行的,可能并不清楚,其实ping是基于ICMP协议进行工作的. 一.ICMP协议的格式 ICMP是在RFC 792 ...
- assert.notEqual()
浅测试,使用不等于比较运算符(!=)比较. const assert = require('assert'); assert.notEqual(1, 2); // OK assert.notEqual ...
- ecshop 修改支持php7 方案
修改方法 http://jsb.php-php.com/2016/05/472/ 修改数据库配置 data/config.php
- Python-基本图形绘制及库引用
turtle库的使用 概述:turtle(海龟)库是turtle绘图体系的python实现 turtle库的理解: -有一只海龟,其实在窗体正中心,在画布上游走 -走过的轨迹形成了绘制的图形 -海龟由 ...
- Spider-scrapy断点续爬
scrapy的每一个爬虫,暂停时可以记录暂停状态以及爬取了哪些url,重启时可以从暂停状态开始爬取过的URL不在爬取 实现暂停与重启记录状态 方法一: 1.首先cd进入到scrapy项目里(当然你也可 ...
- Oracle 实现查询不区分大小写(SQL实现)
转为小写 LOWER('ABC') 结果 abc转为大写 UPPER('aBc') 结果 ABC 将数据库字段数据和前台接受的值全部转换为大写或者小写 例: select * from table ...