• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Gdzie popełniłem błąd?

VPS Starter Arubacloud
0 głosów
203 wizyt
pytanie zadane 11 grudnia 2016 w C i C++ przez TomaszA2 Obywatel (1,720 p.)

Ostatnio już pisałem tutaj o tym problemie ale nikt mi poprawnie nie odpowiedział. Problem polega na tym że w grze kółko i krzyżyk (na razie bez wygrywania) po zmianie 8 punktów, dziewiąty ani drgnie, a guzik do resetu który ustawiłem wcześniej również nie działa. Podejrzewam przez to że po prostu jest jakiś problem z opuszczeniem pętli losującej odpowiedź[ruch] komputera.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
#include <time.h>
#include <iostream>
#include <conio.h>
#include <string>

int xo[] = {2,2,2,2,2,2,2,2,2};

int zt(int a)
{
    
    xo[0] = a;
    xo[1] = a;
    xo[2] = a;
    xo[3] = a;
    
    xo[4] = a;
    xo[5] = a;
    xo[6] = a;
    xo[7] = a;
    xo[8] = a;
}

int cls()
{
  system("cls");   
}

int main()
{
    srand( time( NULL ) );
    bool q = false;
    int r;
    int w;
    int e;
    int c;
    int y;
    bool t=false;
    std::string b;
    bool a = false;
    std::cout << "Menu:" <<std::endl;
    while(a==false)
    {
          //<--
         cls();    
         e=0;
         if(xo[0]==2) std::cout << "@|";
         if(xo[0]==1) std::cout << "X|";
         if(xo[0]==0) std::cout << "O|";
         
         if(xo[1]==2) std::cout << "@|";
         if(xo[1]==1) std::cout << "X|";
         if(xo[1]==0) std::cout << "O|";
         
         if(xo[2]==2) std::cout << "@" << std::endl;
         if(xo[2]==1) std::cout << "X" << std::endl;
         if(xo[2]==0) std::cout << "O" << std::endl;
         
         if(xo[3]==2) std::cout << "@|";
         if(xo[3]==1) std::cout << "X|";
         if(xo[3]==0) std::cout << "O|";
         
         if(xo[4]==2) std::cout << "@|";
         if(xo[4]==1) std::cout << "X|";
         if(xo[4]==0) std::cout << "O|";
         
         if(xo[5]==2) std::cout << "@" <<std::endl;
         if(xo[5]==1) std::cout << "X" <<std::endl;
         if(xo[5]==0) std::cout << "O" <<std::endl;
         
         if(xo[6]==2) std::cout << "@|";
         if(xo[6]==1) std::cout << "X|";
         if(xo[6]==0) std::cout << "O|";
         
         if(xo[7]==2) std::cout << "@|";
         if(xo[7]==1) std::cout << "X|";
         if(xo[7]==0) std::cout << "O|";
         
         if(xo[8]==2) std::cout << "@" <<std::endl;
         if(xo[8]==1) std::cout << "X" <<std::endl;
         if(xo[8]==0) std::cout << "O" <<std::endl;
                 while(q==false){
                 w=getch();
                 if(w==51 && xo[8]!=0 && e==0 && xo[8]!=1) 
                 {xo[8]=1; 
                 e = 1;
                 Sleep(10);
                 q=true;}
                 
                 if(w==50 && xo[7]!=0 && e==0 && xo[7]!=1) 
                 {xo[7]=1; 
                 e = 1;
                 Sleep(10);
                 q=true;}
                 
                 if(w==49 && xo[6]!=0 && e==0 && xo[6]!=1) 
                 {xo[6]=1; 
                 e = 1;
                 Sleep(10);
                 q=true;}
                 
                 if(w==54 && xo[5]!=0 && e==0 && xo[5]!=1) 
                 {xo[5]=1; 
                 e = 1;
                 Sleep(10);
                 q=true;}
                 
                 if(w==53 && xo[4]!=0 && e==0 && xo[4]!=1) 
                 {xo[4]=1; 
                 e = 1;
                 Sleep(10);
                 q=true;}
                 
                 if(w==52 && xo[3]!=0 && e==0 && xo[3]!=1) 
                 {xo[3]=1; 
                 e = 1;
                 Sleep(10);
                 q=true;}
                 
                 if(w==57 && xo[2]!=0 && e==0 && xo[2]!=1) 
                 {xo[2]=1; 
                 e = 1;
                 Sleep(10);
                 q=true;}
                 
                 if(w==56 && xo[1]!=0 && e==0 && xo[1]!=1) 
                 {xo[1]=1; 
                 e = 1;
                 Sleep(10);
                 q=true;}
                 
                 if(w==55 && xo[0]!=0 && e==0 && xo[0]!=1) 
                 {xo[0]=1; 
                 e = 1;
                 Sleep(10);
                 q=true;}
                 }
                 
                 
                 q=false;
                 if(w==114) 
                 {
                 zt(2);
                 }
                 while(t==false) //<--
                 {
                 r = ( rand() % 9 ) + 0;
                 
                 if(r==0 && xo[0]!=2){
                 continue;
                 }
                 if(r==1 && xo[1]!=2){
                 continue;
                 }
                 if(r==2 && xo[2]!=2){
                 continue;
                 }
                 
                 if(r==3 && xo[3]!=2){
                 continue;
                 }
                 if(r==4 && xo[4]!=2){
                 continue;
                 }
                 if(r==5 && xo[5]!=2){
                 continue;
                 }
                 
                 if(r==6 && xo[6]!=2){
                 continue;
                 }
                 if(r==7 && xo[7]!=2){
                 continue;
                 }
                 if(r==8 && xo[8]!=2){
                 continue;
                 }
                 
                 if(r==0 && xo[0]==2){
                 xo[0]=0;
                 t=true;
                 }
                 if(r==1 && xo[1]==2){
                 xo[1]=0;
                 t=true;
                 }
                 if(r==2 && xo[2]==2){
                 xo[2]=0;
                 t=true;
                 }
                 
                 if(r==3 && xo[3]==2){
                 xo[3]=0;
                 t=true;
                 }
                 if(r==4 && xo[4]==2){
                 xo[4]=0;
                 t=true;
                 }
                 if(r==5 && xo[5]==2){
                 xo[5]=0;
                 t=true;
                 }
                 
                 if(r==6 && xo[6]==2){
                 xo[6]=0;
                 t=true;
                 }
                 if(r==7 && xo[7]==2){
                 xo[7]=0;
                 t=true;
                 }
                 if(r==8 && xo[8]==2){
                 xo[8]=0;
                 t=true;
                 } //<--
                 }
                 t=false;
         
         
         
         
    }
    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 11 grudnia 2016 przez Evelek Nałogowiec (28,960 p.)
Chętnie bym pomógł ale z tak udokumentowanym kodem jak twój.... Zmienne r w e c y... Każda zmienna powinna być nazwana zgodnie ze swoim przeznaczeniem. Ułatwia to analizę kodu.
komentarz 12 grudnia 2016 przez TomaszA2 Obywatel (1,720 p.)
Mam beznadziejną głowę do nazw. Takie mi łatwiej zapamiętać i rozpoznać do czego w kodzie służą.
komentarz 12 grudnia 2016 przez criss Mędrzec (172,590 p.)
tylko tobie niestety :|
+1 głos
odpowiedź 11 grudnia 2016 przez ProgramistaTomko Obywatel (1,040 p.)
Widzę kolego że jesteś początkującym programistą. Na wstępie powiem ci że wiekszosc jest do poprawy.

1. w funkcji "zt" puść to w pętli i nazwij tą funkcję tak by programista ktory nie zna twojego kodu wiedzial co ta funkcja robi.

2. nazwy zmiennych nazywaj rowniez tak jak by bylo wiadomo po co one są.

3. zamiast zwracac sie ciagle do "std::" napisz przed "using namespace std;"

4. zamiast ifów do 84 linijki zrob jedną funkcję która przyjmuje 2 parametry i zrobisz to wszystko w 2 pętlach

5. dla ifów od 87 lini do 140 również możesz zrobić funkcję oraz zrobić to na pętli

6. od lini 152 praktycznie do konca ifów rownież zrob funkcję.

zastosujesz się do tego to błąd naprawi się sam. Nie rób programów "by zaliczyć" tylko tak by byly dobrze napisane. Ciężko jest się później oduczyć takich nawyków. Pozdro
komentarz 12 grudnia 2016 przez TomaszA2 Obywatel (1,720 p.)
Jeśli chodzi o przestrzeń nazw std to specjalnie tego nie użyłem. Nie lubię tego używać.

Czyli podsumowując, piszesz że jak napiszę to praktycznie tak samo tylko krócej to problemu nie będzie? Znaczy to że nie wiesz który fragment kodu powoduje ten błąd. A jak ty tego nie wiesz to ja też, bo gdybym wiedział, w ogóle bym tutaj nie pisał. Optymalizację kodu chciałem wykonać jak wszystko będzie już działać.

Nawet później mogę ci na maila całość wysłać jak nie wierzysz że będzie mi się chciało to zrobić. Ale najpierw muszę wiedzieć co powoduje ten błąd.
komentarz 12 grudnia 2016 przez Kasztan Dyskutant (8,080 p.)
Puść sobie to w Debugerze i zobacz jak działa program : )

Będziesz widział czy o to ci chodziło : )
komentarz 12 grudnia 2016 przez TomaszA2 Obywatel (1,720 p.)
Próbowałem, żaden debuger mi nie działa. Próbowałem w dev c++ i code blocks.
komentarz 12 grudnia 2016 przez Kasztan Dyskutant (8,080 p.)
Co to znaczy żaden debuger mi nie działa ?

Zainstaluj sobie Visual Studio : ) brzmi bardziej profesionalnie jak C::B
komentarz 12 grudnia 2016 przez TomaszA2 Obywatel (1,720 p.)
Błąd już naprawiony, chodziło o to że (tak jak podejrzewałem, beznadziejnie prosty błąd) pętla losująca nie miała jak wylosować(w pamięci był przechowywany obraz X na ostatnim wolnym polu, więc nie mogło postawić tam O, a jeśli nie było żadnego pola na którym mogłoby postawić to nie mogło zakończyć pętli), a ustawione było aby dopiero po losowaniu pętla się zamykała. I dopiero po zamknięciu się pętli wyświetla X oraz O, dlatego sprawiało to wrażenie martwego procesu.
komentarz 13 grudnia 2016 przez TomaszA2 Obywatel (1,720 p.)
Co miałeś na myśli pisząc żebym puścił zt w pętli? Da się tak zrobić? Aktualnie jestem chory i śpiący za razem i możliwe że piszę kompletne bzdury.

Podobne pytania

0 głosów
1 odpowiedź 165 wizyt
pytanie zadane 30 stycznia 2019 w JavaScript przez niezalogowany
0 głosów
2 odpowiedzi 174 wizyt
pytanie zadane 3 kwietnia 2018 w C i C++ przez Vicker9 Początkujący (250 p.)
0 głosów
1 odpowiedź 252 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...