贪吃蛇 c++ ncurses_weixin_34290352的博客-程序员秘密

技术标签: 数据结构与算法  c/c++  

近期学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;
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34290352/article/details/86238984

智能推荐

搭建Kubernetes容器集群管理系统 (实验环境: 需要三台全新的 CENTOS7.4系统 )_刘东义的博客的博客-程序员秘密

Kubernetes概述Kubernetes 是 Google开源的容器集群管理系统,基于 Docker构建一个容器的调度服务,提供资源调度、均衡容器、服务注册、动态扩缩容等功能套件。 基于容器的云平台1 Kubernetes和相关组件的介绍 1、master: kubernetes管理结点 2、apiserver : 提供接口服务,用户通过 apiserver 来管理...

pyecharts 实现显示数据为百分比的柱状图_pyecharts可以用百分比作为数值吗_陈年椰子的博客-程序员秘密

pyecharts是做数据分析的好帮手,柱状图比较简单,网站例子不够多,# encoding: utf-8"""@author: [email protected]: [email protected]@version: [email protected]: [email protected]: 2020/3/27 0019 09:39说明 建立百分比的柱状图"""from pyecharts.chart...

前端XSS 过滤--亲测有效_前端xss过滤_Frank-的博客-程序员秘密

// XSS 过滤        filterXSS: function (str) {            return str              .replace(/&amp;amp;/g, '&amp;amp;amp;')              .replace(/ /g, '&amp;amp;nbsp;')              .replace(/&amp;lt;/g, '&amp;amp;lt;'...

ANSYS Electronics Desktop 做电磁仿真_木辛梓的博客-程序员秘密

一、软件介绍与安装ANSYS Electromagnetics Suite 18.2 有限元电磁场仿真分析软件下载 二、电容仿真第一步菜单栏选择:Insert Maxwell 3D Design ,如下图1,然后工具栏出现2。第二步点击Maxwell 3D—&amp;gt;solution type—&amp;gt;Electrostatic—&amp;gt;OK第三步点击Draw box,然后鼠标拖...

懒人精灵飞桨插件的使用_懒人精灵插件_懒人精灵的博客-程序员秘密

飞桨ocr对中文的支持非常好,不了解的可以自行去了解一下,废话不多说直接上图和测试代码先图色工具截图选择要截图的区域、2.复制区域,用于截图,直接上代码local paddle = require("libpaddleocr") --导入飞桨插件print("脚本开始",paddle.ocr)local path = getWorkPath()extractAssets("/mnt/sdcard/paddle.rc",path,"*")print(path)for i=1,100

随便推点

Java8 Function 用法简介_JavaWeb大牛的博客-程序员秘密

先看代码:public class ZhihaoTest { public static void main(String[] args) { new ZhihaoTest().test(); } public void test() { Function&lt;Numbers, Integer&gt; test1 = i -&gt;...

牛客网-2018 美团 CodeM 编程大赛-初赛 B 轮_美团程序设计大赛_f_zyj的博客-程序员秘密

ACM模版上次初赛 AAA 轮没有时间好好打,这次打了一下 BBB 轮,感觉还算不错,应该可以晋级。过了三道题,第二道搞了好久没有搞出来,感觉不难,就是题目太复杂,乱七八糟的要求太多了。1-开关灯模拟题。详解&amp;gt;&amp;gt;&amp;gt;3-低位值数学规律。详解&amp;gt;&amp;gt;&amp;gt;4-神奇盘子暴力枚举。详解&amp;gt;&amp;gt;&amp;gt;...

DOM 文档对象模型 节点_୧⍤⃝潮 张超 落的博客-程序员秘密

DOM 是 Document Object Model(文档对象模型)的缩写。

C++基础入门_allocatespace的意思_是阿翔啊的博客-程序员秘密

C++基础入门1 C++初识1.1 第一个C++程序编写一个C++程序总共分为4个步骤创建项目创建文件编写代码运行程序1.1.1 创建项目​ Visual Studio是我们用来编写C++程序的主要工具,我们先将它打开[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WYXCyMNh-1604929713357)(assets/1541383178746.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iaeRx

黑马程序员——OC学习——内存管理_Susie_lv的博客-程序员秘密

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------1. 内存管理的基本概念及范围由于移动设备的内存极其有限,所以每个APP占用的内存也是有限的,当APP占用内存过多时,系统就会发出内存警告。为了保证整个系统运行流畅,需要回收一些不需要再继续使用的内存空间,否则系统会崩溃。OC内存管理的范围是任何继承NSObject的对象,对其他基本类

加密交易-最后! —这是主角的格子烘烤_weixin_26753891的博客-程序员秘密

As if you didn’t know, quantum computers will put an end to our most popular public-key methods. And so NIST has been working on defining a standard for the best method to replace these, and yesterday...