Linux下的馋蛇吃豆

#平台
Ubuntu12
ncurse图像
#(一)ncurse的使用
由于我是刚刚开始的接触的一个小白,打算从事嵌入式软件方向的一名的准大三学生。在学校感觉无法系统学习嵌入式。所以在外面报了个培训班。现在刚刚开始第一个项目。
对于ncurse老师告诉我只是记住基本格式就行,其他可以上网找资料。
ncurse的初始化:

#define UP     1
#define DOWN  -1
#define LEFT   2
#define RIGHT -2
void initNcurse()//ncurses的初始化
{
    initscr();
    keypad(stdscr,1);
    noecho();//显示按键的值
}
#include "curses.h"
#include "stdio.h"
int main()
{
        initscr();//ncures界面的初始化函数
        printw("This is curses window.\n");//在ncurse模式下的printf  
        getch();//等待用户输入,如果没有这句话,程序就退出了,看不到运行>结果,也就是上面那句话。
        endwin();//程序退出,调用改变函数来恢复shell终端的显示,没有这句>话,shell终端乱码,坏掉。
        return 0;
}

以上是ncurse的基本格式,开发也是从这里开始。
(二)#地图的构建
我们要构造的地图是20*20的,行用“–”表示,列用“|”表示;
首先我们先打印第0行和第0列和第19列

  int hang;
     int lie;
     for(hang=0;hang<20;hang++){
//==================================================================
          if(hang==0){//打印第0行          
              for(lie=0;lie<20;lie++){ 打印第一行
                   printw("--");
              }
              printw("\n");
             for(lie=0;lie<=20;lie++){打印边框
                if(lie==0||lie==20){
                    printw("|");
                }
                else{
                    printw("  ");//注意这里是空两格(--,|的字节不同方便美观)
                }
             }
            printw("\n");
          }
在打印两边:
if(hang>0&&hang<19){//打印两边的界
             for(lie=0;lie<=20;lie++){
                if(lie==0||lie==20){
                    printw("|");
                 }
                 else{
                    printw("  ");
                 }
               }
            printw("\n");
           }
最后封底:
if(hang==19){//打印最底下的一行
            for(lie=0;lie<20;lie++){
                printw("--");
             }
           printw("\n");
           printw("by:hxx");
         }
     }
}

结果如图:
在这里插入图片描述
#(三)用链表构建一条蛇

struct Snake//构建蛇的结构体
{
  int hang;
  int lie;
  struct Snake *next; //链表的节点
};

void initSnake()//添加有一条小蛇
{
       struct Snake *p;
       while(head!=NULL){
         p=head;//临时保存被删结点的地址以备释放
         head=head->next;//改变删除结点前驱结点的指针域
         free(p);//释放
       }
       head=(struct Snake *)malloc(sizeof(struct Snake));
       head->hang=2;//初始位置
       head->lie=1;
       head->next=NULL;

       tail=head;
       addNode();//添加结点
       addNode();
       addNode();
       addNode();
}


int hasSnakeNode(int i,int j)//添加的位置和别添加的是否相同
{
   struct Snake *p;
   p=head;
   while(p!=NULL){
     if(p->hang==i&&p->lie==j){
       return 1;
     }
      p=p->next;
   }
    return 0;
}

#构建食物
食物我们用“##”表示和构建蛇相似

void initFood()
{
   int x=rand()%20;
   int y=rand()%20;
   food.hang=x;
   food.lie=y;

 }

int hasFood(int i,int j)
{
  if(food.hang==i&&food.lie==j){
   return 1;
  }
  return 0;
}```


##让蛇游走
让蛇移动就是在蛇链表上,删除头节点,在尾部加一个结点从而形成结点

```c
void addNode()//在蛇的尾部加新节点
{
     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 deleNode()
{
   struct Snake *p;
   p=head;//临时保存被删结点的地址以备释放 
   head=head->next;//改变删除结点前驱结点的指针域 
   free(p);//释放删除结点的空间 
}

##如果当设碰见墙壁,和自己的身体,游戏重新开始

void moveSnake()//重新开始
{
   struct Snake *p;
  // struct Snake *new;

   addNode();
   if(hasFood(tail->hang,tail->lie)){//遇到吃的,就吃掉。
      initFood();
    }
    else{
   deleNode();
   }
   p=head;
   if(ifSnakeDie()){
    initSnake();
   }
 }

也要让界面刷新,不然就不还好看。。。。。。。

void* refreshJieMian()//刷新界面
{
   while(1)
      {
         moveSnake();
         gameMap();
         refresh();//刷新界面
         usleep(200000);
      }
}
int ifSnakeDie()
{
        struct Snake *p;
        p=head;
        if(tail->hang<0||tail->lie==0||tail->hang==20||tail->lie==20){
                        return 1;
        }
        while(p->next!=NULL)//判断是否和身体相撞
        {
          if(p->hang==tail->hang&&p->lie==tail->lie){
            return 1;
          }
           p=p->next;
        }
         return 0;
}

#一下是对细节的优化
首先我的游戏有两个while循环,但是我们只能运行一个,所以我们这里就要,用到线程的知识。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
struct Snake *head;
struct Snake *tail;
int key;
int dir;

struct Snake food;
void *fun(void *arg)
{
	printf("I'm thread, Thread ID = %lu\n", pthread_self());
	return NULL;
}
 
int main(int argc,char *argv[])
{
	pthread_t tid;
                 int ret;
                int arg=10;
                int *thread_ret=NULL;
	ret=pthread_create(&tid, NULL, fun, &arg);
                if(ret!=0){
                  printf("Creat thread error!\n");
                  return -1;
                }
                printf("this is the main process.\n");
                pthread_join(tid,(void**)&thread_ret);
	sleep(1);      // 在多线程环境中,父线程终止,全部子线程被迫终止
	printf("thread_ret = %d\n", *thread_ret);
 
	return 0;
}

是不是感觉有点难懂,但是我们用不了这么多,只要建立线程即可。

int main()
{
       pthread_t t1;
       pthread_t t2;

       initNcurse();

       initSnake();

       gameMap();

       pthread_create(&t1, NULL, refreshJieMian, NULL);
       pthread_create(&t2, NULL, changDir, NULL);
       while(1);

       getch();
       endwin();
       return 0;

}

在main函数中建立依样画葫芦,即可。就可以实现同时进行。
同时我们也要确定方向

void turn(int direction)
{
  if(abs(dir)!=abs(direction))
  {
    dir=direction;
  }
}
void* changDir()
{
 // int key;
   while(1){
      key=getch();
      switch(key){
        case KEY_DOWN:
             turn(DOWN);
             break;
        case KEY_UP:
             turn(UP);
             break;
        case KEY_LEFT:
             turn(LEFT);
             break;
        case KEY_RIGHT:
             turn(RIGHT);
             break;
       }
   }

}

以上就是全部内容,这是本人的第一篇,技术文章,不足之处还望大佬批评。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
Python Pygame是一个用于开发2D游戏的库,而代码是一个经典的游戏示例。下面是一个简单的Python Pygame代码示例: ```python import pygame import random # 初始化游戏 pygame.init() # 定义颜色 BLACK = (0, 0, 0) WHITE = (255, 255, 255) GREEN = (0, 255, 0) RED = (255, 0, 0) # 设置屏幕尺寸 screen_width = 800 screen_height = 600 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("Snake Game") # 定义的初始位置和大小 snake_block_size = 20 snake_speed = 15 x1 = screen_width / 2 y1 = screen_height / 2 x1_change = 0 y1_change = 0 # 定义子的初始位置和大小 food_block_size = 20 food_x = round(random.randrange(0, screen_width - food_block_size) / 20) * 20 food_y = round(random.randrange(0, screen_height - food_block_size) / 20) * 20 clock = pygame.time.Clock() # 定义的移动函数 def snake(snake_block_size, snake_list): for x in snake_list: pygame.draw.rect(screen, GREEN, [x[0], x[1], snake_block_size, snake_block_size]) # 游戏主循环 def game_loop(): game_over = False game_close = False # 的初始长度 snake_list = [] length_of_snake = 1 while not game_over: while game_close == True: screen.fill(BLACK) font_style = pygame.font.SysFont(None, 50) message = font_style.render("Game Over! Press Q-Quit or C-Play Again", True, RED) screen.blit(message, [screen_width / 6, screen_height / 3]) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: game_over = True game_close = False if event.key == pygame.K_c: game_loop() for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: x1_change = -snake_block_size y1_change = 0 elif event.key == pygame.K_RIGHT: x1_change = snake_block_size y1_change = 0 elif event.key == pygame.K_UP: y1_change = -snake_block_size x1_change = 0 elif event.key == pygame.K_DOWN: y1_change = snake_block_size x1_change = 0 # 判断是否撞到墙壁 if x1 >= screen_width or x1 < 0 or y1 >= screen_height or y1 < 0: game_close = True # 更新的位置 x1 += x1_change y1 += y1_change screen.fill(BLACK) pygame.draw.rect(screen, WHITE, [food_x, food_y, food_block_size, food_block_size]) snake_head = [] snake_head.append(x1) snake_head.append(y1) snake_list.append(snake_head) if len(snake_list) > length_of_snake: del snake_list[0] # 判断是否子 for x in snake_list[:-1]: if x == snake_head: game_close = True snake(snake_block_size, snake_list) pygame.display.update() # 判断是否子,如果到,则长度加1,并重新生成子 if x1 == food_x and y1 == food_y: food_x = round(random.randrange(0, screen_width - food_block_size) / 20) * 20 food_y = round(random.randrange(0, screen_height - food_block_size) / 20) * 20 length_of_snake += 1 clock.tick(snake_speed) pygame.quit() quit() # 启动游戏循环 game_loop() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值