Snake – это консольное приложение “Змейка” Основная задача моделирования - это сбор статистики этой игры(кол-во набранных очков; время, от начала, до конца игры).
После двойного нажатия по файлу snake.exe откроется консоль. Вначале программа предложит ввести имя пользователя (смотри рис. В.1). После ввода имени, программа запустит игру. Управление змейкой:
- UP – вверх;
- DOWN – вниз;
- LEFT – влево;
- RIGHT – вправо.
Нужно собирать зеленые квадраты, что бы набрать очки, и не врезаться в серые, а то игра будет закончена. Если вы врежетесь сами в себя, то у вас снимутся очки и змейка уменьшиться, до места разрыва.
В конце каждой игры на экран и в файл будут выведены требуемые статистические данные, которые и являются целью моделирования системы:
- время, от начала, до конца игры;
- кол - во набранных очков;
- имя пользователя(только в файл).
После вывода всех статистических данных игра начинается заново.
Для начала игры нужно будет нажать на кнопку “OK”. Что бы выйти из приложения, нужно нажать на красный крестик, в правом верхнем углу.
Приложение В
ЭКРАННЫЕ ФОРМЫ
Рисунок В.1 - начальный экран
Рисунок В.2 - вид приложения
Рисунок В.3 - статистические данные
Рисунок В.4 - конец игры
Рисунок В.5 - статистические данные в файле
Приложение Г
ЛИСТИНГ ПРОГРАММЫ
#include "stdafx.h"
#include <time.h>
#include <iomanip>
#include <Windows.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <locale.h>
#include <iostream>
using namespace std;
FILE *in; //файл для записи статистики
int k=0; //счетчик очков
int N=30,M=20; //размер поля
int Scale=25; //масштаб
double t1, t2; // начальное и конечное время
|
char a[12]; //строчка для записи имени пользователя
int w = Scale*N; //длинна поля
int h = Scale*M; //высота поля
int step,num=2; //шаг
void DrawSnake() //рисуем змейку
{
for (int i=0;i<num;i++)
{
glColor3f(0.0,0.0,0.0); //контур
glRectf(s[i].x*Scale, s[i].y*Scale, (s[i].x+1)*Scale, (s[i].y+1)*Scale);
glColor3f(0.0,0.0,0.9); //
glRectf((s[i].x+0.1)*Scale, (s[i].y+0.1)*Scale, (s[i].x+0.9)*Scale, (s[i].y+0.9)*Scale);
glColor3f(0.1,0.1,1.0); //
glRectf((s[i].x+0.1)*Scale, (s[i].y+0.7)*Scale, (s[i].x+0.9)*Scale, (s[i].y+0.9)*Scale);
glRectf((s[i].x+0.1)*Scale, (s[i].y+0.1)*Scale, (s[i].x+0.3)*Scale, (s[i].y+0.7)*Scale);
}
}
void Tick()
{
for (int i=num;i>0;--i) //цикл движения змейки
{
s[i].x=s[i-1].x;
s[i].y=s[i-1].y;
}
if (step==0) s[0].y+=1; //движение змейки
if (step==1) s[0].x-=1;
if (step==2) s[0].x+=1;
if (step==3) s[0].y-=1;
for (int i=0;i<1;i++) //при попадании змейкки на еду она увеличивается
if ((s[0].x==m[i].x) && (s[0].y==m[i].y))
{
num++;
k++;
m[i].New();
}
for (int i=0;i<4;i++) //условие не попадания еды на камень
{
if ((n[i].x==m[0].x) && (n[i].y==m[0].y))
m[0].New();
}
for (int i=0;i<num;i++) //условие не попадания камня в змейку
{
if ((m[0].x==s[i].x) && (m[0].y==s[i].y))
m[0].New();
}
for (int i=0;i<4;i++) //конце игры при попадании в камень
if ((s[0].x==n[i].x) && (s[0].y==n[i].y))
{MessageBox(NULL,(LPCWSTR)L"Конец игры!",(LPCWSTR)L"",MB_ICONHAND |MB_OK);
num=2;
s[0].x=5; //страт новой игры с координаты (5:5) и движение змейки вправо
s[0].y=5;
step=2;
for (int i=0;i<4;i++) //создание камня при старте новой игры
n[i].New();
for (int i=0;i<1;i++) //создание еды при старте новой игры
m[i].New();
t2 = (double)clock(); // финиш
printf("| %3.1d | %-.3f \n", k, (t2 - t1)/ CLK_TCK);
cout << "|________________|______________\n";
fprintf(in,"| %3.1d | %-.3f \n", k, (t2 - t1)/ CLK_TCK);
fprintf(in,"|________________|______________\n", k, (t2 - t1)/ CLK_TCK);
t1 = (double)clock(); // старт
k = 0;
}
if (s[0].x>N-1) {s[0].x=0;} //условие перехода на концах экрана
if (s[0].x<0) {s[0].x=N-1;}
if (s[0].y>M-1) {s[0].y=0;}
if (s[0].y<0) {s[0].y=M-1;}
|
for (int i=1;i<num;i++) //при попадании головы змейки в её часить тела отбрасывается задняя часть
if (s[0].x==s[i].x && s[0].y==s[i].y) {k -= (num - i);num=i;}
}
void DrawField() //рисуем сетку поля
{
glColor3f(1.0,1.0,1.0);//цвет сетки
glBegin(GL_LINES);
for (int i=0; i<w; i+=Scale)
{glVertex2f(i,0); glVertex2f(i,h);}
for (int j=0; j<h; j+=Scale)
{glVertex2f(0,j); glVertex2f(w,j);}
glEnd();
}
void display() //рисуем поле
{
glClear(GL_COLOR_BUFFER_BIT);
DrawField();
for (int i=0;i<4;i++)
n[i].Drawlol();
DrawSnake();
for (int i=0;i<1;i++)
m[i].DrawApple();
glFlush();
glutSwapBuffers();
}
void KeyboardEvent(int key, int a, int b) //функция управления змейкой
{
switch(key)
{
case 101: if (step!=3) step=0; break;
case 102: if (step!=1) step=2; break;
case 100: if (step!=2) step=1; break;
case 103: if (step!=0) step=3; break;
}
}
void timer(int = 0) //таймер
{
display();
Tick();
glutTimerFunc(70,timer,0);
}
int main(int argc, char **argv)
{
setlocale(LC_CTYPE, "Russian");
fopen_s(&in, "statistics.txt", "a"); //открываем файл statistics.txt
cout << "Введите имя\n";
cin >> a;
srand(time(0));
cout << "_________________________________\n";
cout << "|Набранные очки |Время в игре |\n";
cout << "|________________|______________|\n";
fprintf(in,"%s\n",a);
fprintf(in,"_________________________________\n");
fprintf(in,"| Points | Time in game |\n");
fprintf(in,"|________________|______________|\n");
for (int i=0;i<1;i++) //создание еды
m[i].New();
for (int i=0;i<4;i++) //созданиие камня
n[i].New();
s[0].x=5; // начальные координаты змейки
s[0].y=5;
t1 = (double)clock(); // старт
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); //режим RGB
glutInitWindowSize (w, h); //окно размером w на h
glutCreateWindow ("Змейка"); //название окна
glClearColor(1.0,1.0,1.0,1.0); //цвет фона
glMatrixMode(GL_PROJECTION); //матрица
glLoadIdentity();
gluOrtho2D(0,w,0,h);
glutPositionWindow(100,100); //позиция окна в мониторе
glutDisplayFunc (display); //функция дисплея
|
glutSpecialFunc(KeyboardEvent); //функция для клавиш
glutTimerFunc(100,timer,0); //функция таймера
glutMainLoop(); //механизм обработки событий
fclose(in); //закрыываем файл
}