sexta-feira, 30 de junho de 2017

C# para iniciantes - Aula 1: Variáveis

Introdução:
Olá, na primeira aula de hoje sobre C# para iniciantes nós vamos abordar o assunto sobre as variáveis.
Mas afinal de contas, o que é uma variável? Resposta: A variável é um tipo primitivo de dado em C# que tem como principal função guardar/armazenar valores.
Imagine as variáveis como uma caixa que guarda objetos: Você quer organizar as suas caixas de acordo com o objeto específico que ela vai armazenar, por exemplo, uma caixa que só guarde sapatos, outra caixa que somente guarda figurinhas, e uma outra caixa que somente armazena biscoitos.
Note que cada caixa possui um tipo específico de objetos armazenados, não é? Pois então, as variáveis são como essas caixas, cada uma delas armazenarão tipos específicos de dados, quer ver?

Iniciando a aula:
Para seguir com nossas aulas é de suma importância que você tenha instalado em seu computador o programa Visual C# Express ou até mesmo o Visual Studio, para que você possa visualizar os exemplos na íntegra e também treinar seus códigos, pois ambos programas são compiladores da linguagem C#.
Com seu Visual C# ou Studio aberto, vá em "File >> New Project >> >> Em 'Templates' escolha C# e vá em >> Console Application:



Quando você clicar em Console Application você abrirá a seguinte tela:


Sobre as bibliotecas, classes e métodos, nós iremos discutir isso nas aulas posteriores, onde você vai entender o que de fato são e como funcionam, porém nessa primeira aula nós vamos utilizar a aplicação de console (Console application) para criarmos algoritmos em C# de exemplo, para que você possa visualizar o funcionamento das variáveis na íntegra.
O algoritmo será escrito na parte ''início do bloco'' como mostrado na imagem acima.
Tenha em mente que esses blocos de códigos devem conter sempre seus respectivos terminais, ou seja, o início do bloco que é representado pela chave aberta: ''{'' e o final do bloco, a chave fechada ''}''.
Nessa primeira aula não iremos abordar o assunto sobre terminais, mas lhe garanto que nas aulas posteriores esse assunto voltará, não se preocupe.

Valores inteiros e operações:
Para iniciar nossa aula terei como exemplo clássico a variável do tipo inteiro (int), que tem como função apenas armazenar valores numéricos do tipo INTEIRO, ou seja, números negativos e positivos, mas que não possuem casas decimais!
Uma variável do tipo inteiro é muito útil para armazenar valores que não possuem valores 'quebrados', como a idade de uma pessoa, a placa de um carro, uma senha, os dias da semana e etc.
Para definir uma nova variável em C# você primeiramente deve especificar seu tipo, ou seja, deve escrever que ela armazena valores inteiros, por exemplo.
Para isso basta escrever 'int':

À frente da palavra 'int' você criará a variável a partir de um nome, este nome pode ser qualquer um que você queira adotar, contanto que não inicie com números (773variavel), por exemplo, ou tenha caracteres especiais e acentuações, por exemplo (*variavel##) ou (variável).
O nome é criado da forma como o programador desejar, mas é sempre bom aconselhar que quanto mais o nome seja objetivo e curto, melhor será para você na hora de programar, em outras palavras, colocar o nome da variável conforme a sua 'função' é uma boa tática:


Note a variável ''pontos''. Ela é uma variável de exemplo, que, possivelmente poderá armazenar o valor dos pontos de um jogo qualquer.
Uma coisa que você não deve esquecer é que após criar sua variável você deve adicionar um ponto e vírgula (;) após seu nome para indicar o final deste comando.
Você também pode criar mais de uma variável na mesma linha de código, se você desejar criar várias variáveis de um mesmo tipo de uma vez só, por exemplo:

Perceba que as variáveis são diferenciadas pela separação por uma vírgula (,) e que o comando encerra com o ponto e vírgula (;).

Como as variáveis inteiras são do tipo ''numéricas'', ou seja, trabalham com NÚMEROS, nós podemos realizar operações matemáticas com elas.
O símbolo de mais (+) faz com que possamos somar duas variáveis ou até mesmo dois números, por exemplo:

Vamos criar um algoritmo que solicite para o usuário que ele digite um número qualquer, e após ele digitar esse número nós iremos somar com 5 e mostraremos o resultado.
Para isso, primeiro nós criaremos nossa variável do tipo inteiro com o nome de ''numero''.
Para exibir uma mensagem de texto ao usuário na aplicação de console, nós utilizamos o comando "Console.WriteLine();" que literalmente significa ''Escrever linha", ou seja, com esse comando é possível escrevermos textos a serem exibimos na tela de debug.
Dentro do parênteses deste comando e entre aspa duplas (") nós podemos escrever o seguinte: "Olá, usuário! Digite um número qualquer":

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Aula1
{
    class Program
    {
        static void Main(string[] args)
        {
            int numero;
            Console.WriteLine("Olá, usuário! Digite um número qualquer");
        }
    }
}

O número digitado pelo usuário deverá ficar armazenado na variável ''numero'' para que possamos trabalhar com ela, certo? Ou seja, o usuário irá digitar um texto (caractere) e apesar de ser um número, o compilador nesse primeiro momento vai entender que aquilo que foi digitado pelo usuário foi um texto e não um número de fato. 
Um texto não pode realizar operações de soma, por exemplo, por isso nós devemos converter o que foi digitado pelo usuário para número do tipo inteiro, assim:

numero = Convert.ToInt32(Console.ReadLine());

Explicando o trecho acima, ''numero ='' significa atribuição, ou seja, nós estamos atribuindo um valor para a variável ''numero'', estamos colocando alguma coisa dentro dessa variável. 
O símbolo de igualdade (=) é utilizado para atribuição!
E o que está sendo ''colocando'' na variável ''numero''? Um Console.ReadLine(), mas o que é isso?
O comando Console.ReadLine é literalmente "Ler linha'', ou seja, ele vai ''ler'' na linha acima o que foi digitado e irá armazenar na variável ''numero'' o que foi escrito pelo usuário.
O comando Convert.ToInt32 é um método de conversão, neste caso, a conversão é para inteiro (int), e seu argumento (o que está entre os parênteses) é justamente o Console.ReadLine, ou seja, o que o usuário digitou. Em outras palavras, o argumento irá ''identificar'' o que será convertido.
Em resumo, esse trecho está armazenando dentro da variável ''numero'' o valor digitado pelo usuário e está o convertendo de caractere (texto) para inteiro (número).

Agora que a variável ''numero'' está devidamente convertida e armazena o valor digitado pelo usuário, podemos realizar a operação de soma com o número 5, após isso, o programa irá exibir o resultado dessa soma, ou seja, do valor digitado mais o número 5.
Para exibir algo para o usuário você já sabe como se faz, basta utilizar o comando: Console.WriteLine().
Para exibir um texto ou uma mensagem, como fizemos mais acima, você o digita entre aspas duplas, mas para exibir o valor de uma variável ou de uma operação matemática você simplesmente escreve a operação dentro do Console.WriteLine sem as aspas, assim:

Console.WriteLine(numero + 5);

Assim o programa irá exibir o resultado da soma entre o que há dentro da variável ''numero'' (o que o usuário digitou) e o número cinco.
Seu código deve estar assim:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Aula1
{
    class Program
    {
        static void Main(string[] args)
        {
            int numero;
            Console.WriteLine("Olá, usuário! Digite um número qualquer");
            numero = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine(numero + 5);
        }
    }
}

Para testar (debugar) seu código dê um F5 no seu teclado e uma janela de execução aparecerá:




Agora digite um número inteiro qualquer e perceba que o programa realiza a soma porém fecha a execução rapidamente, você não teve nem tempo de visualizar o resultado, não é?
Para acabar com esse desconforto, digite o código: Console.ReadKey(); que significa ''leia chave'', no caso da programação ''leia tecla'', que só fará o programa fechar e parar a execução quando o usuário pressionar uma tecla qualquer, assim você poderá ver o resultado da soma:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Aula1
{
    class Program
    {
        static void Main(string[] args)
        {
            int numero;
            Console.WriteLine("Olá, usuário! Digite um número qualquer");
            numero = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine(numero + 5);
            Console.ReadKey();
        }
    }
}




Veja que eu digitei o número ''20'' e logo abaixo o programa me retorna o valor 25 que é justamente a soma do meu valor digitado + o número 5, certo? Ou seja, o algoritmo está funcionando devidamente.

Você pode também utilizar o comando Console.WriteLine para exibir mais de um dado, ou seja, você pode exibir um texto e o resultado dessa soma numa mesma linha de código, basta separar os dados por uma sinal de soma (+), assim:

Console.WriteLine("A soma do seu número digitado com o 5 é" + (numero +5));

Olha como que fica no debug:



Dica: Outro meio de exibir dados no Console.WriteLine é a utilização dos index das operações e variáveis dentro de um texto, por exemplo, querer exibir o valor digitado pelo usuário, e o seu resultado, ficando assim:

Console.WriteLine("O valor digitado pelo usuário foi {0} e a soma com o número 5 resultou em {1}", numero, (numero+5));

Onde dentro das chaves você informa o index da variável a ser exibida, sendo a primeira variável tendo sempre o index 0, a segunda tendo index 1, e assim sucessivamente, separando após o texto, as variáveis a serem exibidas por vírgulas:


Note que dessa forma a exibição dos valores ficou mais organizada, mas lembre-se que este é apenas mais um modo de exibir algo para o usuário, e as duas formas de exibição aqui mostradas nessa aula estão corretas e funcionam.

No exemplo acima nós somamos uma variável com uma constante (ou seja, um valor que não se altera, o número 5, por exemplo) mas você pode também somar variáveis com outras variáveis, por exemplo:
Vamos criar um algoritmo que solicite dois números ao usuário e ao final exiba para ele o resultado desta soma, ficaremos com o seguinte código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Aula1
{
    class Program
    {
        static void Main(string[] args)
        {
            int numA, numB;
            Console.WriteLine("Olá, usuário! Digite um número qualquer");
            numA = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Por favor digite mais um número!");
            numB = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("A soma de {0} com {1} é igual a {2}", numA, numB, (numA + numB));
            Console.ReadKey();
        }
    }
}

No debug você terá algo assim:



Até agora nós fizemos uma única operação matemática que foi a soma, mas obviamente você poderá fazer outras operações como subtração, multiplicação, divisão, e ainda acessar o resto de uma divisão! Basta utilizar seus respectivos operadores:

Soma -> +
Subtração -> -
Multiplicação -> *
Divisão -> /
Resto da divisão -> %

Veja abaixo um exemplo de código que exibe a soma, subtração, multiplicação, divisão e resto da divisão entre dois números fornecidos pelo usuário:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Aula1
{
    class Program
    {
        static void Main(string[] args)
        {
            int numA, numB;
            Console.WriteLine("Olá, usuário! Digite um número qualquer");
            numA = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Por favor digite mais um número!");
            numB = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Soma: {0} \nSubtração: {1} \nMultiplicação: {2} \nDivisão {3} e resto da divisão: {4}", (numA + numB), (numA - numB), (numA * numB), (numA / numB), (numA % numB));
            Console.ReadKey();
        }
    }
}


Dica: Foi utilizado o comando ''\n'' dentro do Console.WriteLine para pular uma linha!

Até aqui foi lhe mostrado um único tipo de variável (as variáveis do tipo inteiro) mas ainda tenho alguns outros tipos para lhe mostrar:

Outros tipos de variáveis:

Números decimais:
Temos também os tipos de variáveis numéricas que trabalham com valores decimais (números quebrados com vírgulas) são as variáveis do tipo 'decimal', 'float' e 'double':


Perceba que para as variáveis do tipo ''decimais'', você precisa colocar a letra minúscula de seu tipo ao atribuir um valor à ela, diferente das variáveis do tipo inteiro:



Como são variáveis do tipo numéricas, você também pode realizar operações matemáticas com essas variáveis, por exemplo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Aula1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Poupança onde o valor depositado rende em 0.40% de juros por mês!
            float valorDepositado;

            Console.WriteLine("Informe o valor a ser depositado");
            valorDepositado = float.Parse(Console.ReadLine());
            Console.WriteLine("Com o depósito de {0} reais, seu rendimento será de: {1} reais", valorDepositado, (valorDepositado * (0.40/100.0) + valorDepositado));
            Console.ReadKey();
        }
    }
}



Dica: Foi utilizado para a conversão do valor digitado pelo usuário para float o seguinte método:
float.Parse();
E sim, você pode utilizar o mesmo método para a conversão em double e decimal:
double.Parse(); e decimal.Parse();

Textos e caracteres:

Outro tipo de variáveis que podemos encontrar são as variáveis do tipo caracteres, que armazenam valores textuais.
Temos como exemplo o primeiro tipo de variável em caractere, a variável do tipo ''char'' (que significa caractere mesmo), onde a mesma armazena apenas  UM caractere específico, por exemplo:



Outro tipo de variável que aceita caractere é o tipo string (texto) que como o nome sugere, pode armazenar textos contendo vários caracteres:



Você pode utilizar a variável do tipo ''string'' para chamar o usuário pelo seu nome, por exemplo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Aula1
{
    class Program
    {
        static void Main(string[] args)
        {
            string nome;
            Console.WriteLine("Digite o seu nome");
            nome = Console.ReadLine();
            Console.WriteLine("Olá {0} bom te ver aqui", nome);
            Console.ReadKey();

        }
    }
}


Dica: Perceba que o usuário entra com um texto a ser digitado (seu nome) e no código não houve a necessidade da conversão para string (assim como ocorre com variáveis do tipo inteiras e decimais) porque o texto digitado pelo usuário já é de fato um caractere.

Como não são variáveis do tipo numéricas, essa variáveis em caractere não realizam operações matemáticas, mas se você somá-las, por exemplo, você poderá unir seus valores, por exemplo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Aula1
{
    class Program
    {
        static void Main(string[] args)
        {
            string silaba1, silaba2;
            Console.WriteLine("Digite uma sílaba");
            silaba1 = Console.ReadLine();
            Console.WriteLine("Digite outra sílaba");
            silaba2 = Console.ReadLine();
            Console.WriteLine("A palavra formada com as sílabas fornecidas foi: {0}", (silaba1 + silaba2));
            Console.ReadKey();

        }
    }
}



Veja que mesmo digitando números, e apesar de o código somas essas variáveis, você não terá o resultado desta soma, mas sim o agrupamento destes números digitados:


345 + 98 não é 34598, mas esse resultado nos foi fornecido porque aqui não estamos somando variáveis numéricas, e sim variáveis do tipo caractere!

Variáveis lógicas:

E por fim, outro tipo de variável que você poderá se deparar são as variáveis do tipo boleanas (bool) ou também chamadas de variáveis lógicas, que retornam apenas dois tipos de informações: verdadeiro (true) ou falso (false).
São muito utilizadas para trabalharmos com estruturas de repetições e estruturas condicionais, mas deixaremos ambos assuntos para uma próxima aula, sim?

Aqui foi só uma breve apresentação desse tipo de variável. Eu gostaria de explicar melhor como utilizá-las em aulas posteriores, pode ser?

Finalização:
Então com isso nossa primeira aula sobre C# e suas variáveis chegou ao fim!
Olha só quanta coisa você aprendeu! Como abrir um console de aplicação no Visual Studio ou Visual C#, o que são variáveis, quais são seus tipos, como atribuir valores a elas, como realizar cálculos matemáticos com elas, como convertê-las e exibi-las na execução de debug e diversas informações importantes, não?
Com o conhecimento adquirido até aqui, creio que você esteja apto para realizar essas tarefas de fixação para treinar sua programação, que tal?

1) Crie um programa que solicite três números ao usuário que realize a soma entre os dois primeiros valores digitados e em seguida multiplique esse resultado pelo terceiro valor informado.

2) Crie um programa que solicite o nome de um aluno e suas notas em quatro disciplinas distintas, e por fim exiba sua média aritmética e o seu nome.

3) Crie um programa que solicite a quantidade de meses, e ao final exiba quantos anos se passaram de acordo com esses meses.

4) Crie um programa que solicite o valor total de uma compra, o valor a pagar pelo usuário e informe seu troco.

5) Crie um programa que solicite 4 palavras diferentes ao usuário e ao final exiba a frase que foi formada a partir dessas palavras



domingo, 18 de junho de 2017

Jogo da velha em C# - Tutorial para iniciantes

No tutorial de hoje relacionado à linguagem de programação em C#, nós vamos utilizar o Visual C# Express (mas você pode estar utilizando o VisualStudio que também dará conta), para criarmos um mini-game de jogo da velha apenas utilizando variáveis de uma classe pública, e algumas condições, quer ver?:


1º Para acompanhar esse tutorial você vai precisar do software: VisualStudio ou Visual C# express (ou qualquer outro compilador de C#):

2º Abre o dito cujo, e vá em ''File >> New Project >> Windows Form Application."
No campo "Name", você digitará "Jogo da velha" ou qualquer outro nome que você queira dar ao aplicativo:


3º Agora com o formulário aberto você vai na opção ''toolbox'' encontrada no canto esquerdo da tela, e seleciona a opção ''Button'', arrastando-o para seu formulário.
Ajeite as dimensões do botão para que ele fique um quadrado, pois esses botões serão as grades do jogo da velha, onde os desenhos dos ''x'' e dos ''o'' ficarão inscritos:


Como não queremos que esses botões tenham algo escrito, porque eles serão as grades do jogo, dê um clique no botão, que daí no canto inferior direito da sua tela aparecerá a janela de propriedades do evento, nessa janela você vai na opção ''Text'' e onde está escrito ''button1'' você simplesmente apaga:


A grade do jogo da velha possui 3 linhas e 3 colunas, portanto ainda faltam mais 8 botões para formarmos a grade completa. Tendo isso em mente, de um CTRL +C CTRL + V no botão criado, e crie mais 8 botões novos, os dispondo em 3 linhas e 3 colunas, assim:


4º Vamos também registrar as pontuações de cada jogador e os empates: Para isso criamos três ''labels'' com os nomes: "P1 Vitórias", "P2 Vitórias" e "Empates":


Vamos também criar mais 3 labels para exibir as variáveis dessas informações. todas elas com o texto inicial ''Nada'':


5º E por fim, criaremos mais um botão, só que dessa vez esse botão será para ''limpar a tela'' e resetar o jogo, para que os players possam jogar de novo quando o jogo termina:


6º Agora que já terminamos de configurar o design do formulário vamos programar os botões.
Dê um duplo clique no primeiro botão e abra a tela de scripts.
Dentro do bloco do método do botão da primeira lacuna da grade do jogo nós iremos programar o que acontecerá quando o user clicar aqui:



Mas acima desse código vamos criar uma classe pública do programa, para que possamos definir as variáveis globais onde poderemos acessá-las em qualquer método do script:

public class Global
        {

        }

Dentro dessa classe criaremos a definição de dois tipos de variáveis: inteiro e boleanos:

 public class Global
        {
            public static bool
                public static int

        }

A variável boleana será a variável que irá definir se está na vez do jogador 1 (false) ou na vez do jogador 2 (true), e também teremos uma variável para definir se os botões estão desabilitados, impedindo que os jogadores cliquem nas grades após ser anunciado o vencedor ou o empate. Os botões só voltarão a ficar habilitados quando o jogador clicar no botão ''Reset".
Então vamos definir as duas variáveis lógicas:

public class Global
        {
            public static bool turn, button_disable;
                public static int

        }

Agora vamos definir as variáveis inteiras que irão contabilizar as vitórias de cada jogador, e o empate, e também quantas rodadas se passaram no jogo:

 public class Global
        {
            public static bool turn, button_disable;
            public static int player1_wins = 0, player2_wins = 0, tie = 0, rounds = 0;

        }

Ainda dentro da definição das variáveis inteiras vamos definir variáveis distintas para cada grade do jogo: Vamos chamar a variável da primeira grade de "A", da segunda grade de "B" e assim sucessivamente:

 public class Global
        {
            public static bool turn, button_disable;
            public static int player1_wins = 0, player2_wins = 0, tie = 0, rounds=0,  A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0;

        }

*Nessa parte você pode utilizar uma array também, caso deseje o código mais compacto!

7º Feito isso, vá ao método do primeiro botão da grade (que a partir de agora chamaremos de "A").
O que acontecerá quando o jogador clicar aqui? Ou vai aparecer um "X" ou um "O", certo? Então vamos criar uma condição que verifique três casos ao mesmo tempo:

Primeiro: Se está na vez do jogador 1 ou na vez do jogador 2;
Segundo: Se o botão está habilitado na grade;
Terceiro: Se essa grade ainda não está ocupada.
Crie a condição da seguinte forma:

 if (Global.turn == false && Global.button_disable == false && Global.A == 0)
            {

            }
A primeira verificação irá analisar se a variável lógica ''turn'' é false ou true, sendo false a vez do jogador 1.
A segunda verificação acontecerá em torno do botão, se está habilitado (false).
E por fim, a terceira verificação é com relação se está grade está ocupada: Caso a variável "A" seja 0, isso significa que a grade está vazia e poderá ser preenchida, caso seja um número diferente de zero, isso significa que a grade já está ocupada e o jogador não poderá colocar sua peça aqui.

Dentro da condição você irá colocar para que o botão agora tenha escrito o texto "X", a variável A fique igual a 1, a variável ''rounds'' aumente 1 e a variável turn fique true, dando a vez para o próximo jogador:

if (Global.turn == false && Global.button_disable == false && Global.A == 0)
            {
                button1.Text = "X";
                Global.A = 1;
                Global.rounds++;
                Global.turn = true;
            }

Agora faremos mais uma condição com as mesmas verificações, mas agora para o jogador 2, sendo a variável ''turn'' tendo que ser ''true'' o texto deve ser "O", e a variável "A" deve ficar igualada a 2, bem como a variável turn agora deve ficar false:

O código desse botão deve estar assim:

 private void button1_Click(object sender, EventArgs e)
        {
            // Verificação da jogada do player 1(X):

            if (Global.turn == false && Global.button_disable == false && Global.A == 0)
            {
                button1.Text = "X";
                Global.A = 1;
                Global.rounds++;
                Global.turn = true;
            }
            // Verificação da jogada do player 2(O):
            if (Global.turn == true && Global.button_disable == false && Global.A == 0)
            {
                button1.Text = "O";
                Global.A = 2;
                Global.rounds++;
                Global.turn = false;
            }

        }


Você pode pressionar F5 no seu teclado para debugar o código e testar: Clique na primeira lacuna da grade e veja que aparecerá o X ali, e note que se você tentar clicar novamente nessa lacuna, o X não é substituído pelo O:


Agora que está tudo okay, volte no método do botão A, e adicione o seguinte comando:
checkingWinners(); nas condições de cada jogador:

 if (Global.turn == false && Global.button_disable == false && Global.A == 0)
            {
                button1.Text = "X";
                Global.A = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }
            // Verificação da jogada do player 2(O):
            if (Global.turn == true && Global.button_disable == false && Global.A == 0)
            {
                button1.Text = "O";
                Global.A = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }

        }

Aqui nós estaremos chamando um método de verificação para ver quem ganhou no jogo ou se deu empate.
Para não nos depararmos com futuros erros ao debugar o teste, abaixo do método desse botão crie um método privado com o nome checkingWinner() e vamos por enquanto deixar vazio, porém já já nós vamos escrever o que ele fará:

private void checkingWinner()
        {

        }

Volte para a janela do formulário e dê um duplo clique no botão ao lado do botão A:
Copie o código do botão A e cole dentro do método do botão B, substituindo nas verificações a variável A por B, nas atribuições onde está A coloque B, onde está escrito ''button1'' você coloca ''button2'' e seu código ficará assim:

private void button2_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.B == 0)
            {
                button2.Text = "X";
                Global.B = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }
            if (Global.turn == true && Global.button_disable == false && Global.B == 0)
            {
                button2.Text = "O";
                Global.B = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }

        }

Debuge (F5) e veja que agora você tem os turnos dos jogadores alternados, pois agora temos o jogador X e o jogador O:

Só temos dois botões programados, o que você deve fazer agora é colar o código do primeiro botão dentro dos métodos dos outros sete botões (dando um duplo clique em cada um para abrir seu método automaticamente) e não se esquecendo de substituir as variáveis como fizemos acima.
Depois de programar cada botão, você terá um código assim:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Jogo_da_velha
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public class Global
        {
            public static bool turn, button_disable;
            public static int player1_wins = 0, player2_wins = 0, tie = 0, rounds = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Verificação da jogada do player 1(X):

            if (Global.turn == false && Global.button_disable == false && Global.A == 0)
            {
                button1.Text = "X";
                Global.A = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }
            // Verificação da jogada do player 2(O):
            if (Global.turn == true && Global.button_disable == false && Global.A == 0)
            {
                button1.Text = "O";
                Global.A = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }

        }

        private void checkingWinner()
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.B == 0)
            {
                button2.Text = "X";
                Global.B = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }
           
            if (Global.turn == true && Global.button_disable == false && Global.B == 0)
            {
                button2.Text = "O";
                Global.B = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }

        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.C == 0)
            {
                button3.Text = "X";
                Global.C = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.C == 0)
            {
                button3.Text = "O";
                Global.C = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }

        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.D == 0)
            {
                button4.Text = "X";
                Global.D = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.D == 0)
            {
                button4.Text = "O";
                Global.D = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.E == 0)
            {
                button5.Text = "X";
                Global.E = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.E == 0)
            {
                button5.Text = "O";
                Global.E = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.F == 0)
            {
                button6.Text = "X";
                Global.F = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.F == 0)
            {
                button6.Text = "O";
                Global.F = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.G == 0)
            {
                button7.Text = "X";
                Global.G = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.G == 0)
            {
                button7.Text = "O";
                Global.G = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }
        }

        private void button8_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.H == 0)
            {
                button8.Text = "X";
                Global.H = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.H == 0)
            {
                button8.Text = "O";
                Global.H = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }
        }

        private void button9_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.I == 0)
            {
                button9.Text = "X";
                Global.I = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.I == 0)
            {
                button9.Text = "O";
                Global.I = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }
        }
    }
}

Se você programou tudo corretamente, ao debugar você poderá clicar em qualquer lacuna da grade e terá as peças sendo dispostas conforme seus cliques, alternando nos turnos de cada jogador:



Veja que no exemplo acima o jogador 1 teria ganho, tendo a vitória na diagonal, mas como ainda não programamos a checagem de vitórias e empates, nada ocorreu.
Vamos acabar com esse problema agora?

8º Volte ao método checkingWinner() e vamos primeiramente checar se o jogador 1 venceu.
Para nos auxiliar nessa etapa, esboce uma grade de jogo da velha num editor de imagens e nomeie as lacunas de A à I conforme nosso código, para visualizarmos mais facilmente as possibilidades de vitórias:

Perceba que o jogador pelas horizontais pode ganhar colocando as peças nas seguintes lacunas:

Primeiro: a, b, c
Segundo: d, e, f
Terceiro: g,h,i

Então faremos as verificações na horizontal do jogador 1 com base se as variáveis estiverem igualadas a 1.
Dentro das condições exibiremos a mensagem em popup anunciando que o jogador 1 venceu, adicionaremos +1 à variável player1_wins, atualizaremos as labels que mostram os pontos, e desabilitaremos os botões:


private void checkingWinner()
        {
            // Verificações de vitórias do jogador 1(X) nas horizontais:
            if (Global.A == 1 && Global.B == 1 && Global.C == 1) 
            {
                Global.player1_wins++;
                label4.Text = Convert.ToString(Global.player1_wins);
                MessageBox.Show("Jogador 1 venceu!");
                Global.button_disable = true;
            }

            if (Global.D == 1 && Global.E == 1 && Global.F == 1)
            {
                Global.player1_wins++;
                label4.Text = Convert.ToString(Global.player1_wins);
                MessageBox.Show("Jogador 1 venceu!");
                Global.button_disable = true;
            }

            if (Global.G == 1 && Global.H == 1 && Global.I == 1)
            {
                Global.player1_wins++;
                label4.Text = Convert.ToString(Global.player1_wins);
                MessageBox.Show("Jogador 1 venceu!");
                Global.button_disable = true;
            }

        }


Veja no print abaixo uma vitória do jogador 1 pelas horizontais (D, E, F):





Para não termos que ficar colando sempre esse trecho da vitória e tornar o código extenso e pesado, podemos criar um método privado com o nome wins(): Nesse método nós iremos verificar uma nova variável inteira (com o nome de p1) - que será definida lá na classe global- e definiremos que se ela for 1, daremos a vitória para o jogador 1, se for 2 a vitória é do jogador 2:

private void wins()
        {
            if (Global.p1 == 1)
            {
                Global.player1_wins++;
                label4.Text = Convert.ToString(Global.player1_wins);
                MessageBox.Show("Jogador 1 venceu!");
                Global.button_disable = true;
            }
            else  if  (Global.p1 == 2)
           {
                Global.player2_wins++;
                label5.Text = Convert.ToString(Global.player2_wins);
                MessageBox.Show("Jogador 2 venceu!");
                Global.button_disable = true;
            }

        }

Nas condições das verificações das vitórias pelas horizontais apague o que tem dentro e coloque para que a variável p1 fique 1 e chame o método wins:

 // Verificações de vitórias do jogador 1(X) nas horizontais:
            if (Global.A == 1 && Global.B == 1 && Global.C == 1)
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.D == 1 && Global.E == 1 && Global.F == 1)
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.G == 1 && Global.H == 1 && Global.I == 1)
            {
                Global.p1 = 1;
                wins();
            }

Vamos agora programar as vitórias do jogador 1 pelas verticais, podendo ser:

Primeiro: a, d, g
Segundo: b, e , h
Terceiro: c, f, i

As verificações devem estar assim:

 // Verificações de vitórias do jogador 1(X) nas verticais:
            if (Global.A == 1 && Global.D == 1 && Global.G == 1)
            {
                Global.p1 =1;
                wins();
            }

            if (Global.B == 1 && Global.E == 1 && Global.H == 1)
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.C == 1 && Global.F == 1 && Global.I == 1)
            {
                Global.p1 =1;
                wins();
            }

E por fim, as verificações de vitórias do player 1 pelas duas diagonais: a, e, i ou c, e, g:

// Verificações de vitórias do jogador 1(X) nas diagonais:
            if (Global.A == 1 && Global.E == 1 && Global.I == 1)
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.C == 1 && Global.E == 1 && Global.G == 1)
            {
                Global.p1 = 1;
                wins();
            }

Agora você pode copiar todo esse código e colar nesse mesmo método (checkingWinner) só que com as verificações referentes ao player 2, ou seja, onde temos em cada condição Global.variavel == 1, substitua por 2 e onde há Global.p1 == 1 coloque 2.
No final, seu método deve estar assim:

private void checkingWinner()
        {
            // Verificações de vitórias do jogador 1(X) nas horizontais:
            if (Global.A == 1 && Global.B == 1 && Global.C == 1) 
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.D == 1 && Global.E == 1 && Global.F == 1)
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.G == 1 && Global.H == 1 && Global.I == 1)
            {
                Global.p1 = 1;
                wins();
            }

            // Verificações de vitórias do jogador 1(X) nas verticais:
            if (Global.A == 1 && Global.D == 1 && Global.G == 1)
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.B == 1 && Global.E == 1 && Global.H == 1)
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.C == 1 && Global.F == 1 && Global.I == 1)
            {
                Global.p1 = 1;
                wins();
            }

            // Verificações de vitórias do jogador 1(X) nas diagonais:
            if (Global.A == 1 && Global.E == 1 && Global.I == 1)
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.C == 1 && Global.E == 1 && Global.G == 1)
            {
                Global.p1 = 1;
                wins();
            }

            // Verificações de vitórias do jogador 2(O) nas horizontais:
            if (Global.A == 2 && Global.B == 2 && Global.C == 2) 
            {
                Global.p1 = 2;
                wins();
            }

            if (Global.D == 2 && Global.E == 2 && Global.F == 2)
            {
                Global.p1 = 2;
                wins();
            }

            if (Global.G == 2 && Global.H == 2 && Global.I == 2)
            {
                Global.p1 = 2;
                wins();
            }

            // Verificações de vitórias do jogador 2(O) nas verticais:
            if (Global.A == 2 && Global.D == 2 && Global.G == 2)
            {
                Global.p1 = 2;
                wins();
            }

            if (Global.B == 2 && Global.E == 2 && Global.H == 2)
            {
                Global.p1 = 2;
                wins();
            }

            if (Global.C == 2 && Global.F == 2 && Global.I == 2)
            {
                Global.p1 = 2;
                wins();
            }

            // Verificações de vitórias do jogador 2(O) nas diagonais:
            if (Global.A == 2 && Global.E == 2 && Global.I == 2)
            {
                Global.p1 = 2;
                wins();
            }

            if (Global.C == 2 && Global.E == 2 && Global.G == 2)
            {
                Global.p1 = 2;
                wins();
            }

        }

Temos agora verificações das vitórias para o jogador 1 e para o jogador 2, por fim, faremos a verificação se deu empate, ou seja, se não há vencedores (p1 =0) e se já se passaram 9 rodadas (todas as lacunas foram preenchidas.)
Essa checagem também será feita no método checkingWiiner():

if (Global.p1 == 0 && Global.rounds == 9)
            {
                Global.tie++;
                label6.Text = Convert.ToString(Global.tie);
                MessageBox.Show("Empate");
                Global.button_disable = true;

            }


9º Nosso aplicativo está quase completo, só precisamos programar o botão de reset para que os jogadores possam reiniciar o jogo;
Volte ao formulário e dê um duplo clique no botão ''reset'' e dentro do método dele faça o seguinte:

 private void button10_Click(object sender, EventArgs e)
        {
            Global.A = 0;
            Global.B = 0;
            Global.C = 0;
            Global.D = 0;
            Global.E = 0;
            Global.F = 0;
            Global.G = 0;
            Global.H = 0;
            Global.I = 0;
            Global.rounds = 0;
            button1.Text = " ";
            button2.Text = " ";
            button3.Text = " ";
            button4.Text = " ";
            button4.Text = " ";
            button5.Text = " ";
            button6.Text = " ";
            button7.Text = " ";
            button8.Text = " ";
            button9.Text = " ";
            Global.button_disable = false;

            if (Global.p1 == 1 || Global.p1 == 0)
            {
                Global.turn = false;
                Global.p1 = 0;
            }
            else if (Global.p1 == 2)
            {
                Global.turn = true;
                Global.p1 = 0;
            }
        }

Aqui nós iremos limpar todas as lacunas e zerar todas as variáveis de verificação, também irá analisar quem ganhou, pois dependendo de quem ganhou, vai iniciar na próxima rodada.

Se você fez tudo conforme o tutorial, seu script deve estar assim ao final de tudo:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Jogo_da_velha
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public class Global
        {
            public static bool turn, button_disable;
            public static int p1=0, player1_wins = 0, player2_wins = 0, tie = 0, rounds = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Verificação da jogada do player 1(X):

            if (Global.turn == false && Global.button_disable == false && Global.A == 0)
            {
                button1.Text = "X";
                Global.A = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }
            // Verificação da jogada do player 2(O):
            if (Global.turn == true && Global.button_disable == false && Global.A == 0)
            {
                button1.Text = "O";
                Global.A = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }

        }

        private void checkingWinner()
        {
            // Verificações de vitórias do jogador 1(X) nas horizontais:
            if (Global.A == 1 && Global.B == 1 && Global.C == 1) 
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.D == 1 && Global.E == 1 && Global.F == 1)
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.G == 1 && Global.H == 1 && Global.I == 1)
            {
                Global.p1 = 1;
                wins();
            }

            // Verificações de vitórias do jogador 1(X) nas verticais:
            if (Global.A == 1 && Global.D == 1 && Global.G == 1)
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.B == 1 && Global.E == 1 && Global.H == 1)
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.C == 1 && Global.F == 1 && Global.I == 1)
            {
                Global.p1 = 1;
                wins();
            }

            // Verificações de vitórias do jogador 1(X) nas diagonais:
            if (Global.A == 1 && Global.E == 1 && Global.I == 1)
            {
                Global.p1 = 1;
                wins();
            }

            if (Global.C == 1 && Global.E == 1 && Global.G == 1)
            {
                Global.p1 = 1;
                wins();
            }

            // Verificações de vitórias do jogador 2(O) nas horizontais:
            if (Global.A == 2 && Global.B == 2 && Global.C == 2) 
            {
                Global.p1 = 2;
                wins();
            }

            if (Global.D == 2 && Global.E == 2 && Global.F == 2)
            {
                Global.p1 = 2;
                wins();
            }

            if (Global.G == 2 && Global.H == 2 && Global.I == 2)
            {
                Global.p1 = 2;
                wins();
            }

            // Verificações de vitórias do jogador 2(O) nas verticais:
            if (Global.A == 2 && Global.D == 2 && Global.G == 2)
            {
                Global.p1 = 2;
                wins();
            }

            if (Global.B == 2 && Global.E == 2 && Global.H == 2)
            {
                Global.p1 = 2;
                wins();
            }

            if (Global.C == 2 && Global.F == 2 && Global.I == 2)
            {
                Global.p1 = 2;
                wins();
            }

            // Verificações de vitórias do jogador 2(O) nas diagonais:
            if (Global.A == 2 && Global.E == 2 && Global.I == 2)
            {
                Global.p1 = 2;
                wins();
            }

            if (Global.C == 2 && Global.E == 2 && Global.G == 2)
            {
                Global.p1 = 2;
                wins();
            }

            if (Global.p1 == 0 && Global.rounds == 9)
            {
                Global.tie++;
                label6.Text = Convert.ToString(Global.tie);
                MessageBox.Show("Empate");
                Global.button_disable = true;

            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.B == 0)
            {
                button2.Text = "X";
                Global.B = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }
           
            if (Global.turn == true && Global.button_disable == false && Global.B == 0)
            {
                button2.Text = "O";
                Global.B = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }

        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.C == 0)
            {
                button3.Text = "X";
                Global.C = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.C == 0)
            {
                button3.Text = "O";
                Global.C = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }

        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.D == 0)
            {
                button4.Text = "X";
                Global.D = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.D == 0)
            {
                button4.Text = "O";
                Global.D = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.E == 0)
            {
                button5.Text = "X";
                Global.E = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.E == 0)
            {
                button5.Text = "O";
                Global.E = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.F == 0)
            {
                button6.Text = "X";
                Global.F = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.F == 0)
            {
                button6.Text = "O";
                Global.F = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.G == 0)
            {
                button7.Text = "X";
                Global.G = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.G == 0)
            {
                button7.Text = "O";
                Global.G = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }
        }

        private void button8_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.H == 0)
            {
                button8.Text = "X";
                Global.H = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.H == 0)
            {
                button8.Text = "O";
                Global.H = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }
        }

        private void button9_Click(object sender, EventArgs e)
        {
            if (Global.turn == false && Global.button_disable == false && Global.I == 0)
            {
                button9.Text = "X";
                Global.I = 1;
                Global.rounds++;
                checkingWinner();
                Global.turn = true;
            }

            if (Global.turn == true && Global.button_disable == false && Global.I == 0)
            {
                button9.Text = "O";
                Global.I = 2;
                Global.rounds++;
                checkingWinner();
                Global.turn = false;
            }
        }

        private void wins()
        {
            if (Global.p1 == 1)
            {
                Global.player1_wins++;
                label4.Text = Convert.ToString(Global.player1_wins);
                MessageBox.Show("Jogador 1 venceu!");
                Global.button_disable = true;
            }
            else  if  (Global.p1 == 2)
           {
                Global.player2_wins++;
                label5.Text = Convert.ToString(Global.player2_wins);
                MessageBox.Show("Jogador 2 venceu!");
                Global.button_disable = true;
            }

        }

        private void button10_Click(object sender, EventArgs e)
        {
            Global.A = 0;
            Global.B = 0;
            Global.C = 0;
            Global.D = 0;
            Global.E = 0;
            Global.F = 0;
            Global.G = 0;
            Global.H = 0;
            Global.I = 0;
            Global.rounds = 0;
            button1.Text = " ";
            button2.Text = " ";
            button3.Text = " ";
            button4.Text = " ";
            button4.Text = " ";
            button5.Text = " ";
            button6.Text = " ";
            button7.Text = " ";
            button8.Text = " ";
            button9.Text = " ";
            Global.button_disable = false;

            if (Global.p1 == 1 || Global.p1 == 0)
            {
                Global.turn = false;
                Global.p1 = 0;
            }
            else if (Global.p1 == 2)
            {
                Global.turn = true;
                Global.p1 = 0;
            }
        }
    }
}

E o tutorial chegou ao fim! Debugue o código e veja se está tudo correto, qualquer dúvida ou bug pode me enviar que eu tentarei auxiliar!
Espero que tenham gostado, e até mais o/