Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/16: Рейтинг темы: голосов - 16, средняя оценка - 4.69
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
1

Змейка

23.02.2013, 20:51. Показов 3013. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здрасьте !
Решил я воссоздать змейку , вернее сделать хоть какое-то моё первое приложение.
Тут столкнулся с проблемой.

Сейчас опишу что у меня есть:

в файле Snake.cpp как обычно , создается окно и в WM_PAINT рисую поле, размером 60х30.
В одном квадрате получается 25 пикселей.
В начале я ввел эти переменные N это ширина как экрана так и продолжительность поля по х координате.
Соответственно M это высота экрана и продолжительность поля по у координате.
Х это как раз сколько пикселей в одном квадрате , РИСУНОК Я ПРИКРЕПИЛ.

Главный файл Snake.cpp:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "stdafx.h"
#include "windows.h"
#include "Snake1stApp.h"
 
int N=60;
int M=30;
int X=25;
 
int width=X * N;
int height=X * M;
 
int dir;
int num=4;
 
struct{
    int x;
    int y;
}
s[100];
 
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
 
int WINAPI WinMain(HINSTANCE h,HINSTANCE hprevinstance,LPSTR lpcmdline,int ncmdshow){
    WNDCLASSEX wc;
    HWND hwnd;
    MSG msg;
 
    ZeroMemory(&msg,sizeof(MSG));
    wc.cbSize=sizeof(wc);
    wc.style=CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
    wc.lpfnWndProc=WndProc;
    wc.cbClsExtra=0;
    wc.cbWndExtra=0;
    wc.hInstance=h;
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor=LoadCursor(h,IDC_ARROW);
    wc.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
    wc.lpszMenuName=NULL;
    wc.lpszClassName=L"main";
    wc.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
    if(!RegisterClassEx(&wc)) return 0;
 
    if(!(hwnd=CreateWindowEx(NULL,L"main",L"Snake",WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,width,height,NULL,NULL,h,NULL))) return 0;
 
    s[0].x=10;
    s[0].y=10;
 
    ShowWindow(hwnd,SW_SHOWDEFAULT);
    UpdateWindow(hwnd);
 
    while(msg.message != WM_QUIT){
        if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
    HDC hdc=GetDC(hwnd);
 
    switch (message){
    case WM_PAINT:
    for(int i=0;i<width;i+=X){
        MoveToEx(hdc,i,0,NULL);
        LineTo(hdc,i,height);
    }
    for(int j=0;j<height;j+=X){
        MoveToEx(hdc,0,j,NULL);
        LineTo(hdc,width,j);
    }
    ReleaseDC(hwnd,hdc);
 
    for(int i=0;i<num;i++){
 
    }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}


Так и вот мои вопросы:

1.Как перекрасить эти линии ?

2.Мне нужно отрисовать саму змейку , для этого надо закрасить квадрат , подскажите как?
Я продумал цикл , но как закрасить квадрат я не знаю D;
Вот цикл:
C++
1
for(int i=0;i<num;i++){}

NUM эта переменная содержит размер змейки , скольки будет равна эта переменная , столько квадратов и закрасит(изначально num=4).

p.s. Помогите мне , как закрасить квадрат?

3. как сделать окно на полный экран ??
Я только знаю как с помощью DirectDraw и Direct3D.
Миниатюры
Змейка  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2013, 20:51
Ответы с готовыми решениями:

Змейка на win32 api C++
ребят, возможно у кого затерялась змейка на win32 api C++, даже самый примитивный вариант сойдет,...

Змейка. Нужен совет как доработать программу
Недавно я зашел в тупик, работая над программой &quot;Змейка&quot;. Но несмотря на то, что в общем и целом...

Змейка, продолжение движения в заданном направлении после отпускания клавиши
Пишу игру змейка.Столкнулся с одно проблемой.движение работает нормально при нажатии на...

Игра "Змейка": чтобы змейка не съедала сама себя
Здравствуйте! Пишу змейку на VB 2010. Не получается составить условие того, что бы змейка не...

2
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
24.02.2013, 11:26  [ТС] 2
И так , пока не кто не отписал ...
Что я разыскал в интернете.
Квадраты я могу закрасить с помощью HDC и PAINSTRUCT.
Закрасить то закрасил , но змейка то не двигается.
Запускаю таймер с помощью SetTimer в WM_CREATE.
и каждый тик таймера (а это 1 раз в 50 миллисекунд) обрабатывается в WM_TIMER.
Но там нельзя пользоваться этим самым HDC и PAINTSTRUCT.

Вот код закрашивания:
C++
1
2
3
4
5
6
7
8
9
10
    case WM_PAINT:
        snk = BeginPaint(hwnd,&ps);
 
        for(int i=0;i<num;i++){
            rec.top=s[i].x*X;
            rec.left=s[i].y*X;
            rec.right=(s[i].x+1)*X;
            rec.bottom=(s[i].y+1)*X;
            FillRect(snk,&rec,(HBRUSH)(COLOR_WINDOW +1));}
        EndPaint(hwnd,&ps);
snk - HDC
&ps - PAINTSTRUCT
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
25.02.2013, 04:54 3
на каждый тик таймера обновляй массив змейки и вызывай InvalidateRect
а в WM_PAINT прорисовывай змейку в соответствие с массивом.
0
25.02.2013, 04:54
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2013, 04:54
Помогаю со студенческими работами здесь

змейка с++
ребят,вот наработки,не могу придумать нормальный алгоритм перемещения змейки,точнее...

Змейка
Привет! Пытаюсь написать змейку. Криво-косо, что-то получилось. Но есть проблема: допустим змея...

Змейка
Решил написать собственный аналог змейки. Создал костяк программы, и у меня возникло три вопроса....

Змейка
Unit Menu; Interface Uses Crt; Const N_Item = 2; Color = 7; AltColor = 0; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Что такое хорошо и что такое плохо, вид сбоку. Индивид и общество - грань не нарушения.
Hrethgir 18.01.2025
В моей личной жизни и времени, я рассуждаю категорией "хуже-лучше", в том плане, когда меня спросили например - "а зачем ты делаешь свой процессор?", то я ответил - "чтобы сделать свою жизнь лучше". . .
Передача по ссылке или по значению в Java?
InfoMaster 18.01.2025
В мире программирования на Java одним из ключевых аспектов, требующих глубокого понимания, является механизм передачи параметров в методы. Этот фундаментальный концепт часто становится источником. . .
Тернарный условный оператор в Python
InfoMaster 18.01.2025
В мире программирования существует множество инструментов и конструкций, позволяющих создавать эффективный и лаконичный код. Одним из таких инструментов является тернарный условный оператор, который. . .
Как удалить неотслеживаемые файлы из рабочего дерева Git
InfoMaster 18.01.2025
В процессе разработки программного обеспечения с использованием системы контроля версий Git часто возникает необходимость в управлении неотслеживаемыми файлами. Неотслеживаемые файлы (untracked. . .
Что делает код if __name__ == "__main__": в Python
InfoMaster 18.01.2025
В мире программирования на Python существует множество важных концепций, и одной из наиболее интересных является конструкция if __name__ == "__main__". Эта специальная конструкция играет ключевую. . .
Как заставить Git забыть об отслеживаемом файле, добавленном в .gitignore
InfoMaster 18.01.2025
В мире разработки программного обеспечения система контроля версий Git стала неотъемлемой частью рабочего процесса, позволяя эффективно отслеживать изменения в коде и управлять ими. Однако. . .
Что означает use strict в JavaScript и для чего используется
InfoMaster 18.01.2025
В мире современной веб-разработки JavaScript играет ключевую роль как один из основных языков программирования. По мере его эволюции возникла необходимость в механизмах, которые помогли бы. . .
Как работать со скрытыми (hidden) элементами в jQuery
InfoMaster 18.01.2025
В современной веб-разработке управление видимостью элементов на странице является одним из ключевых аспектов создания интерактивных пользовательских интерфейсов. jQuery предоставляет мощный набор. . .
Как переключаться между ветками (Branch) с помощью checkout в Git
InfoMaster 18.01.2025
Ветки в Git являются одной из ключевых концепций для управления версионностью кода, позволяя разработчикам эффективно работать в команде и параллельно развивать программные проекты. Каждый новый. . .
Что такое стек и куча, чем они отличаются и где находятся
InfoMaster 18.01.2025
Понимание основных концепций памяти в программировании В мире современного программирования эффективное управление памятью играет ключевую роль в создании производительных и надежных приложений. . . .
Как использовать комментарии в JSON
InfoMaster 18.01.2025
JSON (JavaScript Object Notation) представляет собой легкий и широко используемый формат обмена данными, который стал стандартом де-факто для веб-приложений и программных интерфейсов. При работе с. . .
Как заставить git pull перезаписать локальные файлы в Git
InfoMaster 18.01.2025
Проблема перезаписи локальных файлов в Git При работе с системой контроля версий Git разработчики часто сталкиваются с ситуацией, когда необходимо синхронизировать локальный репозиторий с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru