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

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

相关文章

在React中引入Tailwind CSS的完整指南

《在React中引入TailwindCSS的完整指南》在现代前端开发中,使用UI库可以显著提高开发效率,TailwindCSS是一个功能类优先的CSS框架,本文将详细介绍如何在Reac... 目录前言一、Tailwind css 简介二、创建 React 项目使用 Create React App 创建项目

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

一文教你Python引入其他文件夹下的.py文件

《一文教你Python引入其他文件夹下的.py文件》这篇文章主要为大家详细介绍了如何在Python中引入其他文件夹里的.py文件,并探讨几种常见的实现方式,有需要的小伙伴可以根据需求进行选择... 目录1. 使用sys.path动态添加路径2. 使用相对导入(适用于包结构)3. 使用pythonPATH环境

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

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

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

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

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

异步线程traceId如何实现传递

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