PDA

View Full Version : Programma Forza 4 in C! Aiuto!


Aldalex
05-11-2003, 11:04
Qualcuno puo aiutarmi ad implementare in C il programma Forza 4 ? Dovrei consegnarlo per domenica....vale come esercizio...vi prego, help me.

Riporto qui sotto le indicazioni per il programma:

Il gioco "Forza 4"
Il gioco "Forza 4" si gioca in due giocatori (Giallo e Rosso) ciascuno dei quali ha un numero N di pedine del proprio colore.
Si gioca a turno, inserendo dall'alto una pedina del proprio colore in una griglia verticale di 7 colonne e 6 righe.
Il giocatore di turno inserisce una delle proprie pedine in una delle 7 colonne cercando di ottenere per primo un allineamento di 4 pedine del proprio colore in orizzontale, verticale o in diagonale.
Quando una pedina viene inserita in una colonna, si va ad appoggiare sulla base della griglia o sulle pedine già inserite.
Non è possibile inserire più di 6 pedine per colonna.
Se la griglia viene completamente riempita senza che si presenti un allineamento di 4 o più pedine dello stesso colore, la partita è patta.
Il numero di pedine N di ciascun giocatore è sufficiente a riempire tutta la griglia (sono 21 per giocatore).

Obiettivo dell'esercizio
Si sviluppi un programma C che implementa il gioco Forza4.

Input del programma
Il programma inizia col giocatore 1 e per ogni turno riceve in input una cifra tra 0 e 6 compresi: il giocatore corrente vuole inserire la sua pedina nella corrispondente colonna.

Output del programma
Il programma stampa per ogni mossa lo stato della griglia ESATTAMENTE secondo il seguente esempio:
| | | | | | | |
| | |1| | | | |
| | |1| | | | |
| | |1|2| | | |
| | |1|1|2| | |
| |2|2|2|1|2| |
---------------
0 1 2 3 4 5 6

in cui:
caselle non occupate => spazio
caselle occupate dal giocatore 1 => carattere 1
caselle occupate dal giocatore 2 => carattere 2
stampate anche le barre verticali, la riga orizzontale di 'meno' e i numeri che indicano le colonne
subito dopo la presentazione della griglia viene:
presentato il prompt: Giocatore N: (senza accapo e con N uguale a 1 o 2)
letto l'input ed eseguiti i controlli:
ogni input diverso dai numeri tra 0 e 6 è errato e fa stampare ESATTAMENTE la stringa "Input errato" seguita da accapo (vedi esempio sotto) e si richiede di nuovo l'input.
Se la colonna è già piena si stampa ESATTAMENTE la stringa "Mossa non valida" seguita da accapo e si richiede di nuovo l'input.
Non appena viene scoperta la presenza di 4 (o più) pedine allineate (in orizzontale, verticale o diagonale) dello stesso colore si stampa:
la situazione (finale) della griglia.
la stringa "Ha vinto il giocatore N" seguita da accapo (con N= 1 o 2 a seconda del caso)
e si esce.
Se la partita termina in patta si stampa:
la situazione (finale) della griglia.
la stringa "Partita patta" seguita da accapo
e si esce.

Esempio di partita
Ecco un esempio di partita. In rosso si evidenzia l'input del programma, battuto dai giocatori sulla tastiera.


| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
---------------
0 1 2 3 4 5 6
Giocatore 1: 3
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |1| | | |
---------------
0 1 2 3 4 5 6
Giocatore 2: 3
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |2| | | |
| | | |1| | | |
---------------
0 1 2 3 4 5 6
Giocatore 1: 4
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |2| | | |
| | | |1|1| | |
---------------
0 1 2 3 4 5 6
Giocatore 2: 2
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |2| | | |
| | |2|1|1| | |
---------------
0 1 2 3 4 5 6
Giocatore 1: 8
Input errato
Giocatore 1: 5
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |2| | | |
| | |2|1|1|1| |
---------------
0 1 2 3 4 5 6
Giocatore 2: 6
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |2| | | |
| | |2|1|1|1|2|
---------------
0 1 2 3 4 5 6
Giocatore 1: 4
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |2|1| | |
| | |2|1|1|1|2|
---------------
0 1 2 3 4 5 6
Giocatore 2: 4
| | | | | | | |
| | | | | | | |

| | | | | | | |
| | | | |2| | |
| | | |2|1| | |
| | |2|1|1|1|2|
---------------
0 1 2 3 4 5 6
Giocatore 1: 3
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |1|2| | |
| | | |2|1| | |
| | |2|1|1|1|2|
---------------
0 1 2 3 4 5 6
Giocatore 2: 3
| | | | | | | |
| | | | | | | |
| | | |2| | | |
| | | |1|2| | |
| | | |2|1| | |
| | |2|1|1|1|2|
---------------
0 1 2 3 4 5 6
Giocatore 1: 2
| | | | | | | |
| | | | | | | |
| | | |2| | | |
| | | |1|2| | |
| | |1|2|1| | |
| | |2|1|1|1|2|
---------------
0 1 2 3 4 5 6
Giocatore 2: 5
| | | | | | | |
| | | | | | | |
| | | |2| | | |
| | | |1|2| | |
| | |1|2|1|2| |
| | |2|1|1|1|2|
---------------
0 1 2 3 4 5 6
Ha vinto il giocatore 2

Suggerimenti
Usate (ovviamente) una matrice.
Nella lezione del 30 (o 31) Ottobre si parlerà del gioco del Tris, che non è troppo diverso da Forza 4.

Spero che qualche buon'anima mi aiuti, grazie.

Icedguardian
05-11-2003, 11:19
Non ho capito il problema? Crei una matrice di interi (per es.), la inizializzi a 0, visualizzi la schifezza. Quando uno inserisce la pedina nella matrice in quella riga nella prima posizione "0" inserisci 1 o 2 a secondo del giocatore. Crei una funzione a cui passi la matrice e la posizione della pedina inserita, la funz controlla se la pedina inserita "completa" una serie di 4 pedine. Si -> ha vinto, no -> controllo quante pedine sono rimaste al giocatore a cui tocca, se > 0 allora gioca altrimenti patta.

Va beh io lo buttata giù in 4 secondi magari ci sono un po' di controlli in + da fare ;)

Luc@s
05-11-2003, 11:22
Una cosa tipo


char table[10][10];
int i;
for(i=0;i<10;i++)
printf("%c|-\n", table[0][i]);
int j;
for(j=0;i<10;j++)
printf("%c-|\n", table[i][i]);



Prova a vedere se ti puo essere utile:D

Luc@s
05-11-2003, 14:05
ekkone una versione + utile al tuo scopo.

#include <stdio.h>
#include <stdlib.h>

void inserisci(int * table[3][3], int x, int y, int val);

int main()
{
int table[3][3] = {0};
int i;
int j;
int y;
for(i=0;i<3;i++)
printf("\t%d", table[0][i]);
printf("\n");
for(j=0;j<3;j++)
printf("\t%d", table[1][j]);
printf("\n");
for(y=0;y<3;y++)
printf("\t%d", table[2][y]);
printf("\n");
inserisci(&table, 1, 1, 1);
inserisci(&table, 1, 3, 2);
int sc;
scanf("%d", &sc);
return 0;
}

void inserisci(int * table[3][3],int x, int y, int val)
{
*table[x][y] = val;
}

Aldalex
05-11-2003, 17:19
ho provato a far girare su DEVC++ il programma ideato da Luc@s

Va quasi bene, e infatto gia lo ringrazio davvero, grazie Luc@s!!

Pero ci sn dei ritocchi da fare, perche mi da 3 errori nella compilazione, e quando lo faccio giare parte la shell del terminale ma ad un certo punto dopo aver disegnato la matrice si blocca, la matrice cmq deve essere di 7 colonne e 6 righe:

Gli errori che mi da sn i seguenti:

[Warning] In function `main'

[Warning] passing arg 1 of `inserisci' from incompatible pointer type ( alla riga 21 )

[Warning] passing arg 1 of `inserisci' from incompatible pointer type ( alla riga 22 )

Sapresti dirmi perche me li da Luc@s?

Grazie di nuovo ,

Alessandro

Icedguardian
06-11-2003, 08:59
Secondo me quel prog. non fa nulla :D
Cmq il problema credo sia nel puntatore, elimita l'asterisco in ogni punto
della funzione (anche dal prototipo) e quando la richiami dal main non ci mettere & davanti al nome della matrice.

Ciao

Aldalex
09-11-2003, 18:28
il programma mi da come output ina matrice 3*3 inizializzata a zero, e invece doverbbe darmi una matrice con 7 colonne e 6 righe... poi quando metto un numero mi si chiude subito la finestra del terminale, qualcuno sa come risolvere il problema ??

Ecco il programma

#include <stdio.h>
#include <stdlib.h>

void inserisci(int table[3][3], int x, int y, int val);

int main()
{
int table[3][3] = {0};
int i;
int j;
int y;
for(i=0;i<3;i++)
printf("\t%d", table[0][i]);
printf("\n");
for(j=0;j<3;j++)
printf("\t%d", table[1][j]);
printf("\n");
for(y=0;y<3;y++)
printf("\t%d", table[2][y]);
printf("\n");
inserisci(table, 1, 1, 1);
inserisci(table, 1, 3, 2);
int sc;
scanf("%d", &sc);
return 0;
}

void inserisci(int table[3][3],int x, int y, int val)
{
table[x][y] = val;
}

cionci
10-11-2003, 02:28
int table[3][3] = {0};
Come fai a fare una matrice 6x7 se qui la dichiari 3x3 ?
Inoltre {0} non inizializza una matrice a zero...

cionci
10-11-2003, 02:30
Originariamente inviato da Aldalex
poi quando metto un numero mi si chiude subito la finestra del terminale, qualcuno sa come risolvere il problema ??

Perchè il tuo programma fa proprio questo...fa diverse stampe, una scanf e poi esce...

Icedguardian
10-11-2003, 10:28
Originariamente inviato da cionci
Perchè il tuo programma fa proprio questo...fa diverse stampe, una scanf e poi esce...

Secondo me lui voleva che il programmino lo facciamo noi :D
Non si è preso neanche la briga di leggere quelo che gli abbiamo scritto.

Non ho capito però cosa ci fa in programmazione uno che fa di tutto tranne programmare ;)

Luc@s
10-11-2003, 14:04
Originariamente inviato da Icedguardian
Secondo me lui voleva che il programmino lo facciamo noi :D
Non si è preso neanche la briga di leggere quelo che gli abbiamo scritto.

Non ho capito però cosa ci fa in programmazione uno che fa di tutto tranne programmare ;)

in effetti ha copiato il mio listato che nn era proprio ia massimi livelli della decenza:D

Manson666
10-11-2003, 22:18
Fai informatica alla Sapienza?

Luc@s
11-11-2003, 12:17
Originariamente inviato da Manson666
Fai informatica alla Sapienza?
io?