Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/74: Рейтинг темы: голосов - 74, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 16.04.2012
Сообщений: 9

Реализовать консольное игровое приложения "Пятнашки" (с чего начать, какую литературу и какие темы изучать?)

16.04.2012, 22:57. Показов 14398. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый. Я - первокурсник, не так давно начал изучать язык С. И вот выдали мне тему курсового проекта: реализация игрового приложения "Пятнашки" в консоли на языке С. Квадратные глаза и n-ное кол-во кирпичей - вот так можно описать мое состояние. Срок сдачи приближается и я решился обратиться за помощью.
Посоветуйте, с чего вообще начинать, какую литературу и какие темы изучать? И, может быть, у кого-нибудь завалялась готовая программа? =) Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.04.2012, 22:57
Ответы с готовыми решениями:

Хочу начать изучать java. С чего посоветуете начать, какие книги или какие-то советы есть?
Хочу начать изучать java. С чего посоветуете начать, какие книги или какие-то советы есть? Спасибо заранее

Что изучать, где начинать работать, какую литературу изучать, какие уроки смотреть
Ребят, добрый день, вечер или утро. У меня вопрос очень большого значения Хочу влить в среду программирования, очень мне это нравится и...

Решил начать изучать 1С.С чего начать, что скачать?
Решил начать изучать 1С.С чего начать, что скачать?Какую среду, учебник, что для начала попробовать написать.мб у вас есть серия...

27
738 / 543 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
11.02.2017, 08:18
Студворк — интернет-сервис помощи студентам
Qitelery, у вас выход за пределы памяти, ибо строки board[d] не существует, последняя строка будет с индексом d-1, ибо отсчет начинается с 0 а не с 1.
1
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 58
13.02.2017, 22:02
Спасибо огромное, получилось.
0
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 58
21.02.2017, 18:59
У меня опять затык. На этот раз я на финишной прямой. Осталась реализация условий победы, по которым в случае, правильной конфигурации массива, возвращается true, иначе false.
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
bool won(void)
{
    // использую счетчик, т.е. когда одно число меньше следующего, то накручивается на один
    int k=0;
    for (int i=0; i<d; i++)
    {
        for (int j=0; j<d; j++)
        {
            if (board[i][j]<board[i][j+1])
            {
                k++;
            }
            // выделил граничное условие, когда надо последнее число в одной строке сравнить 
//с первым числом в следующей строке
             if (j==(d-1) && board[i][j]<board[i+1][0])
            {
                k++;
            }
            
        }
    }
    // счетчик должен быть на один меньше, т.к. последним числом в массиве будет
//0 - используется в качестве символа пустого поля
    if (k==d*d-1 && board[d-1][d-1]==0)
    {
        return true;
    }
    return false;
}
В общем условия как будто никакого влияния на результат не оказывают, т.е. не возвращает победу, когда должна.
В общем пожалуйста подсобите кто чем может.
0
738 / 543 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
22.02.2017, 13:39
попробуйте так
C
1
2
3
4
5
6
7
8
int i, j, x = 1, arr[N][N];
    for(i = 0; i < N; i++)
        for(j = 0; j < N; j++, x++){
            if(i == N - 1 && j == N - 2)
                return 1;
            if(arr[i][j] != x)
                return 0;
        }
Добавлено через 18 часов 24 минуты
Qitelery,
или так
C
1
2
3
4
5
6
7
8
9
bool won(int* arr, int size) //arr указатель на матрицу, size размер стороны матрицы
{
    int x = 1;
    size *= size;
    while(x < size)
        if(*arr++ != x++)
            return false;
    return true;
}
1
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 58
22.02.2017, 17:34
Прежде всего, спасибо, что помогаете мне. Это не оставляет меня без надежды на правильный результат.
От меня по заданию требуется дописать несколько функций: инициализация (создание массива), графический вывод на экран, перемещение значений и условия победы. Мучаюсь с последним.
По условию задачи d-размерность, board[][] - массив. Таким образом в bool won(void) уже передано значение размерности и массив.
Я попробовал первый вариант, а именно:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool won(void)
{
    int i, j, x = 1;
    for (i = 0; i < d; i++)
    {
        for (j = 0; j < d; j++, x++)
        {
            if (i == d - 1 && j == d - 2)
            {
                return 1;
            }
            if (board[i][j] != x)
            {
                return 0;
            }
        }
    }
} //<- 241 строка
Не принимает и сообщает вот о такой ошибке:
fifteen.c:241:1: error: control may reach end of non-void function [-Werror,-Wreturn-type]
}
^
1 error generated.
make: *** [fifteen] Error 1

Чем не устраивает фигурная скобка там, где она должна быть не знаю.

Вот вся программа, в которой мои
bool move(int tile) - перемещение
void draw(void) - графический вид
void init(void) - инициализация
bool won(void) - условия победы
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
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
#define _XOPEN_SOURCE 500
 
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
// constants
#define DIM_MIN 3
#define DIM_MAX 9
 
// board
int board[DIM_MAX][DIM_MAX];
 
// dimensions
int d;
 
// prototypes
void clear(void);
void greet(void);
void init(void);
void draw(void);
bool move(int tile);
bool won(void);
 
int main(int argc, string argv[])
{
    // ensure proper usage
    if (argc != 2)
    {
        printf("Usage: fifteen d\n");
        return 1;
    }
 
    // ensure valid dimensions
    d = atoi(argv[1]);
    if (d < DIM_MIN || d > DIM_MAX)
    {
        printf("Board must be between %i x %i and %i x %i, inclusive.\n",
            DIM_MIN, DIM_MIN, DIM_MAX, DIM_MAX);
        return 2;
    }
 
    // open log
    FILE* file = fopen("log.txt", "w");
    if (file == NULL)
    {
        return 3;
    }
 
    // greet user with instructions
    greet();
 
    // initialize the board
    init();
 
    // accept moves until game is won
    while (true)
    {
        // clear the screen
        clear();
 
        // draw the current state of the board
        draw();
 
        // log the current state of the board (for testing)
        for (int i = 0; i < d; i++)
        {
            for (int j = 0; j < d; j++)
            {
                fprintf(file, "%i", board[i][j]);
                if (j < d - 1)
                {
                    fprintf(file, "|");
                }
            }
            fprintf(file, "\n");
        }
        fflush(file);
 
        // check for win
        if (won())
        {
            printf("ftw!\n");
            break;
        }
 
        // prompt for move
        printf("Tile to move: ");
        int tile = GetInt();
        
        // quit if user inputs 0 (for testing)
        if (tile == 0)
        {
            break;
        }
 
        // log move (for testing)
        fprintf(file, "%i\n", tile);
        fflush(file);
 
        // move if possible, else report illegality
        if (!move(tile))
        {
            printf("\nIllegal move.\n");
            usleep(500000);
        }
 
        // sleep thread for animation's sake
        usleep(500000);
    }
    
    // close log
    fclose(file);
 
    // success
    return 0;
}
 
/**
 * Clears screen using ANSI escape sequences.
 */
void clear(void)
{
    printf("\033[2J");
    printf("\033[%d;%dH", 0, 0);
}
 
/**
 * Greets player.
 */
void greet(void)
{
    clear();
    printf("WELCOME TO GAME OF FIFTEEN\n");
    usleep(2000000);
}
 
/**
 * Initializes the game's board with tiles numbered 1 through d*d - 1
 * (i.e., fills 2D array with values but does not actually print them).  
 */
void init(void)
{
    // TODO
    int k=d*d-1;
    for (int i=0; i<d; i++)
    {
        for (int j=0; j<d; j++)
        {
            board[i][j] = k;
            k--;
        }
    }
    if (d%2 == 0)
    {
        int last = board[d-1][d-2] ;
        board[d-1][d-2] = board[d-1][d-3];
        board[d-1][d-3] = last;
    }
}
 
/**
 * Prints the board in its current state.
 */
void draw(void)
{
    // TODO
    for (int i=0; i<d; i++)
    {
        for (int j=0; j<=d; j++)
        {
            if (j == d)
            {
                printf ("\n");
            }
            else
            {
                printf ("%2d", board[i][j]);
            }
        }
    }
}
 
/**
 * If tile borders empty space, moves tile and returns true, else
 * returns false. 
 */
bool move(int tile)
{
    // TODO
    for (int i=0; i<d; i++)
    {
        for (int j=0; j<d; j++)
        {
            if (board[i][j]==tile)
            {
                for (int l=0; l<d; l++)
                {
                    for (int n=0; n<d; n++)
                    {
                        if (board[l][n]==0)
                        {
                            if (tile==board[l+1][n] || tile==board[l-1][n] || tile==board[l][n+1] || tile==board[l][n-1])
                            {
                                board[i][j] = 0;
                                board[l][n] = tile;
                                return true;
                            }
                        }
                    }
                }
            }
        }
    }
    return false;
}
 
/**
 * Returns true if game is won (i.e., board is in winning configuration), 
 * else false.
 */
bool won(void)
{
    int i, j, x = 1;
    for (i = 0; i < d; i++)
    {
        for (j = 0; j < d; j++, x++)
        {
            if (i == d - 1 && j == d - 2)
            {
                return 1;
            }
            if (board[i][j] != x)
            {
                return 0;
            }
        }
 
    }
}
0
9 / 9 / 6
Регистрация: 02.02.2010
Сообщений: 35
22.02.2017, 18:41
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
    int chek=1, count=0;
    for (int i=0; i<d; i++){
        for (int j=0; j<d; j++){
            if (board[i][j]==chek)
                chek++;
            else {
                if (i==(d-1) && j==(d-1)) 
                    count++;
            }
            
        }    
    }
 
    if ((chek==d*d) && count==1)
        return true;
    else 
        return false;
        
    
}
d размерность массива. chek проверяет что все элементы идут по порядку, а последний 0. поэтому счетчик должен быть равен 1.

Добавлено через 8 минут
Qitelery, когда проходите курс CS50 там же сказано, что вы можете показывать свой код, а смотреть чужой. Толку от этого не будет. Хотя ответы вам уже дали.
0
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 58
22.02.2017, 18:49
Nigg@, если вы обратите внимание, то у меня есть моя реализация функции. Другой вопрос, что она нерабочая и меня, в первую очередь, интересует, что с ней не так, а не получение готового ответа для галочки.
0
0 / 0 / 0
Регистрация: 15.12.2018
Сообщений: 3
16.12.2018, 00:00
Вот моя реализация пятнашек в динамике, кому интересно чекните
https://github.com/kremlev404/... **15shki.c
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.12.2018, 00:00

Решил начать изучать графику. Подскажите с чего начать
Решил начать изучать графику в паскале. Подскажите с чего начать. Отличается ли графика Турбо паскаля и Паскаля абц?

С чего лучше начать, и какие классы создать. Разработка приложения для управления удаленной консолью
Есть задание: Разработать Клиент-Серверное приложение, которое позволяет выполнять консольные команды на удаленном компьютере без...

Хочу начать изучать C# , не знаю с чего начать
Доброго времени суток , решил начать путь программиста с C# , но столкнулся с проблемой : не знаю с чего начать . Читать книги , пробовать...

Хочу начать изучать Cisco с чего начать?
Вопрос у меня такой! Хочу в будущем изучать cisco но купить маршрутизатор дорого, а найти где-нибудь поэксперементировать, позаниматься...

С какой литературу начать изучать Android Framework?
За плечами только 1.5 тома Хорстмана. Спасибо заранее за совет)


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru