首页 > 其他分享 >5_22打卡_c语言贪吃蛇(失败)

5_22打卡_c语言贪吃蛇(失败)

时间:2023-05-23 15:33:08浏览次数:37  
标签:map head elements 22 Map int 贪吃蛇 Snake 打卡

funtion.h

#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#include<iostream>
#define WIDTH 20
#define HEIGHT 15//地图的宽和高
#define SPEED 2000

typedef enum {
	WALL,
	EMPTY,
	SNAKE_BODY,
	FOOD
}Mapelement;//定义一个枚举类型Mapelement

typedef struct {
public:
	Mapelement **elements;
}Map;//Map的结构体成员是一个Mapelement数组

typedef struct {
	int x, y;//记录蛇的位置
	int flag;//记录蛇是否死亡
	char way;//记录蛇移动方向
}Snake;

void initmap(Map*& map);//初始化地图

void mapdisplay(Map*& map);//地图打印函数

void drawFood(Map*& map);//生成食物

void initSnake(Snake*& head,Snake*& tail); //初始化蛇身

void updateSnake(Map*& map,Snake*& head,Snake*& tail); //更新绘制地图上的蛇

void ctrlSnake(Snake*& head);//控制蛇移动

function.cpp

#include"function.h"

void initmap(Map*& map)
{
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++)
        {
            if (i == 0 || j == 0 || i == HEIGHT - 1 || j == WIDTH - 1)
            {
                map->elements[i][j] = WALL;
            }
            map->elements[i][j] = EMPTY;
        }
    }
    map->elements[1][1] = SNAKE_BODY;
    map->elements[1][2] = SNAKE_BODY;
}

void mapdisplay(Map*& map)
{
    system("cls");
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            switch (map->elements[i][j]) {
            case EMPTY:
                printf(" ");
                break;
            case SNAKE_BODY:
                printf("*");
                break;
            case FOOD:
                printf("#");
                break;
            case WALL:
                printf("+");
            }
        }
        printf("\n");
    }
}

void drawFood(Map*& map)
{
    int res = 1;
    srand(time(NULL));
    while (res)
    {
        int x, y;
        x = rand() % (HEIGHT - 3) + 1;
        y = rand() % (WIDTH - 3) + 1;
        if (map->elements[x][y] != SNAKE_BODY)
        {
            map->elements[x][y] = FOOD;
            res = 0;
        }
    }
}

void initSnake(Snake*& head,Snake*& tail)
{
    head->x = 1;
    head->y = 2;
    tail->flag = head->flag = 1;
    head->way = 'd';

    tail->x = 1;
    tail->y = 1;
    tail->way = 'd';
}

void updateSnake(Map*& map, Snake*& head, Snake*& tail)
{
    switch (head->way) {
    case 'a':
        head->y -= 1;
        break;
    case 'd':
        head->y += 1;
        break;
    case 's':
        head->x += 1;
        break;
    case'w':
        head->x -= 1;
        break;
    }
    if (map->elements[head->x][head->y] == WALL || map->elements[head->x][head->y] == SNAKE_BODY)
    {
        head->flag = 0;
    }
    if (map->elements[head->x][head->y] == FOOD)
    {
        map->elements[head->x][head->y] = SNAKE_BODY;
    }
    else {
        map->elements[head->x][head->y] = SNAKE_BODY;
        map->elements[head->x][head->y] = EMPTY;
    }
}

void ctrlSnake(Snake*& head)
{
    char key = 0;
    if (_kbhit()) {
        char key = _getch();
    }
    
    switch (key) {
    case 'a':
        head->way = 'a';
        break;
    case 'd':
        head->way = 'd';
        break;
    case 's':
        head->way = 's';
        break;
    case'w':
        head->way = 'w';
        break;
    }
}

main.cpp

#include"function.h"

int main()
{
	printf("欢迎来到贪吃蛇小游戏,按1开始游戏");
	int res;
	scanf_s("%d", &res);
	if (res != 1) { return 0; }
	Snake* head = (Snake*)malloc(sizeof(Snake));
	Snake* tail = (Snake*)malloc(sizeof(Snake));
	Map* map = (Map*)malloc(sizeof(Map));
	map->elements = (Mapelement**)malloc(HEIGHT * sizeof(Mapelement*));
	if (map->elements == NULL) {
		// 内存分配失败的处理
		free(map); // 释放先前分配的内存
		return 1;
	}
	for (int i = 0; i < HEIGHT; i++) {
		map->elements[i] = (Mapelement*)malloc(WIDTH * sizeof(Mapelement));
		if (map->elements[i] == NULL) {
			// 内存分配失败的处理
			// 释放先前分配的内存
			for (int j = 0; j < i; j++) {
				free(map->elements[j]);
			}
			free(map);
			return 1;
		}
	}
	initSnake(head, tail);
	initmap(map);
	while (head->flag)
	{
		drawFood(map);
		mapdisplay(map);
		Sleep(SPEED);
		ctrlSnake(head);
		updateSnake(map, head, tail);
	}


// 释放内存
	for (int i = 0; i < HEIGHT; i++) {
		free(map->elements[i]);
	}
	free(map);
	return 0;
}

标签:map,head,elements,22,Map,int,贪吃蛇,Snake,打卡
From: https://www.cnblogs.com/wlxdaydayup/p/17425384.html

相关文章

  • clickhouse-查询的22条SQL
    selectl_returnflag,l_linestatus,sum(l_quantity)assum_qty,sum(l_extendedprice)assum_base_price,sum(l_extendedprice*(1-l_discount))assum_disc_price,sum(l_extendedprice*(1-l_discount)*(1+l_tax))assum_charge,avg(l_quantity)asavg_q......
  • 总结20230522
    代码时间(包括上课)3h代码量(行):100行博客数量(篇):1篇相关事项:1、今天上午上的是工程数学,进行的是工程数学实验报告的编写。2、今天下午是软件工程的课,前两节课讲的是项目总结。3、今天下午后两节是第二阶段的补货站后台的编写。......
  • 【2023-05-22】放旧迎新
    20:00德是第一位,术是第二位。                                                 ——吴孟超周末原计划是想回老家看龙舟赛事的,但由于举办方的一些原因,把赛事取消了。村......
  • 算法刷题记录:NC22227 约瑟夫环
    题目链接https://ac.nowcoder.com/acm/problem/22227解题思路模拟环。这道题顺序数就行,顺序是逆时针,逆时针的箭头是往左拐的,变成直线后趋于正半轴所以是+。不过,这道模拟环并没有说从idx号开始,往左/右数几个人,所以不需要考虑+或-。因为不会越界,所以也不用额外%n。AC代码......
  • 打卡33
     这个程序运行超时,思路是遍历所有的数,看是否合理。#include<bits/stdc++.h>usingnamespacestd;boolf(intx){ for(inti=2;i<=x/i;i++) { if(x%i==0)returnfalse; } returntrue;}intmain(){ for(inti=1000;i<=9999;i++) { if(f(i)) { ints=0; s+=i%10*1000; ......
  • 5.23打卡
      3.程序流程图 4.代码实现#include<bits/stdc++.h>usingnamespacestd;main(){doublesum=0;inti;for(i=1;i<=64;i++)sum=sum+pow(2,i-1);printf("国王总共需要赏赐给宰相的麦子数为:\n%f\n",sum);} 5.测试截图 ......
  • 打卡20
    多态实例#include<iostream>usingnamespacestd;classHuman{public: virtualvoidtoilet()=0; };classMan:publicHuman{ voidtoilet() { cout<<"上男卫生间"<<endl; }};classWoman:publicHuman{public: voidtoilet()......
  • FZU 2236(离散化+树状数组)
    【离散化】借此题记一下离散化。离散化:当题目数据很大时,但数的个数不多,可以采用离散化,降低数值,便于计算。例如数列{89,14,9,1000,2};离散化后:{4,3,2,5,1};(此操作后,数值整体降低,甚至可以当数组下标使用了)具体操作参见本题代码。离散化三部曲:1.数组ha[]存储所有存在过的......
  • 图解LeetCode——1224. 最大相等频率(难度:困难)
    一、题目给你一个正整数数组 nums,请你帮忙从该数组中找出能满足下面要求的最长前缀,并返回该前缀的长度:从前缀中恰好删除一个元素后,剩下每个数字的出现次数都相同。如果删除这个元素后没有剩余元素存在,仍可认为每个数字都具有相同的出现次数(也就是0次)。二、示例2.1>示例1:【......
  • 打卡第三十二天
    学生CPP成绩计算一、1.定义people类,建立数据成员年龄姓名 构造输出函数2.定义派生类学生类增加数据成员学号成绩3.构造输出函数输出学生类的信息二、三、#include<string>#include<iomanip>#include<iostream>usingnamespacestd;classPerson{protected:......