Форум программистов, компьютерный форум, киберфорум
Наши страницы
8Observer8
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 1.

Консольные Крестики-нолики на C# на одном компьютере

Запись от 8Observer8 размещена 11.07.2019 в 19:56
Обновил(-а) 8Observer8 15.07.2019 в 18:20

Я начал писать консольные Крестики-нолики, так увлёкся, что написал до конца. Я сделал "защиту от дурака". Если несложно, то попробуйте поиграть, я собрал в EXE. Никуда не подсматривал, сделал сам с нуля. До чего же интересно было. Советую всем научиться писать эту игру с нуля, а также другие простые игры. Процесс написания игры очень здорово мотивирует программировать.

Прикрепил архив с проектом в Visual Studio.

Исходники на GitHub: https://github.com/8Observer8/Tic-Tac-Toe-Console_CSharp

Посмотреть исходники:

Кликните здесь для просмотра всего текста
Program.cs

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Tic_Tac_Toe_Console
{
    class Program
    {
        static void Main(string[] args)
        {
            new Game();
        }
    }
}
Game.cs

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
using System;
 
namespace Tic_Tac_Toe_Console
{
    class Game
    {
        private char[,] _field = new char[3, 3] {
                { ' ', ' ', ' ' },
                { ' ', ' ', ' ' },
                { ' ', ' ', ' ' },
            };
 
        private bool _isXMove = true;
 
        private readonly string _coordErrorMessage = "Координаты должны быть: [0, 2]";
 
        public Game()
        {
            Draw();
 
            int row, col;
            do
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write("\n Введите номер ряда: [0, 2]\n (или -1 для выхода): ");
                Console.ForegroundColor = ConsoleColor.White;
                if (!int.TryParse(Console.ReadLine(), out row))
                {
                    ShowError(_coordErrorMessage);
                    continue;
                }
                if (row == -1) break;
 
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write("\n Введите номер столбца: [0, 2]\n (или -1 для выхода): ");
                Console.ForegroundColor = ConsoleColor.White;
                if (!int.TryParse(Console.ReadLine(), out col))
                {
                    ShowError(_coordErrorMessage);
                    continue;
                }
                if (col == -1) break;
 
                Update(row, col);
                Draw();
            } while (true);
 
        }
 
        private void Update(int row, int col)
        {
            if (row == -1 || col == -1)
            {
                return;
            }
 
            if (0 <= row && row <= 2 &&
                0 <= col && col <= 2)
            {
                if (_field[row, col] == ' ')
                {
                    _field[row, col] = _isXMove ? 'X' : 'O';
 
                    if (IsWinner('X'))
                    {
                        Draw();
                        EndGame("Крестики");
                    }
                    else if (IsWinner('O'))
                    {
                        Draw();
                        EndGame("Нолики");
                    }
 
                    _isXMove = !_isXMove;
                }
                else
                {
                    ShowError("По этим координатам уже сделан ход.");
                }
            }
            else
            {
                ShowError(_coordErrorMessage);
                return;
            }
        }
 
        private void Draw()
        {
            Console.Clear();
 
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("\n Крестики-Нолики\n");
            Console.ForegroundColor = ConsoleColor.Magenta;
 
            ShowField();
 
            // Устанавливаем цвет рисования белым
            Console.ForegroundColor = ConsoleColor.White;
        }
 
        private void ShowField()
        {
            Console.WriteLine(string.Format("  {0} | {1} | {2}", _field[0, 0], _field[0, 1], _field[0, 2]));
            Console.WriteLine(" ---+---+---");
            Console.WriteLine(string.Format("  {0} | {1} | {2}", _field[1, 0], _field[1, 1], _field[1, 2]));
            Console.WriteLine(" ---+---+---");
            Console.WriteLine(string.Format("  {0} | {1} | {2}", _field[2, 0], _field[2, 1], _field[2, 2]));
        }
 
        private void ShowError(string message)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("\n " + message);
            Console.WriteLine(" Нажмите любую клавишу");
 
            Console.ReadKey();
        }
 
        private bool IsWinner(char player)
        {
            return (
                // Rows
                (_field[0, 0] == player && _field[0, 1] == player && _field[0, 2] == player) ||
                (_field[1, 0] == player && _field[1, 1] == player && _field[1, 2] == player) ||
                (_field[2, 0] == player && _field[2, 1] == player && _field[2, 2] == player) ||
                // Columns
                (_field[0, 0] == player && _field[1, 0] == player && _field[2, 0] == player) ||
                (_field[0, 1] == player && _field[1, 1] == player && _field[2, 1] == player) ||
                (_field[0, 2] == player && _field[1, 2] == player && _field[2, 2] == player) ||
                // Diagonals
                (_field[0, 0] == player && _field[1, 1] == player && _field[2, 2] == player) ||
                (_field[0, 2] == player && _field[1, 1] == player && _field[2, 0] == player)
            );
        }
 
        private void ClearField()
        {
            for (int row = 0; row < 3; row++)
            {
                for (int col = 0; col < 3; col++)
                {
                    _field[row, col] = ' ';
                }
            }
        }
 
        private void EndGame(string player)
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine(string.Format("\n Победили {0}!", player));
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("\n Нажмите любую клавишу для продолжения");
            Console.ReadKey();
            ClearField();
        }
    }
}
Изображения
   
Вложения
Тип файла: zip Tic-Tac-Toe-Console.zip (3.5 Кб, 24 просмотров)
Тип файла: zip Tic-Tac-Toe-Console_CSharp.zip (28.0 Кб, 11 просмотров)
Размещено в Без категории
Просмотров 183 Комментарии 5
Всего комментариев 5
Комментарии
  1. Старый комментарий
    Аватар для 8Observer8
    Добавил код
    Запись от 8Observer8 размещена 11.07.2019 в 22:47 8Observer8 вне форума
  2. Старый комментарий
    Аватар для 8Observer8
    Прикрепил архив с проектом в Visual Studio.
    Запись от 8Observer8 размещена 12.07.2019 в 12:16 8Observer8 вне форума
  3. Старый комментарий
    Выглядит здорово!
    Запись от Unit8379 размещена 13.07.2019 в 20:11 Unit8379 вне форума
  4. Старый комментарий
    Аватар для Croessmah
    Почему исходники не на github/bitbucket?
    Запись от Croessmah размещена 15.07.2019 в 17:36 Croessmah вне форума
  5. Старый комментарий
    Аватар для 8Observer8
    Цитата:
    Сообщение от Croessmah Просмотреть комментарий
    Почему исходники не на github/bitbucket?
    Локализацию хотел добавить, чтобы была английская и русская версия. Пусть пока только русская версия: https://github.com/8Observer8/Tic-Tac-Toe-Console_CSharp Насколько я помню не C# несложно сделать локализацию через ресурсы. За одно вспомню, как это делается. Хотя с другой стороны код будет интересен только начинающим, поэтому их это собьёт с толку, поэтому сделаю отдельную версию с локализацией, а эта останется без изменения. Получился очень простой и короткий код. Пусть будет без лишних сложностей. Я сейчас занят выводом текста в OpenGL 3, чтобы сделать Крестики-нолики не текстом, а графикой вместе с текстом.
    Запись от 8Observer8 размещена 15.07.2019 в 18:19 8Observer8 вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru