Как написать программу крестики нолики

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

#include
#include
using namespace sf;
bool svob[9] = < false >;
class Stav
public:
Sprite sprite[9];
bool tik[9];
Stav(Texture i < 9; i++)
sprite[i].setTexture(image);
tik[i] = false;
>
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
sprite[i * 3 + j].setPosition(200 * j, 200 * i);
>
void update(int i < 9; i++)
sprite[i].setTextureRect(IntRect(200 * (vid — 1), 0, 200, 200));
>
>;
int BotStav()
int res = 0;
bool verno = false;
while (!verno)
res = rand() % 9;
if (!svob[res])
verno = true;
else
verno = false;
>
return res;
>
int main()
srand(time(0));
RenderWindow window(VideoMode(600, 600), «Tic tac toe!»);
Texture f;
f.loadFromFile(«C:/Users/Андрей/Desktop/Paint/fon.png»);
Sprite fon(f);
Texture c;
c.loadFromFile(«C:/Users/Андрей/Desktop/Paint/crnol.png»);
Sprite vibor[2];
for (int i = 0; i < 2; i++)
vibor[i].setTexture(c);
vibor[i].setPosition(50 + 300 * i, 180);
>
int vib = 0;
Stav player(c), bot(c);
int sv = 0;
Texture l;
l.loadFromFile(«C:/Users/Андрей/Desktop/Paint/line.png»);
Sprite line(l);
bool win = false, hotbot = false;
bool dumbot = false;
while (window.isOpen())
Vector2i pos = Mouse::getPosition(window);
Event event;
while (window.pollEvent(event))
if (event.type == Event::Closed)
window.close();
if (event.type == Event::MouseButtonPressed)
if (event.key.code == Mouse::Left)
if (vib == 0)
for (int i = 0; i < 2; i++)
if (vibor[i].getGlobalBounds().contains(pos.x, pos.y))
vib = i + 1;
>
else
for (int i = 0; i < 9; i++)
if (player.sprite[i].getGlobalBounds().contains(pos.x, pos.y) !svob[i])
player.tik[i] = true;
svob[i] = true;
sv++;
hotbot = true;
>
>
>
for (int i = 0; i < 2; i++)
if (vibor[i].getGlobalBounds().contains(pos.x, pos.y))
vibor[i].setTextureRect(IntRect(200 * i, 200, 200, 200));
else
vibor[i].setTextureRect(IntRect(200 * i, 0, 200, 200));
bool winplay[8][2];
for (int i = 0; i < 8; i++)
if (i < 3)
winplay[i][0] = player.tik[3 * i] player.tik[1 + 3 * i] player.tik[2 + 3 * i];
winplay[i][1] = bot.tik[3 * i] bot.tik[1 + 3 * i] bot.tik[2 + 3 * i];
>
else if (i >= 3 i < 6)
winplay[i][0] = player.tik[i — 3] player.tik[i] player.tik[i + 3];
winplay[i][1] = bot.tik[i — 3] bot.tik[i] bot.tik[i + 3];
>
else if (i >= 6)
winplay[i][0] = player.tik[2 * (i — 6)] player.tik[4] player.tik[8 — 2 * (i — 6)];
winplay[i][1] = bot.tik[2 * (i — 6)] bot.tik[4] bot.tik[8 — 2 * (i — 6)];
>
for (int j = 0; j < 2; j++)
if (winplay[i][j])
win = true;
if (i < 3)
line.setTextureRect(IntRect(0, 0, 600, 10));
int ly = 95 + 200 * i;
line.setPosition(0, ly);
>
else if (i < 6)
line.setTextureRect(IntRect(0, 0, 600, 10));
line.setRotation(90);
int lx = 105 + 200 * (i — 3);
line.setPosition(lx, 0);
>
else if (i == 6)
line.setTextureRect(IntRect(0, 10, 600, 600));
else if (i == 7)
line.setTextureRect(IntRect(600, 10, -600, 600));
>
>
if (hotbot !win sv < 9)
sv++;
int botstav = 0;
if (!dumbot)
botstav = BotStav();
dumbot = true;
>
else
bool cdat = true;
for (int i = 0; i < 3; i++)
if (player.tik[i] player.tik[3 + i] !svob[6 + i])
botstav = 6 + i;
cdat = false;
>
if (player.tik[6 + i] player.tik[3 + i] !svob[i])
botstav = i;
cdat = false;
>
if (player.tik[3 * i] player.tik[1 + 3 * i] !svob[2 + 3 * i])
botstav = 2 + 3 * i;
cdat = false;
>
if (player.tik[2 + 3 * i] player.tik[1 + 3 * i] !svob[3 * i])
botstav = 3 * i;
cdat = false;
>
>
if (player.tik[0] player.tik[4] !svob[8])
botstav = 8;
cdat = false;
>
if (player.tik[8] player.tik[4] !svob[0])
botstav = 0;
cdat = false;
>
if (player.tik[2] player.tik[4] !svob[6])
botstav = 6;
cdat = false;
>
if (player.tik[6] player.tik[4] !svob[2])
botstav = 2;
cdat = false;
>
if (player.tik[2] player.tik[6] !svob[4])
botstav = 4;
cdat = false;
>
if (cdat)
botstav = BotStav();
>
bot.tik[botstav] = true;
svob[botstav] = true;
hotbot = false;
>
player.update(vib);
int biv = vib + 1;
if (biv == 3)
biv = 1;
bot.update(biv);
window.clear(Color::White);
if (vib == 0)
for (int i = 0; i < 2; i++)
window.draw(vibor[i]);
else
window.draw(fon);
for (int i = 0; i < 9; i++)
if (player.tik[i])
window.draw(player.sprite[i]);
if (bot.tik[i])
window.draw(bot.sprite[i]);
>
>
if (win)
window.draw(line);
window.display();
>
return 0;
>

Пишем игру Крестики Нолики на python и pygame. Tic tac toe game using python and pygame

Мастер класс Python. Игра крестики-нолики. Консоль

Источник: gist.github.com

Крестики-нолики

В этой статье, приуроченной к онлайн-курсу Android Developer. Basic, мы напишем свою собственную небольшую игру «Крестики-нолики». Для работы потребуется установить Android Studio. Какая у вас ОС — не имеет значения, т.к. эта IDE работает на Windows, Ubuntu или Mac. Язык программирования будет Kotlin, т.к. сейчас он является официальным языком для программирования на Android. Во время написания статьи использовалась версия Android Studio 4.1.3

Создание проекта

Для начала необходимо создать новый проект. В нашем случае необходимо выбрать Fragment + ViewModel и нажать Next.

Далее в поле Name вводите название приложения, в Package name можете внести свое имя или ник как доменное имя, но с зада на перед. Это нужно для уникальности вашего приложения в маркете и на телефоне. Все остальное можно оставить по умолчанию как на картинке. Далее нажимаем Finish и ждем, когда проект соберется и мы сможем работать.

Читайте также:
Настройка с2000 4 в программе

Нам нужно добавить зависимости которых нам не хватает в build.gradle модуля в раздел dependencies. А так же включить viewBinding для того, чтобы было удобна делать связь верстки с кодом (смотри изображение)

android < … buildFeatures < viewBinding true >> dependencies

Верстка экрана

Теперь добавим отображение того, чей сейчас ход Х или О. Для этого добавим 3 ImageView. Но для начала, давайте создадим сами иконки Х и О, а так же ß для того, чтобы показывать чей ход.

Для этого справа в области project щелкните правой кнопкой мыши (ПКМ) выберите New → Vector Asset.

В появившемся окне щелкнуть по изображению в пункте Clip Art, найти по поиску back стрелку назад и нажать OK. Я выбрал, чтобы концы были скругленными, для этого во втором выпадающем списке выбрать Round. Вы можете посмотреть, как выглядят остальные и выбрать понравившийся. Размер я задал 64 в пункте Size, а цвет в Color: F44336.

Вы же в палитре можете выбрать тот цвет, который Вам больше всего понравился. Название в пункте Name я указал ic_arrow, чтоб проще было использовать. Для иконок, принято название начинать с ic_ и в snake case, т.е. с подчеркиванием. И нажимаем Next → Finish. Теперь самостоятельно сделайте крестик и нолик.

Для них я выбрал иконку close и panorama fish eye соответственно и выбрал цвет 454FCE, а названия дал ic_cross и ic_circle.

После всех этих действий, в разделе res → drawable появятся новые файлы с нашими иконками. Я рекомендую значение цвета из параметра android:tint перенести в параметр android:fillColor , а сам tint удалить. На некоторых китайских телефонах, отображение ведет себя не корректно и качество иконки ухудшается.

Теперь давайте вернемся к верстке и добавим 3 элемента ImageView. Для этого перейдем в режим Design (это как один из способов верстания экрана), найдем ImageView и перетащим его на макет. В появившемся экране выберем иконку ic_cross. В поле id напишем название cross.

Таким же способом перетащим еще 2 элемента для ic_arrow и ic_circle и дадим им имя id direction и circle соответственно. Теперь выделим каждый элемент поочередно и потянув за верхний круг свяжем вьюшку с верхним guideline.

Теперь сделаем из них цепочку, чтоб они были посередине и склеены друг с другом. Для этого выделяем эти 3 элемента вышкой, нажимаем ПКМ → Chains → Create Horizontal Chain.

Затем снова ПКМ → Chains → Horizontal Chain Style → packed. Попробуйте другие стили и посмотрите, чем они отличаются друг от друга.

Теперь они склеились вместе и находятся посередине, как я и хотел.

Добавим еще один элемент Barrier, который служит для того, чтобы следующий элемент расположить после других, не зависимо от того, какого размера будет каждый. Нажмем на кнопку Guidelines → Add Horizontal Barrier.

И установим следующие значения:

У вас должно получиться что-то вроде этого.

Теперь осталось добавить последний элемент верстки это GridLayout. Но его нужно выбрать из подключенной библиотеки и выбрать androidx.gridlayout.widget.GridLayout. Его уже нужно добавить вручную.

В появившемся окне, в поле File name указываем styles и нажимаем OK. В созданном файле сделаем следующую запись:

1 1 ?android:attr/selectableItemBackground 0dp 0dp true

Аргументы layout_columnWeight и layout_rowWeight служат для установки весов вьюшек и чтобы они равными размерами распределялись по ширине и высоте соответственно. Для того, чтобы эти веса заработали, необходимо android:layout_width и android:layout_height установить в 0dp. А в android:background прописываем атрибут, который будет браться из темы и отображать нажатие на вьюшку. Теперь осталось подключить этот стиль к нашей вьюшке. Возвращаемся к нашей верстке и у созданной ImageView меняем на следующее:

Соединяем верстку с кодом (Binding)

Теперь нужно перейти во фрагмент MainFragment и поправить то, что было сгенерировано студией и добавить binding, который связывает верстку с кодом.

private lateinit var binding: MainFragmentBinding private val viewModel: MainViewModel by viewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View

А оставшийся метод onActivityCreated полностью удалите. Все элементы, которые студия подчеркнет, нужно импортировать с помощью подсказок.

Пишем код

Теперь давайте перейдем в класс MainViewModel и уберем сгенерированные TODO. Нам необходимо хранить состояния ячеек (пустая, крестик, нолик) и для этого создадим массив этих состояний потому, что в Gridlayout все ячейки хранятся списком. А для расчета того кто победил, будем переводить индекс в массиве в координаты [строка:колонка], но об этом позже.

Создадим enum class для хранения состояния. В нем будет храниться картинка и возможность по ней кликать, ведь когда мы уже поставили символ или игра закончилась, то уже кликать по ячейкам нельзя. Напишем следующее в этом же файле в самом низу за пределами `>`.

Создадим поле с массивом этих состояний, я назову ее matrix для простоты. Так же добавим поле для хранения текущего состояния, т.е. чей сейчас ход и создадим метод initGame для инициализации начального состояния игры при первом запуске приложения (init – вызывается при создании класса MainViewModel ) и при сбросе игры ( onReloadClick ).

class MainViewModel : ViewModel() < private lateinit var matrix: Arrayprivate lateinit var currentCellState: CellState init < initGame() >private fun initGame() < matrix = Array(9) < CellState.None >currentCellState = CellState.Cross > fun onReloadClick() < initGame() >>

Читайте также:
Как установить программу шпион на Айфон удаленно

Создадим метод обработки кликов по ячейкам и пропишем в нем для начала смену хода и сохранение в массиве состояние ячейки. Так же создадим поле с LiveData, для того, чтобы на экране смогли отображать кто сейчас ходит.

… private val mCurrentMove = MutableLiveData() val currentMove: LiveData = mCurrentMove … private fun initGame() < … mCurrentMove.value = currentCellState >fun onCellClick(index: Int)

Здесь mCurrentMove является изменяемым и он закрыт для обращения из вне класса, а currentMove является не изменяемым и он доступен снаружи класса.

Давайте подпишемся на изменение хода и будем отображать на экране чей сейчас ход. Для этого перейдем в MainFragment , переопределим метод onViewCreated и добавим в него следующее.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) < super.onViewCreated(view, savedInstanceState) binding.field.forEachIndexed < index, v ->v.setOnClickListener < viewModel.onCellClick(index) >> viewModel.currentMove.observe(viewLifecycleOwner) < binding.direction.animate() .rotation(if (it == CellState.Cross) 0f else 180f) // .scaleY(if (it == Mark.Cross) 1f else -1f) >>

binding.field.forEachIndexed – к каждой вьюшке находящейся в GridLayout устанавливаем слушатель на клик.

binding.direction – это наша стрелочка на экране. Соберите проект и запустите его, посмотрите что происходит когда мы кликаем по ячейкам. Попробуйте убрать комментирование со строки со scaleY, а строку с rotation закомментировать или убрать и посмотреть что получилось.

Добавим отображение иконке в той ячейке, по которой мы кликнули. Чтобы не перерисовывать весь массив ячеек, а менять значение только той, по которой мы кликнули, будем передавать индекс ячейки и ее новое значение. Для этого добавим еще одно поле mCellStateByIndex, в которую будет передаваться индекс и новое состояние ячейки.

— MainViewModel.kt — private val mCellStateByIndex: MutableLiveData> = SingleLiveEvent() val cellStateByIndex: LiveData> = mCellStateByIndex fun onCellClick(index: Int) < matrix[index] = currentCellState mCellStateByIndex.value = Pair(index, currentCellState) … >— MainFragment.kt — override fun onViewCreated(view: View, savedInstanceState: Bundle?) < … viewModel.cellStateByIndex.observe(viewLifecycleOwner) < val (index, state) = it with(binding.field.getChildAt(index) as ImageView) < isEnabled = state.isClickable setImageResource(state.icon) >> > — SingleLiveEvent.kt — class SingleLiveEvent : MutableLiveData() < private val pending = AtomicBoolean(false) override fun observe(owner: LifecycleOwner, observer: Observer) < super.observe(owner, Observer < t: T ->if (pending.compareAndSet(true, false)) < observer.onChanged(t) >>) > override fun setValue(value: T) < pending.set(true) super.setValue(value) >>

SingleLiveEvent – этот класс служит для того, чтобы при смене конфигурации (например, переворота экрана) не вызывалось снова событие на отрисовку вьюшки. Этот класс нужно создать отдельным файлом.

Добавим еще состояние нашей игры (запущена и остановлена), чтобы нельзя было кликать по ячейкам, когда игра завершилась и LiveData, в которой будет храниться состояние игры и список состояний ячеек

Создадим enum GameStatus и напишем его ниже CellState.

enum class GameStatus

Добавим поле mStates и сделаем несколько изменений.

— MainViewModel.kt — private val mStates = MutableLiveData>>() val states: LiveData>> = mStates private fun initGame() < … mStates.value = Pair(GameStatus.Started, matrix) >— MainFragment.kt — override fun onViewCreated(view: View, savedInstanceState: Bundle?) < … viewModel.states.observe(viewLifecycleOwner) < val (status, matrix) = it matrix.forEachIndexed < index, state ->with(binding.field.getChildAt(index) as ImageView) < setImageResource(state.icon) isEnabled = state.isClickable status == GameStatus.Started >> > >

Создаем свою вьюшку и рисуем на ней сетку

Создадим новый файл. Для этого в правой части проекта щелкните ПКМ по ru.otus.tictactoe → New → Kotlin Class/File и введите название FieldView.

И напишите следующее в этот файл:

Обязательно нужно наследоваться от androidx.gridlayout.widget.GridLayout .

Еще нужно добавить в ресурсы в которых будет указан цвет и размер линии. Для этого ПКМ по res → New → Android Resource File.

В появившемся окне, в поле File name: написать values и нажать OK.

Появится новый файл values.xml. откройте его и напишите следующее:

#454FCE 8dp

Теперь ошибки должны исчезнуть.

Осталось поменять нашу вьюшку в верстке.

Вычисляем, кто выиграл

Для начала создадим sealed class с возможными вариантами выигрыша (по горизонтали, по вертикали, по диагонали и нет выигрыша).

— FieldView.kt — private var mWinLineState: WinLineState = WinLineState.None private var winLineRect: RectF? = null override fun onMeasure(widthSpec: Int, heightSpec: Int) < … drawWinLine(mWinLineState) >override fun dispatchDraw(canvas: Canvas?) < super.dispatchDraw(canvas) canvas?.run < … winLineRect?.let < val line: RectF = when (mWinLineState) < is WinLineState.Horizontal ->RectF(it.left, it.top, it.right, it.bottom) is WinLineState.Vertical -> RectF(it.left, it.top, it.right, it.bottom) WinLineState.MainDiagonal -> RectF(it.left, it.top, it.right, it.bottom) WinLineState.ReverseDiagonal -> RectF(it.left, it.top, it.right, it.bottom) WinLineState.None -> it > drawLine(line.left, line.top, line.right, line.bottom, paint) > > > fun drawWinLine(winLineState: WinLineState) < mWinLineState = winLineState winLineRect = when (winLineState) < WinLineState.MainDiagonal ->RectF(strokeSize, strokeSize, widthF — strokeSize, heightF — strokeSize) WinLineState.ReverseDiagonal -> RectF(widthF — strokeSize, strokeSize, strokeSize, heightF — strokeSize) is WinLineState.Horizontal -> < val y = halfCellHeight + cellHeight * winLineState.row RectF(strokeSize, y, widthF — strokeSize, y) >is WinLineState.Vertical -> < val x = halfCellWidth + cellWidth * winLineState.column RectF(x, strokeSize, x, heightF — strokeSize) >WinLineState.None -> null > if (winLineRect == null) return invalidate() > sealed class WinLineState

Создадим методы расчета выигрышного положения.

— MainViewModel.kt — private val mWinState : MutableLiveData = MutableLiveData() val winState: LiveData = mWinState private fun initGame() < … mWinState.value = WinLineState.None >fun onCellClick(index: Int) < matrix[index] = currentCellState mCellStateByIndex.value = Pair(index, currentCellState) val row = index / 3 val column = index % 3 val state = checkWin(row, column) if (state != WinLineState.None) < mStates.value = Pair(GameStatus.Finished, matrix) mWinState.value = state return >currentCellState = if (currentCellState == CellState.Cross) CellState.Circle else CellState.Cross mCurrentMove.value = currentCellState > private fun checkWin(row: Int, column: Int): WinLineState < //check row if (checkLine < matrix[getIndex(row, it)] == currentCellState >) return WinLineState.Horizontal(row) // check column if (checkLine < matrix[getIndex(it, column)] == currentCellState >) return WinLineState.Vertical(column) if (row == column) < // check main diagonal if (checkLine < matrix[getIndex(it, it)] == currentCellState >) return WinLineState.MainDiagonal > if (row + column == 2) < // check reverse diagonal if (checkLine < matrix[getIndex(it, 2 — it)] == currentCellState >) return WinLineState.ReverseDiagonal > return WinLineState.None > private fun checkLine(function: (Int) -> Boolean): Boolean < for (i in 0..2) < if (!function(i)) return false >return true > private fun getIndex(row: Int, column: Int) = row * 3 + column — MainFragment.kt — override fun onViewCreated(view: View, savedInstanceState: Bundle?) < … viewModel.winState.observe(viewLifecycleOwner) < binding.field.drawWinLine(it) >>

Читайте также:
Программа паскаль объем Куба

Сбрасывание состояния игры

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

Добавьте иконку cached и назовите ее ic_reload. Добавьте ресурс, как это делали с цветом и размером, только в открывшемся окне, поменяйте Resource type на Menu и в File name напишите menu_reload. А в ресурсах strings добавьте название кнопки

— resmenumenu_reload.xml — — resvaluesstrings.xml — reload

Теперь осталось только добавить ее и реализовать обработку этой кнопки. Для этого переходим в MainFragment и добавляем следующее.

override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setHasOptionsMenu(true) >override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) < super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.menu_reload, menu) >override fun onOptionsItemSelected(item: MenuItem): Boolean < if (item.itemId == R.id.action_reload) < viewModel.onReloadClick() return true >return super.onOptionsItemSelected(item) >

Источник: otus.ru

Крестики-нолики на Python

Статьи

Автор Admin На чтение 5 мин Просмотров 2.8к. Опубликовано 09.11.2022

Введение

В статье напишем игру “Крестики-нолики” на Python.

Крестики-нолики — логическая игра между двумя соперниками на квадратном поле 3×3 клетки, или бо́льшего размера. Один из игроков играет за “крестики”, а второй за “нолики”.

Рисуем игровое поле

Начнём с того, что нарисуем само игровое поле для игры.

Для начала сгенерируем список с числами от одного, до 9:

board = list(range(1, 10))

Создадим функцию draw_board(), аргументом которой будет board:

def draw_board(board): print(«-» * 13) for i in range(3): print(«|», board[0 + i * 3], «|», board[1 + i * 3], «|», board[2 + i * 3], «|») print(«-» * 13)

В функции выводим первую строку состоящую из 13 символов “тире”, после чего, в цикле прорисовываем остальные края поля.

При вызове функции будет следующий вывод:

Принимаем ввод пользователя

Теперь нам нужно создать функцию для приёма ввода.

Создадим функцию take_input() с аргументом player_token:

def take_input(player_token): valid = False while not valid: player_answer = input(«Куда поставим » + player_token + «? «) try: player_answer = int(player_answer) except ValueError: print(«Некорректный ввод. Вы уверены, что ввели число?») continue if 1

Внутри функции сначала задаётся переменная valid, которая равняется False, после чего идёт цикл while, который не закончится, пока valid не примет значение True. В цикле производится ввод пользователем определённой клетки, в которую будет ставиться крестик, либо нолик. Если же пользователь ввёл, а какой-либо другой символ, выведется ошибка.

Далее в условии проверяется, занята ли введённая клетка. Если клетка занята, то выведется соответствующая ошибка, если же введено число не в диапазоне от 1, до 10 – будет так же выведено соответствующее сообщение.

Проверка, выиграл ли игрок

Создадим функцию check_win(), в которой будем проверять, выиграл ли игрок. Аргументом функции будет board:

def check_win(board): win_coord = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6)) for each in win_coord: if board[each[0]] == board[each[1]] == board[each[2]]: return board[each[0]] return False

Внутри функции создаётся кортеж win_coord, в котором хранятся победные комбинации. В цикле производится проверка на победу игрока, если он побеждает, то выводится сообщение о победе, если же нет – возвращается False, и игра продолжается.

Создание главной функции

Теперь создадим функцию main() с аргументом board:

def main(board): counter = 0 win = False while not win: draw_board(board) if counter % 2 == 0: take_input(«X») else: take_input(«O») counter += 1 tmp = check_win(board) if tmp: print(tmp, «выиграл!») win = True break if counter == 9: print(«Ничья!») break draw_board(board)

Внутри функции, после обозначения переменных, создаётся цикл, который закончится после победы одного из игроков, или ничьей. Внутри цикла проводится проверка, какой игрок сходил, после чего вызывается функция take_input() с соответствующим символом игрока. Далее идёт проверка, какой игрок выиграл, или вышла ничья.

Итоговый код игры “Крестики-нолики” на Python

board = list(range(1, 10)) def draw_board(board): print(«-» * 13) for i in range(3): print(«|», board[0 + i * 3], «|», board[1 + i * 3], «|», board[2 + i * 3], «|») print(«-» * 13) def take_input(player_token): valid = False while not valid: player_answer = input(«Куда поставим » + player_token + «? «) try: player_answer = int(player_answer) except ValueError: print(«Некорректный ввод. Вы уверены, что ввели число?») continue if 1

В статье мы с Вами написали игру “Крестики-нолики” на Python! Надеюсь Вам понравилась статья, желаю удачи и успехов!

Источник: it-start.online

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru