Hola a todos estoy haciendo el juego del 4 en raya y a la hora de sacar el ganador no me funciona bien porque creo que al estar sumando filas y columnas me estoy saliendo de la matriz de enteros. Estoy usando Qt designer C++ para hacer la interfaz del juego. Si alguien puede ayudarme con el método Ganado(); para sacar las horizontales, verticales y diagonales le estaría muy agradecido. Adjunto el enunciado y el programa por partes ya que esta dividido en ficheros:
ENUNCIADO:
En este ejercicio vamos a implementar el conocido juego de las 4 en raya o conecta 4. El programa arrancará con un panel de 6x7 vacío, informando que es el turno de las piezas rojas. Cuando tire el primer jugador (pinchando con el ratón en alguno de los botones azules) se colocará la ficha en la columna correspondiente y dará el turno al segundo jugador (piezas amarillas).
En cualquier momento se podrá reiniciar la partida (segundo botón), salir, o mostrar el Acerca de (About) de la aplicación. El programa controlará que no se tira sobre una columna llena y también comprobará tras cada jugada si ha ganado alguno de los jugadores o han quedado empates (Figura 2). Cuando algún jugador gane o queden en tablas informaremos al usuario y la partida se reiniciará (borraremos el tablero y será el turno de las rojas de nuevo).
CÓDIGO:
<mainwindow.h>
-----------------------------------------------------------------------------------------------
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include<iostream>
using namespace std;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_actionSalir_triggered();
void on_actionAcerca_de_triggered();
void on_pushButton_7_clicked();
void on_pushButton_9_clicked();
void on_pushButton_11_clicked();
void on_pushButton_13_clicked();
void on_pushButton_15_clicked();
void on_pushButton_17_clicked();
void on_pushButton_19_clicked();
void on_actionNuevo_Juego_triggered();
void BotonPulsado(int columna);
void Ganado(int fila,int columna,int ficha);
private:
//declaracion de los atributos necesarios para nuestro codigo.
Ui::MainWindow *ui;
QPushButton *M[6][7];
int V[7];
int Mint[6][7];
bool turno;
bool ganadorojas;
bool ganadoamar;
};
#endif // MAINWINDOW_H
----------------------------------------------------------------------------------------------
<main.cpp>
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
---------------------------------------------------------------------------------------------
<mainwindow.cpp>
#include "mainwindow.h"
#include "ui_mainwindow.h"
//librerias para las distinas opciones
#include <QMessageBox>
#include <QPushButton>
#include <QIcon>
#include <QPixmap>
//Constructor de la ventana principal
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
//Inicializacion de la ventana.
ui->setupUi(this);
//Asignacion de los botones a las distintas posiciones de la matriz.
M[0][0] = ui->pushButton_8;
M[0][1] = ui->pushButton_10;
M[0][2] = ui->pushButton_12;
M[0][3] = ui->pushButton_14;
M[0][4] = ui->pushButton_16;
M[0][5] = ui->pushButton_18;
M[0][6] = ui->pushButton_20;
M[1][0] = ui->pushButton_21;
M[1][1] = ui->pushButton_22;
M[1][2] = ui->pushButton_23;
M[1][3] = ui->pushButton_24;
M[1][4] = ui->pushButton_25;
M[1][5] = ui->pushButton_26;
M[1][6] = ui->pushButton_27;
M[2][0] = ui->pushButton_28;
M[2][1] = ui->pushButton_29;
M[2][2] = ui->pushButton_30;
M[2][3] = ui->pushButton_31;
M[2][4] = ui->pushButton_32;
M[2][5] = ui->pushButton_33;
M[2][6] = ui->pushButton_34;
M[3][0] = ui->pushButton_35;
M[3][1] = ui->pushButton_36;
M[3][2] = ui->pushButton_37;
M[3][3] = ui->pushButton_38;
M[3][4] = ui->pushButton_39;
M[3][5] = ui->pushButton_40;
M[3][6] = ui->pushButton_41;
M[4][0] = ui->pushButton_42;
M[4][1] = ui->pushButton_43;
M[4][2] = ui->pushButton_44;
M[4][3] = ui->pushButton_45;
M[4][4] = ui->pushButton_46;
M[4][5] = ui->pushButton_47;
M[4][6] = ui->pushButton_48;
M[5][0] = ui->pushButton_49;
M[5][1] = ui->pushButton_50;
M[5][2] = ui->pushButton_51;
M[5][3] = ui->pushButton_52;
M[5][4] = ui->pushButton_53;
M[5][5] = ui->pushButton_54;
M[5][6] = ui->pushButton_55;
for(int i=0;i<7;i++){
V=0;
}
for(int j=0;j<6;j++){
for(int k=0;k<7;k++){
Mint[j][k]=0;
}
}
turno=true;
ganadorojas=false;
ganadoamar=false;
}
//Destructor
MainWindow::~MainWindow()
{
delete ui;
}
//funcion salir triggered
void MainWindow::on_actionSalir_triggered()
{
close();
}
//funcion acerca de triggered
void MainWindow::on_actionAcerca_de_triggered()
{
QMessageBox::information(this,"Acerca del Juego","Realizado por Alvaro Garrido Tafalla y Jorge Medina Carbonell","Aceptar");
}
//funcion reiniciar juego triggered
void MainWindow::on_actionNuevo_Juego_triggered()
{
for(int i=0;i<6;i++){
for(int j=0;j<7;j++){
M[j]->setIcon(QIcon(":/Iconos/Material ejercicio 1/circle_grey.png"));
Mint[j]=0;
}
}
for(int i=0;i<7;i++){
V=0;
}
turno=true;
ganadorojas=false;
ganadoamar=false;
ui->label->setText("Turno de las rojas");
}
//Funciones clicked de cada boton del panel, que llaman a la funcion BotonPulsado
void MainWindow::on_pushButton_7_clicked()
{
BotonPulsado(0);
}
void MainWindow::on_pushButton_9_clicked()
{
BotonPulsado(1);
}
void MainWindow::on_pushButton_11_clicked()
{
BotonPulsado(2);
}
void MainWindow::on_pushButton_13_clicked()
{
BotonPulsado(3);
}
void MainWindow::on_pushButton_15_clicked()
{
BotonPulsado(4);
}
void MainWindow::on_pushButton_17_clicked()
{
BotonPulsado(5);
}
void MainWindow::on_pushButton_19_clicked()
{
BotonPulsado(6);
}
//funcion BotonPulsado que permite cambir el icono de los botones.
void MainWindow::BotonPulsado(int columna){
if(V[columna]<6){//comprueba que no se tira sobre una columna llena
int pos=5-V[columna];
V[columna]=V[columna]+1;
if(turno==true){
M[pos][columna]->setIcon(QIcon(":/Iconos/Material ejercicio 1/circle_red.png"));
Mint[pos][columna]=1;
turno=false;
ui->label->setText("Turno de las amarillas");
Ganado(pos,columna,1);
}else{
M[pos][columna]->setIcon(QIcon(":/Iconos/Material ejercicio 1/circle_yellow.png"));
Mint[pos][columna]=2;
turno=true;
ui->label->setText("Turno de las rojas");
Ganado(pos,columna,2);
}
}
}
//Ganado
void MainWindow::Ganado(int fila,int columna,int ficha){
//horizontales
int cont=1;
if(Mint[fila][columna-1]==ficha || Mint[fila][columna+1]==ficha){
cont++;
if(Mint[fila][columna-2]==ficha || Mint[fila][columna+2]==ficha){
cont++;
if(Mint[fila][columna-3]==ficha || Mint[fila][columna+3]==ficha){
cont++;
if(ficha==1 && cont==4){
ganadorojas=true;
}else{
ganadoamar=true;
}
}
}
}
//verticales
if(Mint[fila-1][columna]==ficha || Mint[fila+1][columna]==ficha){
if(Mint[fila-2][columna]==ficha || Mint[fila+2][columna]==ficha){
if(Mint[fila-3][columna]==ficha || Mint[fila+3][columna]==ficha){
if(ficha==1){
ganadorojas=true;
}else{
ganadoamar=true;
}
}
}
}
if(ganadorojas==true ){
QMessageBox::information(this,"Fin de juego","Ganan las Rojas","OK");
on_actionNuevo_Juego_triggered();
}
if(ganadoamar==true){
QMessageBox::information(this,"Fin de juego","Ganan las Amarillas","OK");
on_actionNuevo_Juego_triggered();
}
}
-----------------------------------------------------------------------------------------------