zsh669 2021-12-20 20:01 采纳率: 87.5%
浏览 27
已结题

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

  • 写回答

1条回答 默认 最新

  • CSDN专家-Time 2021-12-20 23:54
    关注

    你需要先初始化窗口。
    ** 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/

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月3日
  • 已采纳回答 12月26日
  • 创建了问题 12月20日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加