Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Не по теме:

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

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

Добавлено через 1 минуту
ты уважаемый ошибаешься,на сказали пишите,а как и че сами разбирайтесь,вот
UFO94
263 / 252 / 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, то победы еще нет, иначе с -- номер победившего игрока
АндрейСГУПС
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 14
22.05.2012, 14:31  [ТС]     Как написать игру "Цепь"? #11
Спасибо большое!!!)

Добавлено через 1 минуту
Спасибо большое!)
UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
22.05.2012, 14:43     Как написать игру "Цепь"? #12
Если что -- обращайтесь...
АндрейСГУПС
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 14
22.05.2012, 14:47  [ТС]     Как написать игру "Цепь"? #13
хорошо)))
UFO94
263 / 252 / 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;
}
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;
в коде такого столбца нет
UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
04.05.2015, 23:19     Как написать игру "Цепь"? #16
Там вместо n должно быть size. Ошибочка вышла...
ZaDPoTT
0 / 0 / 0
Регистрация: 04.05.2015
Сообщений: 4
05.05.2015, 01:00     Как написать игру "Цепь"? #17
ну а вместо столбца
int Pl=q.CheckTurn()+1;
что должно бить?

Добавлено через 3 минуты
[Error] 'class Field' has no member named 'CheckTurn'

Добавлено через 37 секунд
while((vert<1)||(vert>size)||(gor<1)||(gor>size)||(!q.Turn(Pl,vert,gor)))
здесь ошибка в инт мейне
[Error] 'size' was not declared in this scope

Добавлено через 1 минуту
а так замена n на size помогло спасибо

Добавлено через 3 минуты
заменил int Pl=q.CheckTurn()+1;
на int Pl=q.IsVictory()+1;
и добавил int size;
но после ввода размера поля пишет просто DRAW

Добавлено через 1 минуту
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include <stdio.h>
#include <conio.h>
 
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 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][size-1]==true)
{
IsChanges=true;
break;
}
if(IsChanges==true)
return 2;
return 0;
}
~Field()
{
delete f;
}
};
int main()
{
printf("Input size of gaming field\n");
int n;
scanf("%d",&n);
Field q(n);
while(q.IsVictory()!=0)
{
int Pl=q.IsVictory()+1;
printf("Player %d\n\n",Pl);
q.DrawF();
printf("\n");
printf("Input vertical and gorizontal coordinates\n");
int vert=0;
int gor=0;
int size=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;
}
Добавлено через 8 минут
пробовал в OpenGL не получилось
UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
05.05.2015, 01:38     Как написать игру "Цепь"? #18
В мэйне: n и size обозначают одно и то же, это я по невнимательности. Так что или все n в мэйне надо переименовать в size, или все size в n.
По CheckTurn: эта (так и не написанная мною) функция должна возвращать 0, если сейчас должен ходить 1-й игрок (количество 0 и Х на поле одинаковое), и 1 -- если сейчас должен ходить 2-й игрок (Х на 1 больше, чем 0). Код примерно такой (в классе Field, после "public:"):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int CheckTurn()
{
   int dif = 0;
   for(int i = 0; i < size; i++)
      for(int j = 0; j < size; j++)
         if(f[i][j] == 1)
            dif++;
         else if(f[i][j] == 2)
            dif--;
 
   if(dif == 0)
      return 0;
   if(dif == 1)
      return 1;
   return -1;//Ошибка! Невозможное состояние поля!
}
Добавлено через 4 минуты
Кажется, в мэйне еще ошибка в 10 строчке:
while(q.IsVictory()!=0) нужно заменить на while(q.IsVictory()==0)
ZaDPoTT
0 / 0 / 0
Регистрация: 04.05.2015
Сообщений: 4
05.05.2015, 17:31     Как написать игру "Цепь"? #19
Опять ошибка после ввода поля и координат не работает

Добавлено через 2 минуты
Есть поле но оно не заполняется(

Добавлено через 1 минуту
После удаления
C++
1
2
3
4
5
6
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");
выбывает второе поле но тоже ничего

Добавлено через 4 минуты
если не тяжело не могли бы вы скинуть образец который работает

Добавлено через 6 минут
вот что получилось
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#include <stdio.h>
#include <conio.h>
 
class Field
{
private:
int size;
int* *f;
public:
    int CheckTurn()
{
   int dif = 0;
   for(int i = 0; i < size; i++)
      for(int j = 0; j < size; j++)
         if(f[i][j] == 1)
            dif++;
         else if(f[i][j] == 2)
            dif--;
 
   if(dif == 0)
      return 0;
   if(dif == 1)
      return 1;
   return -1;//??????! ??????????? ????????? ????!
}
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 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][size-1]==true)
{
IsChanges=true;
break;
}
if(IsChanges==true)
return 2;
return 0;
}
~Field()
{
delete f;
}
};
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;
int size=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;
}
Добавлено через 1 минуту
БУДУ СИЛЬНО БЛАГОДАРЕН ЗА ОБРАЗЕЦ)

Добавлено через 4 минуты
ТОКА РОБОЧИЙ

Добавлено через 2 часа 11 минут
С другими проектами у меня проблем нету но этот меня уже достал логику я понял но прописать ее в коде для меня большая проблема
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.05.2015, 19:05     Как написать игру "Цепь"?
Еще ссылки по теме:

написать игру "кости" - C++
написать игру &quot;кости&quot; у компьютера и пользователя по 100 игровой валюты ставку делает компьютер потом пользователь

Как на C++ сделать игру "Нужна вода" (Need Water)? - C++
Хочу написать игру &quot;Нужна Вода&quot; http://onlinegamesfree.ru/game/need_water и возникло несколько вопросов 1. Какие игровые движки и...

Как можно реализовать на C++ "Игру жизни Конвея" (Conway's Game of Life)? - C++
как реализовать игру конвея жизнь в с++,подскажите какие-то треды посвященные этому и т.п

Пишу игру "змейка". Есть вопрос по ней - C++
Я сейчас пишу игру &quot;змейка&quot;. (в консоли), но возникла одна проблема. Направление движения от пользователя я принимаю так: раз в секунду...

Создать игру "Кто хочет стать миллионером" на языке С++ пожалуйста - C++
Создать игру &quot;Кто хочет стать миллионером&quot; на языке С++ пожалуйста


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

Или воспользуйтесь поиском по форуму:
UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
05.05.2015, 19:05     Как написать игру "Цепь"? #20
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#include <stdio.h>
#include <conio.h>
 
class Field
{
private:
    int size;
    int* *f;
public:
    int CheckTurn()
    {
        int dif = 0;
        for(int i = 0; i < size; i++)
            for(int j = 0; j < size; j++)
                if(f[i][j] == 1)
                    dif++;
                else if(f[i][j] == 2)
                    dif--;
 
        if(dif == 0)
            return 0;
        if(dif == 1)
            return 1;
        return -1;//??????! ??????????? ????????? ????!
    }
    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()
    {
        printf("/");
        for(int i=0; i<size-1; i++)
        {
            printf("X ");
        }
        printf("X\\");
        printf("\n");
        for(int i=0; i<size; i++)
        {
            printf("O");
            for(int j=0; j<size; j++)
            {
                if(f[i][j]==0)
                    printf(" ");
                else if(f[i][j]==1)
                    printf("X");
                else printf("O");
                if(j!=size-1)
                    printf(" ");
            }
            printf("O\n");
        }
        printf("\\");
        for(int i=0; i<size-1; i++)
        {
            printf("X ");
        }
        printf("X/");
    }
    bool Turn(int Player, int Vert, int Gor)
    {
        if(f[Vert-1][Gor-1]==0)
        {
            f[Vert-1][Gor-1]=Player;
            return true;
        }
        return false;
    }
    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][size-1]==true)
                {
                    IsChanges=true;
                    break;
                }
                if(IsChanges==true)
                    return 2;
                return 0;
    }
    ~Field()
    {
        delete f;
    }
};
int main()
{
    printf("Input size of gaming field\n");
    int size;
    scanf("%d",&size);
    Field q(size);
    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;
}
Yandex
Объявления
05.05.2015, 19:05     Как написать игру "Цепь"?
Ответ Создать тему
Опции темы

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