Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
АндрейСГУПС
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 14
#1

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

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

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

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

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

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

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

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

22
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
21.05.2012, 23:28 #2
Вам нужно написать только интерфейс для игры двух людей, или еще и бота, который играл бы с человеком?
0
AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
Завершенные тесты: 1
22.05.2012, 08:39 #3
А какой язык реализации?..
Впрочем, я представляю себе стандартные классы поля, игрока (если будет бот), графики, игровой класс. В поле реализована удобная структура данных для данной игры. В графике - рисование поля. В игровом - старт игры, конец игры, всевозможные условия. Можно интерфейс сюда же (вроде, проект не очень большой). Конечно, это всё для ООП.
Довольно интересная задача. Советую сделать самому =)
0
UFO94
264 / 253 / 23
Регистрация: 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 / 12
Регистрация: 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 / 12
Регистрация: 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 / 23
Регистрация: 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 / 23
Регистрация: 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 / 23
Регистрация: 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
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
04.05.2015, 23:19 #16
Там вместо n должно быть size. Ошибочка вышла...
1
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 не получилось
0
UFO94
264 / 253 / 23
Регистрация: 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)
1
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 минут
С другими проектами у меня проблем нету но этот меня уже достал логику я понял но прописать ее в коде для меня большая проблема
0
UFO94
264 / 253 / 23
Регистрация: 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;
}
1
05.05.2015, 19:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.05.2015, 19:05

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

Мне нужно написать игру "Шашки"
Ребят, помогите, надо написать Шашки на Microsoft Visual C++, но я не знаю с...

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


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

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

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