一个跳棋游戏程序赛跑?

时间:2014-04-17 17:55:52

标签: c++ segmentation-fault

所以我已经在这个项目上工作了一段时间,我终于得到了编译,但现在它是segfaulting。我问过我的老师问题是什么,但是他无法理解,所以我认为你们可能会有所帮助。我的项目是让程序显示一个棋盘,然后就可以在它上面玩棋盘游戏。当我尝试显示棋盘时,该程序是seg faulting。这是相关代码:

注意:每个检查器代表棋盘上的一个正方形 - 值" isOccupied"表示空间是否被一件作品占据,并且"颜色"表示颜色是黑色还是红色。颜色从我将发布的单独文件呈现。颜色可以是黑色或红色。

这是Checker.h文件的输出函数。它在Checkers类的显示功能中被调用(跳棋就是实际的游戏)

std::ostream output(std::ostream& otp, int i) const
{
   if (isOccupied) {
      if (i == 1) { 
         otp << B_RED << color << "       @        ";
      }
      else if (i == 0) {
         otp << B_BLACK << color << "       @        ";
      }
   }
   else if (!isOccupied) {
      if (i == 1) { 
         otp << B_RED << "               ";
      }
      else {
         otp << B_BLACK << "                ";
      } 
   } 
}
// THE PROGRAM SEG FAULTS AT THIS LINE, WHICH MAKES ME THINK IT HAS
// TO DO WITH THE DISPLAY FUNCTION

显示功能和在checkers.h文件中设置电路板的功能

void display_status() const
{
   int i, j;
   for (j = 0; j < 8; j++) {
      for (i = 0; i < 8; i++) {
         board[i][j].output(cout, ((i+j)%2));
      }
   }
}

void set_board()
{
   checker c = checker();
   int i, j, k;
   for (j = 0;j < 8; j++) { //this block sets up the actual board with no pieces on it
      for (i = 0; i < 8; i++) {
         string s = c.make_name((i+1), (j+1));
         if ((i+j) % 2 == 0) {
            board[i][j].input(s, B_BLACK, false, false);
         } 
         else {
            board[i][j].input(s, B_RED, false, false);
         }      
      }
   }

   k = 0;
   while (k < 12) { //this block here sets up the black pieces on the board
      for (j = 0; j < 8; j++) {
         for (i = 0; i < 8; i++) {
            string s = c.make_name((i+1), (j+1));
            if ((i+j)%2 == 0) {
               c.input(s, BLACK, true, false);
               board[i][j] = c;
               k++;
            }
            else {
               c.input(s, B_RED, false, false);
               board[i][j] = c;
            } 
         }
      }
   }

   k = 0;
   int j1; 
   int i1;
   while (k < 12) { //this block fills the red pieces starting with block 64 at the top right corner
      for (j1 = 7; j1 >= 0; j1--) {
         for (i1 = 7; i1 >= 0; i1--) {
            string l = c.make_name((i1+1), (j1+1));
            if ((i1+j1)%2 == 0) {
               c.input(l, B_RED, true, false);
               board[i1][j1] = c;
               k++;
            }
            else {
               c.input(l, B_RED, false, false);
               board[i1][j1] = c;
            }
         }
      }
   }
}

和colors.h文件代表不同的颜色,如果有帮助

#ifndef COLORS_H
#define COLORS_H

#include <string>
using namespace std;

const string BLINK     = "\e[5m";          //don't use this your
                   //professor will probibly
                   //beat you to death if
                   //you do feel the need to
                   //use blink!!!
const string BOLD      = "\e[1m";

const string RESET     = "\e[0m";
const string ERROR     = "\e[1;41;37m\a";
const string MENU       = "\e[44;37m";

const string BLACK      = "\e[30m";
const string RED        = "\e[31m";

const string B_BLACK    = "\e[40m";
const string B_RED      = "\e[41m";


#endif //COLORS_H

colors.h缺少一些,但我绝不会使用大多数颜色,因此无关紧要。

因为你们要求查看电路板的初始化我只是要发布我的main.cc

#include "game.h"
#include "checker.h"
#include "colors.h"
#include <iostream>
#include <cstring>
#include <string> 
#include "checkers.h"

using namespace main_savitch_14;

using namespace std; 


int main()
{ 
    string move=""; 
    checkers* c = new checkers; 
    c->restart(); 
    c->display_status(); 
    cout << "where would you like to make your first move? \n";
    cout << "Enter, without spaces, and     which piece you would like ";
    cout << "to move and where(designated by space)\n for example:   A3D4\n" ;

    cin >> move; 
    c->make_move(move); 
    c->display_status(); 

    return 0;
} 

董事会在restart()初始化。

2 个答案:

答案 0 :(得分:2)

您的output函数承诺返回std::ostream,但没有任何return语句。这导致了不确定的行为和各种各样的肮脏。

即使它确实如此,流也是不可复制的。

此时您有两个选择:

  1. 该函数应该有返回类型std::ostream&,您应该在其末尾写return otp;;

  2. 该函数的返回类型应为void

  3. 打开你的编译器警告:它会告诉你这个,以及谁知道其他什么问题。

答案 1 :(得分:1)

您没有返回std:: ostream。 那不行!

我可以建议您下次使用-Wall或其他替代标志进行编译,以便您阅读no return value in a function returning non-void,包含行号以及一大堆其他有用的信息。< / p>

实际上,您的代码需要以两种方式进行修改 - 将函数的返回值更改为std:: ostream &,因此它返回引用而不是副本,并且应该return otp;在末尾。