Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
АндрейСГУПС
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 14
#1

Как написать игру "Цепь"? - C++

21.05.2012, 21:48. Просмотров 1865. Ответов 22
Метки нет (Все метки)

• Данное приложение является реализацией известной логической игры. В данной реализации предусматривается игра двух игроков на квадратном поле фиксированного размера. Цель игры - построить непрерывную линию, соединяющую горизонтальные или вертикальные (для каждого из игроков соответственно) стороны игрового поля, причем линия считается непрерывной, если фишки граничат друг с другом по горизонтали, вертикали или диагонали. Выигрывает тот игрок, который первым построит свою линию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 21:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как написать игру "Цепь"? (C++):

Базовый класс "Источник напряжения", производные классы "Цепь" и "Аккумулятор" - C++
Дали задачу по программированию: составить класс "Источник напряжения", для которого нужно реализовать два производных класса: "Цепь" и...

Подскажите как написать игру "жизнь" - C++
Собственно интересует каким методом должна осуществлястя проверка, нашёл в интернете готовые решения - не стал глядеть, хотел бы понять

Как написать игру "Кубики"? - C++
Условие: имеется два игральных кубика со значениями от 1 до 6. Игра происходит с компьютером, кубики бросаются поочередно.Побеждает тот, у...

Как написать игру "Кости" - C++
Подскажите как правильно написать игру кости.

Надо написать программу (игру) "Кости". Где ошибка? - C++
Доброго времени. суток. Прошу помочь с решение "проблемы" по написанию программы (игры) в "Кости" на С++ Вот мой код: include...

Написать игру "Угадай число", используя цикл while - C++
ку,нужно написать игру где компьютер угадывает число допустим за 7 попыток,использовать while.

22
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
21.05.2012, 23:28 #2
Вам нужно написать только интерфейс для игры двух людей, или еще и бота, который играл бы с человеком?
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
22.05.2012, 08:39 #3
А какой язык реализации?..
Впрочем, я представляю себе стандартные классы поля, игрока (если будет бот), графики, игровой класс. В поле реализована удобная структура данных для данной игры. В графике - рисование поля. В игровом - старт игры, конец игры, всевозможные условия. Можно интерфейс сюда же (вроде, проект не очень большой). Конечно, это всё для ООП.
Довольно интересная задача. Советую сделать самому =)
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
22.05.2012, 10:18 #4
Цитата Сообщение от AnyOne697 Посмотреть сообщение
А какой язык реализации?..
Форум программистов и сисадминов CyberForum.ru > Форум программистов > Форум C++ > Форум С++ для начинающих
Угадайте
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Довольно интересная задача. Советую сделать самому =)
Я думаю, человек сюда пишет потому, что самому не получилось...

Цитата Сообщение от AnyOne697 Посмотреть сообщение
проект не очень большой
Согласен, если без бота. Если с ботом, то следует серьезно задуматься о стратегии, и я уже даже не знаю, какой будет размер проэкта...
0
АндрейСГУПС
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 14
22.05.2012, 10:46  [ТС] #5
Да мне без разнеце на каком языкебез бота надо,но я не поиму не как,как это можно сделать,помогите,а?)
0
AncinetHero
49 / 49 / 3
Регистрация: 22.05.2011
Сообщений: 326
22.05.2012, 10:57 #6
Без бота?
0
Kastaneda
22.05.2012, 10:57
  #7

Не по теме:

Цитата Сообщение от АндрейСГУПС Посмотреть сообщение
Да мне без разнеце на каком языке
Посмотри в сторону языков ЛогоМиры (2 и 3) и Scratch.

0
AncinetHero
49 / 49 / 3
Регистрация: 22.05.2011
Сообщений: 326
22.05.2012, 10:59 #8
Мне кажется, ты не на тот форум зашел. Тут задачи решают, а не пишут программы "а + б". У тебя задача - тупо реализовать....что значит нет идей - там где ты учишься, хоть чему то тебя должны были научить.
0
АндрейСГУПС
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 14
22.05.2012, 11:49  [ТС] #9
да без бота

Добавлено через 1 минуту
ты уважаемый ошибаешься,на сказали пишите,а как и че сами разбирайтесь,вот
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
22.05.2012, 13:05 #10
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
class Field
{
private:
int size;
int* *f;
public:
Field(int n)
{
size=n;
f=new int*[n];
for(int i=0; i<n; i++)
{
f[i]=new int[n];
for(int j=0; j<n; j++)
f[i][j]=0;
}
}
void DrawF()
{
//Здесь рисуем поле. Пиксельную графику знаю не очень, потому здесь напишу псевдографику.
for(int i=0; i<size+2; i++)
printf("-");
printf("\n");
for(int i=0; i<size; i++)
{
printf("|");
for(int j=0; j<size; j++)
if(f[i][j]==0)
printf(" ");
else if(f[i][j]==1)
printf("X");
else printf("O");
printf("|\n");
}
for(int i=0; i<size+2; i++)
printf("-");
printf("\n");
}
bool Turn(int Player, int Vert, int Gor)
{
if(f[Vert][Gor]==0)
{
f[Vert][Gor]=Player;
return true;
}
return false;
}
int IsVictory()
{
bool* *tmp=new bool*[size];
for(int i=0; i<size; i++)
{
tmp[i]=new bool[size];
for(int j=0; j<size; j++)
tmp[i][j]=false;
}
for(int i=0; i<size; i++)
if(f[0][i]==1)
tmp[0][i]=true;
bool IsChanges=false;
for(int i=0; i<size*size; i++)
{
IsChanges=false;
for(int j=1; j<size; j++)
{
for(int k=0; k<size; k++)
{
if((f[j][k]==1)&&((tmp[j-1][k]==true)||((k>0)&&(tmp[j][k-1]==true))||((k<size-1)&&(tmp[j][k+1]==true))||((j<size-1)&&(tmp[j+1][k]==true))))
{
tmp[j][k]=true;
IsChanges=true;
}
}
}
if(IsChanges==false)
break;
}
IsChanges=false;
for(int i=0; i<size; i++)
if(tmp[size-1][i]==true)
{
IsChanges=true;
break;
}
if(IsChanges==true)
return 1;
for(int i=0; i<size; i++)
for(int j=0; j<size; j++)
tmp[i][j]=false;
for(int i=0; i<size; i++)
if(f[i][0]==2)
tmp[i][0]=true;
for(int i=0; i<size*size; i++)
{
IsChanges=false;
for(int j=1; j<size; j++)
{
for(int k=0; k<size; k++)
{
if((f[k][j]==2)&&((tmp[k][j-1]==true)||((k>0)&&(tmp[k-1][j]==true))||((k<size-1)&&(tmp[k+1][j]==true))||((j<size-1)&&(tmp[k][j+1]==true))))
{
tmp[k][j]=true;
IsChanges=true;
}
}
}
if(IsChanges==false)
break;
}
IsChanges=false;
for(int i=0; i<size; i++)
if(tmp[i][n-1]==true)
{
IsChanges=true;
break;
}
if(IsChanges==true)
return 2;
return 0;
}
~Field()
{
delete f;
}
};
Вот класс. Создаем поле так:
C++
1
a=Field(5);//Поле 5 на 5
Ходим так:
C++
1
bool b=a.Turn(1,3,4);//Ход первого игрока в 3 ряд 4-й столбец. При этом, если ход успешен (не на занятую клетку), то b==true, иначе false
Рисуем поле так:
C++
1
a.DrawF();
И проверяем, не победил ли один из игроков, так:
C++
1
int c=a.IsVictory();//Если с==0, то победы еще нет, иначе с -- номер победившего игрока
2
АндрейСГУПС
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 14
22.05.2012, 14:31  [ТС] #11
Спасибо большое!!!)

Добавлено через 1 минуту
Спасибо большое!)
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
22.05.2012, 14:43 #12
Если что -- обращайтесь...
0
АндрейСГУПС
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 14
22.05.2012, 14:47  [ТС] #13
хорошо)))
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
24.05.2012, 21:27 #14
Методы Save\Load:
(добавляем в класс Field)
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
bool Save(AnsiString Name)//1 -- сохранение успешно
{
FILE* fl=fopen(Name,r);
if(fl!=NULL)
{
printf("This file is already exist. Rewrite it?(Y\N)\n");
char c;
scanf("%c",&c);
while((c!='N')&&(c!='Y')&&(c!='n')&&(c!='y'))
scanf("%c",&c);
if((c=='N')||(c=='n'))
{
return false;
}
}
fclose(fl);
fl=fopen(Name,"w");
fprintf(fl,"%d\n",size);
for(int i=0; i<size; i++)
{
for(int j=0; j<size; j++)
fprintf(fl,"%d ",f[i][j]);
fprintf(fl,"\n");
}
printf("Save complete!\n");
fclose(fl);
return true;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Load(AnsiString Name)
{
FILE* fl=fopen(Name,"r");
if(fl==NULL)
printf("File not found\n");
else
{
fscanf(fl,"%d",&size);
f=new int*[size];
for(int i=0; i<size; i++)
f[i]=new int[size];
for(int i=0; i<size; i++)
for(int j=0; j<size; j++)
fscanf(fl,"%d",&f[i][j]);
fclose(fl);
}
}
Вызов:
C++
1
2
3
4
5
Field a(5);
...
bool q=a.Save(Name);//q=true, если сохранено успешно, и false, если нет
...
a.Load(Name);
Кто поседний ходил всегда можно определить по количеству фишек одного и другого игрока. Как конвертить строку из char* в AnsiString -- не помню. Поищите.
И еще, изменение в методе IsVictory:
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
87
int IsVictory()
{
bool IsChanges=false;
for(int i=0; i<size; i++)
{
for(int j=0; j<size; j++)
if(f[i][j]==0)
{
IsChanges=true;
break;
}
if(IsChanges==true)
break;
}
if(IsChanges==false)
return 3;
bool* *tmp=new bool*[size];
for(int i=0; i<size; i++)
{
tmp[i]=new bool[size];
for(int j=0; j<size; j++)
tmp[i][j]=false;
}
for(int i=0; i<size; i++)
if(f[0][i]==1)
tmp[0][i]=true;
IsChanges=false;
for(int i=0; i<size*size; i++)
{
IsChanges=false;
for(int j=1; j<size; j++)
{
for(int k=0; k<size; k++)
{
if((f[j][k]==1)&&((tmp[j-1][k]==true)||((k>0)&&(tmp[j][k-1]==true))||((k<size-1)&&(tmp[j][k+1]==true))||((j<size-1)&&(tmp[j+1][k]==true))))
{
tmp[j][k]=true;
IsChanges=true;
}
}
}
if(IsChanges==false)
break;
}
IsChanges=false;
for(int i=0; i<size; i++)
if(tmp[size-1][i]==true)
{
IsChanges=true;
break;
}
if(IsChanges==true)
return 1;
for(int i=0; i<size; i++)
for(int j=0; j<size; j++)
tmp[i][j]=false;
for(int i=0; i<size; i++)
if(f[i][0]==2)
tmp[i][0]=true;
for(int i=0; i<size*size; i++)
{
IsChanges=false;
for(int j=1; j<size; j++)
{
for(int k=0; k<size; k++)
{
if((f[k][j]==2)&&((tmp[k][j-1]==true)||((k>0)&&(tmp[k-1][j]==true))||((k<size-1)&&(tmp[k+1][j]==true))||((j<size-1)&&(tmp[k][j+1]==true))))
{
tmp[k][j]=true;
IsChanges=true;
}
}
}
if(IsChanges==false)
break;
}
IsChanges=false;
for(int i=0; i<size; i++)
if(tmp[i][n-1]==true)
{
IsChanges=true;
break;
}
if(IsChanges==true)
return 2;
return 0;
}
Здесь добавлен вариант ничьи, когда все клетки заняты, но никто не победил. В таком случае IsVictory вернет 3

Добавлено через 2 часа 23 минуты
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
#include <stdio.h>
#include <conio.h>
#include <Field.h>
int main()
{
printf("Input size of gaming field\n");
int n;
scanf("%d",&n);
Field q(n);
while(q.IsVictory()!=0)
{
int Pl=q.CheckTurn()+1;
printf("Player %d\n\n",Pl);
q.DrawF();
printf("\n");
printf("Input vertical and gorizontal coordinates\n");
int vert=0;
int gor=0;
while((vert<1)||(vert>size)||(gor<1)||(gor>size)||(!q.Turn(Pl,vert,gor)))
{
scanf("%d%d",&vert,&gor);
}
printf("\n");
q.DrawF();
printf("-------------------------\n");
}
if(q.IsVictory()==1)
printf("1-ST PLAYER WINS!\n");
else if(q.IsVictory()==2)
printf("2-ND PLAYER WINS!\n");
else
printf("DRAW\n");
getch();
return 0;
}
0
ZaDPoTT
0 / 0 / 0
Регистрация: 04.05.2015
Сообщений: 4
04.05.2015, 18:33 #15
У меня ошибка
112 if(tmp[i][n-1]==true)

Добавлено через 48 секунд
In member function 'int Field::IsVictory()':
'n' was not declared in this scope

Добавлено через 9 минут
Цитата Сообщение от UFO94 Посмотреть сообщение
int Pl=q.CheckTurn()+1;
в коде такого столбца нет
0
04.05.2015, 18:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2015, 18:33
Привет! Вот еще темы с ответами:

Мне нужно написать игру "Шашки" - C++
Ребят, помогите, надо написать Шашки на Microsoft Visual C++, но я не знаю с чего начать. Я прочитал у вас почти все форумы по этой теме,...

Требуется написать игру "Лагерь". Число палаток должно равняться числу деревьев - C++
Нуждаюсь в вашей помощи. Лагерь (&quot;Tents&quot;, &quot;Tents and Trees&quot;) представляет собой прямоугольную сетку, некоторые клетки которой содержат...

Написать программу, моделирующую карточную игру "Пьяница" и определяющую, кто из двух игроков выигрывает - C++
помогите. Я не могу понять. Пжлст. С++ Игорь с Артуром играют в &quot;Пьяницу&quot;. Это такая карточная игра, правила которой описаны ниже. В...

Написать игру на с++ "Балда" 5X5 - C++
Новичок. Не умею писать игры. Помогите написать игру. Или подскажите, что нужно для этого сделать, может похожие источники есть и пр. 1....


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.