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

news2024/12/24 11:10: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   4

void 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 ti
        struct 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 zou
        while(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 kong

        tail = head;                       // wei ba bian cheng tou
        addNode();                         // zeng jia jie dian
        addNode();
        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.coloradmin.cn/o/1630283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++中的链表list的模拟实现

拖更了半个月&#xff0c;我终于来填c的坑啦。上次我们说的vetcor不知道小伙伴还记得多少呢&#xff1f;今天我们要讲list的模拟实现。 目录 架构结点list表的结构 构造函数尾插push_back()尾删pop_back()计算个数&#xff1a;size()判断空empty()※迭代器问题普通迭代器迭代器…

16. Spring 事务和事务传播机制

源码位置&#xff1a;transaction 1. 事务回顾 在数据库阶段&#xff0c;想必大家都已经学习过事务了。当多个操作要么一起成功&#xff0c;要么一起失败的时候就需要将多个操作放在同一个事务中。 举个例子&#xff1a;比如用户A给用户B转账100元的业务&#xff0c;需要把用…

英文文档阅读学习atoi

文档链接&#xff1a;atoi - C Reference (cplusplus.com) 如果可以看的懂英文的可以直接看这个图&#xff0c;看不明白也没关系&#xff0c;可以看一下下面的翻译&#xff1a; 这是一些c语言的相关单词意思&#xff1a; C-string——使用空字符 0 结尾的一维字符数组 as in i…

(学习日记)2024.04.28:UCOSIII第五十二节:User文件夹函数概览(uC-LIB文件夹)第二部分

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

重学java 24.面向对象 多态

下雨了&#xff0c;跑不跑衣服都会被淋湿&#xff0c;还不如慢慢地走&#xff0c;结局已定 —— 24.4.25 多态 1.面向对象三大特性&#xff1a;封装 继承 多态 2.怎么学&#xff1a; a、不要从字面意思上理解多态这两个字&#xff0c;要从使用形式上掌握 b、要知…

【Redis 开发】Redis哨兵

哨兵 作用和原理服务状态监控选举新的master 搭建哨兵集群RedisTemplate的哨兵模式 作用和原理 Redis提供了哨兵机制来实现主从集群中的自动故障恢复&#xff1a; 哨兵也是一个集群 监控&#xff1a;会不断检查master和slave是否按预期工作自动故障恢复&#xff1a;如果mast…

开发工具-pycharm的代码自动部署服务器以及服务端python配置、项目开发环境一键启动服务

文章目录 一、pycharm的ssh配置1.本地生成ssh密钥2.密钥配置到远端服务器(1-1) 有权限ssh访问到服务器(1-2) 无权限ssh访问到服务器(1-3) 没有办法通过以上形式上传到服务器(2) 配置到authorized_keys自动访问 3.pycharm中配置ssh(1) 选择File中的settings(1) 选择Tools中的SSH…

Github创建远程仓库(项目)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

StarBright染料--星光高亮抗体 助力多色方案

星光染料是一种独特的荧光纳米粒子&#xff0c;将它与 Bio-Rad 高度验证的抗体结合&#xff0c;专为流式细胞术开发&#xff0c;为您提供卓越染色效果。星光染料使稀有群体和低密度抗原易于分辨&#xff0c;同时保持适用于任何多色实验的灵活性。 本篇将帮助你了解高亮星光染料…

springboot权限验证学习-下

上篇讲了rbac对于菜单的权限&#xff0c;下面准备完成按钮权限以及行数据和列数据权限 权限控制(按钮权限) 权限控制 操作权限就是将操作视为资源&#xff0c;比如删除操作&#xff0c;有些人可以有些人不行。于后端来说&#xff0c;操作就是一个接口。于前端来说&#xff0…

vue2使用change事件监听不了回车事件的问题

在 vue2 项目中使用 el-input 的 change 监听&#xff0c;数据不发生变化时&#xff0c;回车事件和失去焦点不生效 输入框会一直显示 只有数据发生变化时才生效 <el-input v-model"editedText" change"endEditing" ref"input"></el-inp…

校园广播系统:智能化管理提升校园安全与效率

在现代教育环境中&#xff0c;校园广播系统不再仅仅是一个播放音乐和通知的工具&#xff0c;它已经成为学校基础设施中不可或缺的一部分。根据《义务教育阶段学校信息化设备配备标准》的第8条&#xff0c;校园广播系统在学校范围内的日常运用极为广泛&#xff0c;涵盖了升旗仪式…

基于 SpringCloud 的在线交易平台乐优商城的设计与实现(四)

第 4 章 数据库设计 4.1 数据库设计原则 4.2.数据库概念结构设计 4.3 数据库表设计 4.4.本章小结 前面内容请移步 基于 SpringCloud 的在线交易平台乐优商城的设计与实现&#xff08;三&#xff09; 相关免费源码资源 乐优商城 第 4 章 数据库设计 4.1 数据库设计原…

怎样把音频压缩?3种简单的音频压缩方法分享

怎样把音频压缩&#xff1f;在数字化时代&#xff0c;音频文件占据了大量的存储空间&#xff0c;因此音频压缩成为了许多人的需求。通过音频压缩&#xff0c;我们不仅可以减小文件大小&#xff0c;方便存储和传输&#xff0c;还可以节省设备空间&#xff0c;提升处理效率。因此…

人工智能|推荐系统——推荐大模型最新进展

近年来,大语言模型的兴起为推荐系统的发展带来了新的机遇。这些模型以其强大的自然语言处理能力和丰富的知识表示,为理解和生成复杂的用户-物品交互提供了新的视角。本篇文章介绍了当前利用大型语言模型进行推荐系统研究的几个关键方向,包括嵌入空间的解释性、个性化推荐的知…

电脑黑屏问题的4种解决方法,两分钟轻松掌握

电脑黑屏是一种让人不安的问题&#xff0c;这个问题可能是由多种原因引起的。在这个数字化的时代&#xff0c;电脑已经成为我们工作和娱乐中不可或缺的一部分。当电脑突然陷入黑屏状态&#xff0c;用户通常会感到困扰和焦虑。本文将介绍一些常见的电脑黑屏问题解决方法&#xf…

微服务之并行与分布式计算

一、概述 1.1集中式系统vs分布式系统 集中式系统 集中式系统完全依赖于一台大型的中心计算机的处理能力&#xff0c;这台中心计算机称为主机&#xff08;Host 或 mainframe &#xff09;&#xff0c;与中心计算机相连的终端设备具有各不相同非常低的计算能力。实际上大多数终…

注意力机制、self attention、target attention、双层attention

关于注意力机制要解决2个问题&#xff0c;一是怎么做在哪个层面上做&#xff0c;二是注意力系数如何得到&#xff0c;由谁产出。注意力机制应用广泛的本质原因是求和的普遍存在&#xff0c;只要是有求和的地方加权和就有用武之地。DIN/DIEN把注意力机制用在用户行为序列建模是为…

校园综合服务平台

码功能强大&#xff0c;ui 精美&#xff0c; 功能包含但不限于校园跑腿&#xff0c;外卖&#xff0c;组局&#xff0c;圈子&#xff0c;商城&#xff0c;抽奖&#xff0c;投票&#xff0c;团购&#xff0c;二手市场&#xff0c;签到&#xff0c;积分商城&#xff0c;一元购等&a…

Linux驱动开发:深入理解I2C时序

目录标题 I2C简介I2C时序关键点Linux内核中的I2C时序处理I2C适配器I2C算法I2C核心 代码示例&#xff1a;I2C设备访问调试I2C时序问题 在Linux驱动开发中&#xff0c;理解和正确处理I2C时序对于确保I2C设备正常工作至关重要。本文将详细介绍I2C通信协议的时序特征&#xff0c;并…