贪吃蛇(十)贪吃蛇吃食物

news2025/1/20 10:59:43

上节讲到限制蛇身回头,本节要实现吃食物功能

实现思路

在存储上食物方面可以复用蛇的结构体。初始化食物的时候,我们设置食物的坐标,每次调用这个函数的时候,坐标发生一些规律的变化。另外我们需要扫描食物的函数,这个扫描应该也是放在地图函数中的,最后我们需要检测是否吃到了食物,也就是蛇头(链表的尾指针)是否和食物的坐标重合。

  1. 定义食物结构体
  2. 初始化食物
  3. 扫描食物
  4. 检测是否吃到了食物
#include"curses.h"
#include "stdlib.h"
#include "pthread.h"

#define UP     1
#define DOWN  -1
#define LEFT   2
#define RIGHT -2

struct Snake
{
  int row;
  int col;
  struct Snake* next; 
};

struct Snake food;


int key;  // user input
int dir;
struct Snake* head = NULL;
struct Snake* tail = NULL;

void addNode();
void mapinit();


void cursesinit()
{
   
  initscr();
  keypad(stdscr,1);
  // noecho();
}


void snakeinit()
{
  // init food
  foodinit();
  // dir init
  dir = RIGHT;

  // free 
  struct Snake* p;
  while(head != NULL)
  {
    p = head;
    head = head->next;
    free(p);
  }
  // create node
  head = (struct Snake*)malloc(sizeof(struct Snake));
  head->row = 2;
  head->col = 2;
  head->next = NULL;
  tail = head;

  addNode();
  addNode();
}


void foodinit()
{
  static int x = 4;
  static int y = 5;
  food.row = x;
  food.col = y;
  x += 2;
  y += 2;
}

void addNode()
{  
  struct Snake* node = (struct Snake*)malloc(sizeof(struct Snake));
  node->next = NULL;
  
  switch(dir)
  {
	case RIGHT:
	  node->row = tail->row;
          node->col = tail->col + 1;
	  break;
	case LEFT:
	  node->row = tail->row;
          node->col = tail->col - 1;
	  break;
	case DOWN:
	  node->row = tail->row + 1;
          node->col = tail->col;
	  break;
	case UP:
	  node->row = tail->row - 1;
          node->col = tail->col;
	  break;
  }
  
  tail->next = node;
  tail = node;
}

void deleteNode()
{
  struct Snake* p;
  p = head;
  head = head->next;
  free(p);
}

void moveSnake()
{
  addNode();

  // if there have food
  if(hasFood(tail->row,tail->col))
	foodinit();
  else
	deleteNode();

  // if snake is over.
  if(tail->row == 0 || tail->col == 0 || tail->row >= 20 || tail->col >= 19)
  {
    snakeinit();
  }
}


int hasSnake(int row,int col)
{
  struct Snake* p = head;
  while(p!=NULL)
  {
    if(row == p->row && col == p->col)
	return 1;
    p = p->next;
  }
  return 0; 
}

int hasFood(int row,int col)
{
  if(row==food.row && col==food.col)
	return 1;
  return 0;
}

void mapinit()
{
  int row;
  int col;
  move(0,0);
  for(row = 0;row < 20;row++)
  {
   // one
   if(row == 0 || row == 19)
   {
     for(col = 0;col < 19;col++)
        printw("--");
   }
   // two
   else
   {
     for(col = 0;col < 20;col++)
     {
        if(col == 0 || col == 19 ) printw("|");
	else if(hasSnake(row,col))
	{
	  printw("[]");
	}
	else if(hasFood(row,col))
	{
	  printw("##");
	}
	else
	{
	  printw("  "); 
	}
     }
   }

    printw("\n");
  }

  printw("By hongzhe\n");
}


void refreshScreen()
{
  while(1)
  {
	moveSnake(); // snake forward 
	mapinit();   // fresh map
	refresh();   // fresh screen
	usleep(100000);	// sleep(0.5)
  }
  return;
}

void turnDir(int direction)
{
  if(abs(dir) != abs(direction))
	dir = direction;
}


void changeDir()
{
  
  while(1)
  {
    key = getch();
    switch(key)
    {
      case KEY_DOWN:
	printw("\rDOWN\t");
	turnDir(DOWN);
	break;
      case KEY_RIGHT:
	printw("\rRIGHT\t");
	turnDir(RIGHT);
	break;
      case KEY_LEFT:
	printw("\rLEFT\t");
	turnDir(LEFT);
	break;
      case KEY_UP:
	printw("\rUP\t");
	turnDir(UP);
	break;

    }
  }
  return;
}




int main()
{
  pthread_t t1;
  pthread_t t2;
 
  cursesinit();  
  snakeinit();
  mapinit();
  

  pthread_create(&t1,NULL,refreshScreen,NULL);
  pthread_create(&t2,NULL,changeDir,NULL);

  while(1);  // zu se main thread

  getch();  
  endwin();
  return 0;
}


学习打卡

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1330830.html

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

相关文章

数据大模型与低代码开发:赋能技术创新的黄金组合

在当今技术领域&#xff0c;数据大模型和低代码开发已经成为两个重要的趋势。数据大模型借助庞大的数据集和强大的计算能力&#xff0c;助力我们从海量数据中挖掘出有价值的洞见和预测能力。与此同时&#xff0c;低代码开发通过简化开发流程和降低编码需求&#xff0c;使得更多…

淘宝商品评论API:电商行业的战略资源与制胜之道

在电商行业&#xff0c;数据是金。而其中&#xff0c;用户评论数据更是无价之宝。它不仅仅反映了商品的质量和卖家的服务态度&#xff0c;更是消费者在决策时的关键参考。正因如此&#xff0c;获得淘宝商品评论API的重要性不言而喻。 一、数据背后的无尽宝藏 淘宝&#xff0c;…

java的XWPFDocument3.17版本学习

maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version> </dependency> 测试类&#xff1a; import org.apache.poi.openxml4j.exceptions.InvalidFormatExcep…

人工智能_机器学习072_SVM支持向量机_人脸识别模型训练_训练时间过长解决办法_数据降维_LFW人脸数据建模与C参数选择---人工智能工作笔记0112

我们先来看一下之前的代码: import numpy as np 导入数学计算库 from sklearn. svm import SVC 导入支持向量机 线性分类器 import matplotlib.pyplot as plt 加载人脸图片以后,我们用pyplot把人脸图片数据展示一下 from sklearn.model_selection import train_test_split 人脸…

3. 结构型模式 - 组合模式

亦称&#xff1a; 对象树、Object Tree、Composite 意图 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能像使用独立对象一样使用它们 问题 如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 …

优化模型:MATLAB整数规划

一、整数规划介绍 1.1 整数规划的定义 若规划模型的所有决策变量只能取整数时&#xff0c;称为整数规划。若在线性规划模型中&#xff0c;变量限制为整数&#xff0c;则称为整数线性规划。 1.2 整数规划的分类 整数规划模型大致可分为两类&#xff1a; &#xff08;1&…

机场数据治理系列介绍(1):机场行业数据中台中的数据管理顶层设计方案

目录 1、战略目标与价值 2、组织架构与角色分配 3、数据流程管理 4、数据质量管理 5、数据安全与隐私保护 6、技术平台选择与部署 7、数据服务与API管理 8、数据培训与文化推广 9、持续改进与优化 民航机场行业的数据中台中&#xff0c;有关数据管理顶层设计方案需要结…

C# WPF上位机开发(文件对话框和目录对话框)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 一个上位机软件在处理数据的时候&#xff0c;除了配置文件、数据文件之外&#xff0c;一般还需要使用选择对话框进行文件和目录的选取。如果不这样…

Oracle的学习心得和知识总结(三十一)| ODBC开放式数据库连接概述及应用程序开发

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

不忍学弟学妹受苦受难!!!逐一讲解发动机原理实验报告(1)

固体火箭发动机侵蚀燃烧测试实验 经过了愉快迷糊——哦不瑟瑟发抖——哦不痛不欲生的两天&#xff0c;终于和小伙伴们协力完成了西北工业大学航天学院发动机原理实验报告。具体的实验指导书均可在本人博客资源站下载。 固体火箭发动机侵蚀燃烧测试实验&#xff0c;嗯哼—— 实…

Python脚本打包成exe文件

我们很多时候写好一个python脚本之后&#xff0c;想要发给朋友&#xff0c;可是朋友没有安装python怎么办呢&#xff1f;别急&#xff0c;今天我就教你如何将python脚本打包成exe可执行文件&#xff0c;这样无论你的朋友有没有安装python&#xff0c;都可以运行你写好的程序&am…

ebay倒计时活动攻略,ebay倒计时活动怎么做的?——站斧浏览器

ebay倒计时活动攻略 在ebay上做倒计时活动时&#xff0c;可以参考以下攻略&#xff1a; 制定合理的ebay优惠方案。可以根据消费者的需求和购买习惯&#xff0c;制定不同的优惠方案&#xff0c;例如满减、折扣、赠品等。同时&#xff0c;要保证优惠方案的真实性和公平性&#…

Pushmall共享电商2023年 十二月模块开发优化完成

Pushmall共享电商2023年 十二月模块开发优化完成 十一月模块开发优化完成 智能名片功能开发计划完成 1、搜索查询&#xff1a;个人信息与公司信息标签。搜索查询&#xff1a;对接腾讯位置服务。 2、熟人地图&#xff1a;根据就近资源推荐&#xff0c;多少公里范围的人脉推荐 …

山西电力市场日前价格预测【2023-12-24】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-24&#xff09;山西电力市场全天平均日前电价为324.41元/MWh。其中&#xff0c;最高日前电价为456.41元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

MyBatis-Plus(一):根据指定字段更新或插入

根据指定字段更新或插入 1、概述2、实现方式2、总结 1、概述 MyBatis-Plus中提供了一个saveOrUpdate()方法&#xff0c;默认情况下可以根据主键是否存在进行更新或插入操作&#xff0c;但是实际场景中&#xff0c;根据指定字段进行更新或插入的情况也非常多见&#xff0c;今天…

推荐给前端开发的 5 款 Chrome 扩展

工欲善其事&#xff0c;必先利其器。Chrome 可能是前端开发中使用最多的浏览器。在日常开发中&#xff0c;下列几款 Chrome 扩展也许能让你的开发工作事半功倍 &#x1f680; Vue.js devtools ⚙️ vue 官方专为 vue 应用开发的调试工具。 通过使用它&#xff0c;你可以快速查看…

系列八、VMWare无法启动CentOS7问题排查 解决

一、VMWare无法启动CentOS7 1.1、问题描述 今天在测试代码的时候&#xff0c;需要用到Linux&#xff0c;然后就打开VMWare进行启动&#xff0c;但是启动的时候发现无法启动起来&#xff0c;报了一个如下的错误&#xff1a; 出现了问题那就要解决问题&#xff0c;然后想起来前几…

机器学习高级实践

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 前言 在当今科技飞速发展的时代&#xff0c;机…

MySQL创建member表失败

最近在做一个项目&#xff0c;在台式机上可以跑通&#xff0c;也测试了各个已完成的接口&#xff0c;提交到了GitHub后想着用宿舍的电脑跑一下&#xff0c;在测试member表相关接口时就出错了。报了SQL语法错误&#xff0c;但SQL语句很简单&#xff0c;就根据手机号查询不至于出…

抖店定好品类赛道之后,怎么选品和快速出单?相关教程分享如下!

我是王路飞。 之前分享抖店流程相关内容时&#xff0c;我说过&#xff0c;类目选择大于一切&#xff0c;且要优于、重于选品。 至于定类目的标准&#xff0c;我之前也给你们说过&#xff0c;不要以自己个人喜好为标准去判断市场&#xff0c;也不要凭借自己以往认知和经验确定…