vs中出现访问异常问题


#include <stdio.h>
#include <Windows.h>
#include <easyx.h>
#include <conio.h>
#include <time.h>
#include <graphics.h>
#include <stdlib.h>
#include <iostream>


int   main() {
    //定义玩家
    struct Player {
        int x;
        int y;    //位置
        int dirx;
        int diry;     //移动方向
        unsigned long t1, t2, dt;       //控制速度
    };
    struct Player player, player1;

    //初始化玩家
    //玩家1
    player.x = 25;
    player.y = 25;
    player.dirx = 1;
    player.diry = 0;
    player.t1 = GetTickCount64();     //获取系统时间
    player.dt = 5;      //ms为单位

    //玩家2
    player1.x = 25;
    player1.y = 25;
    player1.dirx = 1;
    player1.diry = 0;
    player1.t1 = GetTickCount64();     //获取系统时间
    player1.dt = 5;      //ms为单位

    setfillcolor(WHITE);
    fillcircle(player.x, player.y, 7);
    fillcircle(player1.x, player1.y, 7);

    //1.手动变化
    //改变方向
    char key;
    if (_kbhit())      //如果有按键动作
    {
        key = _getch();     //接收按键动作
        switch (key)
        {
        case 72:    //上
            player.dirx = 0, player.diry = -1;
            break;
        case 80:    //下
            player.dirx = 0, player.diry = 1;
            break;
        case 75:    //左
            player.dirx = -1, player.diry = 0;
            break;
        case 77:    //右
            player.dirx = 1, player.diry = 0;
            break;
        case 'A':
            player1.dirx = -1, player.diry = 0;
            break;
        case 'D':
            player1.dirx = 1, player.diry = 0;
            break;
        case 'W':
            player1.dirx = 0, player.diry = -1;
            break;
        case 'S':
            player1.dirx = 0, player.diry = 1;
            break;
        }
    }

    //2.自动变化
    //玩家数据变化
    //玩家1
    //移动
    player.t2 = GetTickCount64();
    if (player.t2 - player.t1 >= player.dt)     //每间隔5ms动一次
    {
        player.x += 1 * player.dirx;
        player.y += 1 * player.diry;
        player.t1 = player.t2;      //控制间隔时间一样
    }
    //玩家碰到墙壁 方向相反
    //此处需要或取玩家图片的大小以及地图的布置大小
    int cen_x1 = player.x + 7;   //7是图片长宽的一半
    int cen_y1 = player.y + 7;

    if (player.dirx == 1)    //右
    {
        for (int yy1 = cen_y1 - 6; yy1 <= cen_y1 + 6; yy1++) {
            //if (getpixel(cen_x1 + 9, yy1) != BLACK)     //获取该位置处像素的颜色
                player.dirx = -player.dirx;
            break;
        }
    }
    else if (player.dirx == -1)     //左
    {
        for (int yy1 = cen_y1 - 6; yy1 <= cen_y1 + 6; yy1++) {
            if (getpixel(cen_x1 - 9, yy1) != BLACK)     //获取该位置处像素的颜色
                player.dirx = -player.dirx;
            break;
        }
    }
    else if (player.diry == 1)
    {
        for (int xx1 = cen_x1 - 6; xx1 <= cen_x1 + 6; xx1++) {
            if (getpixel(xx1, cen_y1 + 9) != BLACK)     //获取该位置处像素的颜色
                player.diry = -player.diry;
            break;
        }
    }
    else if (player.diry == -1)
    {
        for (int xx1 = cen_x1 - 6; xx1 <= cen_x1 + 6; xx1++) {
            if (getpixel(xx1, cen_y1 - 9) != BLACK)     //获取该位置处像素的颜色
                player.diry = -player.diry;
            break;
        }
    }

    //玩家2
    //移动
    player1.t2 = GetTickCount64();
    if (player1.t2 - player1.t1 >= player1.dt)     //每间隔5ms动一次
    {
        player1.x += 1 * player1.dirx;
        player1.y += 1 * player1.diry;
        player1.t1 = player1.t2;      //控制间隔时间一样
    }
    //玩家碰到墙壁 方向相反
    //此处需要或取玩家图片的大小以及地图的布置大小
    int cen_x2 = player1.x + 7;   //7是图片长宽的一半
    int cen_y2 = player1.y + 7;

    if (player1.dirx == 1)    //右
    {
        for (int yy2 = cen_y2 - 6; yy2 <= cen_y2 + 6; yy2++) {
            if (getpixel(cen_x2 + 9, yy2) != BLACK)     //获取该位置处像素的颜色
                player1.dirx = -player1.dirx;
            break;
        }
    }
    else if (player1.dirx == -1)     //左
    {
        for (int yy2 = cen_y2 - 6; yy2 <= cen_y2 + 6; yy2++) {
            if (getpixel(cen_x2 - 9, yy2) != BLACK)     //获取该位置处像素的颜色
                player1.dirx = -player1.dirx;
            break;
        }
    }
    else if (player1.diry == 1)
    {
        for (int xx2 = cen_x2 - 6; xx2 <= cen_x2 + 6; xx2++) {
            if (getpixel(xx2, cen_y2 + 9) != BLACK)     //获取该位置处像素的颜色
                player1.diry = -player1.diry;
            break;
        }
    }
    else if (player1.diry == -1)
    {
        for (int xx2 = cen_x2 - 6; xx2 <= cen_x2 + 6; xx2++) {
            if (getpixel(xx2, cen_y2 - 9) != BLACK)     //获取该位置处像素的颜色
                player1.diry = -player1.diry;
            break;
        }
    }
    return 0;
}

为什么以上代码在执行到39行setfillcolor(WHITE);时发生访问异常:
0x00ED597C 处(位于 player.exe 中)引发的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。

img

你需要先初始化窗口。
** initgraph(774, 774); // 创建图形窗口**


#include<stdio.h>
#include<math.h>
#pragma warning(disable:4996)

#include <stdio.h>
#include <Windows.h>
#include <easyx.h>
#include <conio.h>
#include <time.h>
#include <graphics.h>
#include <stdlib.h>
#include <iostream>

int   main() {
    initgraph(774, 774);    // 创建图形窗口
    //定义玩家
    struct Player {
        int x;
        int y;    //位置
        int dirx;
        int diry;     //移动方向
        unsigned long t1, t2, dt;       //控制速度
    };
    struct Player player, player1;
    //初始化玩家
    //玩家1
    player.x = 25;
    player.y = 25;
    player.dirx = 1;
    player.diry = 0;
    player.t1 = GetTickCount64();     //获取系统时间
    player.dt = 5;      //ms为单位
    //玩家2
    player1.x = 25;
    player1.y = 25;
    player1.dirx = 1;
    player1.diry = 0;
    player1.t1 = GetTickCount64();     //获取系统时间
    player1.dt = 5;      //ms为单位
    setfillcolor(BLUE);
    fillcircle(player.x, player.y, 7);
    fillcircle(player1.x, player1.y, 7);
    //1.手动变化
    //改变方向
    char key;
    if (_kbhit())      //如果有按键动作
    {
        key = _getch();     //接收按键动作
        switch (key)
        {
        case 72:    //上
            player.dirx = 0, player.diry = -1;
            break;
        case 80:    //下
            player.dirx = 0, player.diry = 1;
            break;
        case 75:    //左
            player.dirx = -1, player.diry = 0;
            break;
        case 77:    //右
            player.dirx = 1, player.diry = 0;
            break;
        case 'A':
            player1.dirx = -1, player.diry = 0;
            break;
        case 'D':
            player1.dirx = 1, player.diry = 0;
            break;
        case 'W':
            player1.dirx = 0, player.diry = -1;
            break;
        case 'S':
            player1.dirx = 0, player.diry = 1;
            break;
        }
    }
    //2.自动变化
    //玩家数据变化
    //玩家1
    //移动
    player.t2 = GetTickCount64();
    if (player.t2 - player.t1 >= player.dt)     //每间隔5ms动一次
    {
        player.x += 1 * player.dirx;
        player.y += 1 * player.diry;
        player.t1 = player.t2;      //控制间隔时间一样
    }
    //玩家碰到墙壁 方向相反
    //此处需要或取玩家图片的大小以及地图的布置大小
    int cen_x1 = player.x + 7;   //7是图片长宽的一半
    int cen_y1 = player.y + 7;
    if (player.dirx == 1)    //右
    {
        for (int yy1 = cen_y1 - 6; yy1 <= cen_y1 + 6; yy1++) {
            //if (getpixel(cen_x1 + 9, yy1) != BLACK)     //获取该位置处像素的颜色
            player.dirx = -player.dirx;
            break;
        }
    }
    else if (player.dirx == -1)     //左
    {
        for (int yy1 = cen_y1 - 6; yy1 <= cen_y1 + 6; yy1++) {
            if (getpixel(cen_x1 - 9, yy1) != BLACK)     //获取该位置处像素的颜色
                player.dirx = -player.dirx;
            break;
        }
    }
    else if (player.diry == 1)
    {
        for (int xx1 = cen_x1 - 6; xx1 <= cen_x1 + 6; xx1++) {
            if (getpixel(xx1, cen_y1 + 9) != BLACK)     //获取该位置处像素的颜色
                player.diry = -player.diry;
            break;
        }
    }
    else if (player.diry == -1)
    {
        for (int xx1 = cen_x1 - 6; xx1 <= cen_x1 + 6; xx1++) {
            if (getpixel(xx1, cen_y1 - 9) != BLACK)     //获取该位置处像素的颜色
                player.diry = -player.diry;
            break;
        }
    }
    //玩家2
    //移动
    player1.t2 = GetTickCount64();
    if (player1.t2 - player1.t1 >= player1.dt)     //每间隔5ms动一次
    {
        player1.x += 1 * player1.dirx;
        player1.y += 1 * player1.diry;
        player1.t1 = player1.t2;      //控制间隔时间一样
    }
    //玩家碰到墙壁 方向相反
    //此处需要或取玩家图片的大小以及地图的布置大小
    int cen_x2 = player1.x + 7;   //7是图片长宽的一半
    int cen_y2 = player1.y + 7;
    if (player1.dirx == 1)    //右
    {
        for (int yy2 = cen_y2 - 6; yy2 <= cen_y2 + 6; yy2++) {
            if (getpixel(cen_x2 + 9, yy2) != BLACK)     //获取该位置处像素的颜色
                player1.dirx = -player1.dirx;
            break;
        }
    }
    else if (player1.dirx == -1)     //左
    {
        for (int yy2 = cen_y2 - 6; yy2 <= cen_y2 + 6; yy2++) {
            if (getpixel(cen_x2 - 9, yy2) != BLACK)     //获取该位置处像素的颜色
                player1.dirx = -player1.dirx;
            break;
        }
    }
    else if (player1.diry == 1)
    {
        for (int xx2 = cen_x2 - 6; xx2 <= cen_x2 + 6; xx2++) {
            if (getpixel(xx2, cen_y2 + 9) != BLACK)     //获取该位置处像素的颜色
                player1.diry = -player1.diry;
            break;
        }
    }
    else if (player1.diry == -1)
    {
        for (int xx2 = cen_x2 - 6; xx2 <= cen_x2 + 6; xx2++) {
            if (getpixel(xx2, cen_y2 - 9) != BLACK)     //获取该位置处像素的颜色
                player1.diry = -player1.diry;
            break;
        }
    }
    system("pause");
    return 0;
}

img

建议上官网看文档。
https://easyx.cn/