引入线程的贪吃蛇风骚走位

2024-04-27 17:04

本文主要是介绍引入线程的贪吃蛇风骚走位,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.在main函数中分别引入线程t1 和线程 t2

    一个线程用来刷新界面,一个线程用来改变方向

2.刷新界面函数,无限次刷新

3. 也是无限循环while(1) 定义key 从键盘获取输入方向,赋值给dir;

4.在初始化函数中确定蛇向有行走为方向

5.从改变方向的函数changeDir()函数中获取dir的方向,在增加节点函数addNode()中,用switch函数实现蛇方向的改变

代码演示:

#include <curses.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>#define UP   1
#define DOWN 2
#define LEFT 3
#define RIGHT   4void initNcurses()
{initscr();keypad(stdscr,1);noecho();
}struct Snake
{int hang;int lie;struct Snake *next;};struct Snake *head = NULL;
struct Snake *tail = NULL;
int key;
int dir;int hasSnakeNode(int i,int j){       // da yin she shen tistruct Snake *p;p = head;  //ding tou while(p != NULL){if(p -> hang == i && p ->lie == j){return 1;} p = p ->next;}return 0;
}void gamePic()
{int hang;int lie;move(0,0);for(hang = 0;hang<20;hang++){if(hang==0){for(lie=0;lie<20;lie++){printw("--");}printw("\n");}if(hang>= 0 || hang <=18){for(lie = 0;lie<=20;lie++){if(lie == 0 || lie == 20){printw("|");}else if(hasSnakeNode(hang,lie)){printw("[]");}else{printw("  ");}}printw("\n");}if(hang == 19){for(lie=0;lie<20;lie++){printw("--");}printw("\n");printw("by caoshupei,key= %d\n",key);}}
}void addNode()
{struct Snake *new = (struct Snake *)malloc(sizeof(struct Snake));new -> next =NULL;switch(dir){case UP:new -> hang = tail -> hang-1;new -> lie = tail -> lie;break;case DOWN:new -> hang = tail -> hang+1;new -> lie = tail ->lie;break;case LEFT:new -> hang = tail -> hang;new ->lie = tail -> lie-1;break;case RIGHT:new -> hang = tail -> hang;new -> lie = tail -> lie+1;break;}tail -> next = new;tail = new;
}void deleteNode()
{struct Snake *p;p = head;head = head ->next;free(p);    // fang zhi zao cheng hen duo kong yu de jie dian
}void  initSnakebody()
{struct Snake *p;dir = RIGHT;//di yi ci yun xing shi bu hui zouwhile(head != NULL)                  //yi kai shi deng yu kong{                                  //zhuang qiao la jiu shi bu wei kong p = head;head = head -> next;free(p);                   //shi fang nei cun}head = (struct Snake*)malloc(sizeof(struct Snake));head -> hang = 1;                   // gu ding chu shi weizhi head -> lie = 1;head -> next = NULL;               // tou de xie yi ge wei kongtail = head;                       // wei ba bian cheng touaddNode();                         // zeng jia jie dianaddNode();addNode();
}void moveSnake()
{struct Snake *p;
struct Snake *new;addNode();deleteNode();if(tail -> hang == 0|| tail ->lie == 0|| tail->hang == 20 ||tail->lie ==20){initSnakebody();}
}void *refreshjiemian()
{while(1){moveSnake();gamePic();refresh();usleep(100000);}
}void *changeDir()
{while(1){key = getch();switch(key){case KEY_DOWN:dir = DOWN;break;case KEY_UP:dir = UP;break;case KEY_LEFT:dir = LEFT;break;case KEY_RIGHT:dir = RIGHT;break;}}
}int main()
{pthread_t t1;pthread_t t2;initNcurses();initSnakebody();gamePic();pthread_create(&t1,NULL,refreshjiemian,NULL);sleep(1);pthread_create(&t2,NULL,changeDir,NULL);while(1);getch();endwin();return 0;
}

这篇关于引入线程的贪吃蛇风骚走位的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/941049

相关文章

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

异步线程traceId如何实现传递

《异步线程traceId如何实现传递》文章介绍了如何在异步请求中传递traceId,通过重写ThreadPoolTaskExecutor的方法和实现TaskDecorator接口来增强线程池,确保异步... 目录前言重写ThreadPoolTaskExecutor中方法线程池增强总结前言在日常问题排查中,

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(五)——并发模型(生产者-消费者)

http://blog.csdn.net/Daybreak1209/article/details/51378055 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之