回 帖 发 新 帖 刷新版面

主题:[原创]又一个五子棋程序(面向对象的)

这是我们的期末作业,由于才大一,自己又不努力,没有学AI,只有人-人对战了。
源代码分为四个文件组成,是图形界面的游戏。嘻嘻,贴出来大家交流一下啦,里面一定又很多bug,恳请高手指出,谢谢了。
//def.hpp
#include<dos.h>
#include<bios.h>
#include<iostream.h>
#include<fstream.h>
#include<conio.h>
#include<graphics.h>
#include<process.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define ENTER 0x1c0d
#define SPACE 0x3920
class ONGAME
{
  public:
   ONGAME(int gdriver=DETECT);
   void draw_map();  // Draw the map of Chess
   void question();//to ask you to input your names, and judge whether they are legal
   ~ONGAME();
  private:
     void init_map(); // init the map according the external file data
     void judge(int p_i,int p_j); // judge whthere the winner has come out
     void move(int player); // move according to the player's action
     void save_history(int s_winner); // save the result to the file "history.dat"
     void clear_map(); // clear the map(reset the map).
     void controller(); //to control the action of the players

     //name1[] is player1, name2[] is player2
     char name1[255],name2[255];
     //map_i[] and map_j[] store the posistion on the map;
     int map_i[8],map_j[8];
     // status[][] record the status 0(none), 1 (player1),2 (player2),
     int status[8][8];
     //WINNER =1 means player1 wins,WINNER=2 means player2 wins
     //WINNER =3 means to escape
     //WINNER =(others) means except the 3 cases above
     int WINNER;
     // first_go has two values 1 or 2, get from the last line of file "map.dat"
     int first_go;
};
class GRAPHIC
{
  public:
   GRAPHIC(int gdriver=DETECT);
   void draw_interface();  // Draw the interface(menus)
   int moveup(); // when returns 1 means menu1,2 means menu2,....
   int movedown(); // when returns 1 means menu1,2 means menu2,....
   int enter(); // when returns 1 means entering menu1,2 means menu2,....
   ~GRAPHIC(); //Close the graphic system

    int menu; // the current menu item
    int start_x,start_y;
    char *show_choice;
    ONGAME og; // an object of the class ONGAME
   private:
    void view_history(); //view the history from the file "history.dat"
    void show_about(); // show the content of menu of "about the game"
};


//GRAPHIC.CPP
#include<dos.h>
#include<bios.h>
#include<iostream.h>
#include<fstream.h>
#include<conio.h>
#include<graphics.h>
#include<process.h>
#include<io.h>
#include "def.hpp"
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define ENTER 0x1c0d
#define SPACE 0x3920

GRAPHIC::GRAPHIC (int gdriver)
{
      int gmode;
      initgraph(&gdriver,&gmode,"");
}
void GRAPHIC::draw_interface()  // Draw the interface,(menus)
{
      setfillstyle(1,0);
      bar(0,0,getmaxx(),getmaxy());  // clear the previous pictures
      setcolor(7);
      start_x=int(getmaxx()/2)-150;
      start_y=int(getmaxy()/2)-150;
      rectangle(start_x,start_y,start_x+300,start_y+250);
      setfillstyle(6,9);
      bar3d(start_x+5,start_y+5,start_x+295,start_y+245,1,1);
      setfillstyle(9,10);
      bar(start_x+10,start_y+25,start_x+290,start_y+240);
      outtextxy(start_x+35,start_y+10,"FIVE-STARS CHESS version 1.0");
      setfillstyle(1,BLACK);
      setcolor(getmaxcolor());
      bar(start_x+30,start_y+40,start_x+270,start_y+65);// menu 1
      outtextxy(start_x+50,start_y+50,"      Start The Game");
      setfillstyle(1,6);
      bar(start_x+30,start_y+85,start_x+270,start_y+110);// menu 2
      outtextxy(start_x+50,start_y+95,"    Review The History");
      bar(start_x+30,start_y+85+45,start_x+270,start_y+110+45);// menu 3
      outtextxy(start_x+50,start_y+95+45,"      About The Game");
      bar(start_x+30,start_y+85+45+45,start_x+270,start_y+110+45+45);// menu 4
      outtextxy(start_x+50,start_y+95+45+45,"      Exit the Game");
      outtextxy(start_x+45,start_y+95+45+45+30,"You are choosing: Start...");
}
int GRAPHIC:: moveup()// when returns 1 means menu1,2 means menu2,....
{
      int current_menu;
      switch (menu)
      {
    case 1:
     setfillstyle(1,BLACK);
     bar(start_x+30,start_y+85+45+45,start_x+270,start_y+110+45+45);// menu 4
     outtextxy(start_x+50,start_y+95+45+45,"      Exit the Game");
     setfillstyle(1,6);
     bar(start_x+30,start_y+40,start_x+270,start_y+65);// menu 1
     outtextxy(start_x+50,start_y+50,"      Start The Game");
     show_choice="Exit...";
     current_menu=4;
     break;
    case 2:
     setfillstyle(1,BLACK);
     bar(start_x+30,start_y+40,start_x+270,start_y+65);// menu 1
     outtextxy(start_x+50,start_y+50,"      Start The Game");
     setfillstyle(1,6);
     bar(start_x+30,start_y+85,start_x+270,start_y+110);// menu 2
     outtextxy(start_x+50,start_y+95,"    Review The History");
     show_choice="Start...";
     current_menu=1;
     break;
    case 3:
     setfillstyle(1,BLACK);
     bar(start_x+30,start_y+85,start_x+270,start_y+110);// menu 2
     outtextxy(start_x+50,start_y+95,"    Review The History");
     setfillstyle(1,6);
     bar(start_x+30,start_y+85+45,start_x+270,start_y+110+45);// menu 3
     outtextxy(start_x+50,start_y+95+45,"      About The Game");
     show_choice="Review...";
     current_menu=2;
     break;
    case 4:
     setfillstyle(1,BLACK);
     bar(start_x+30,start_y+85+45,start_x+270,start_y+110+45);// menu 3
     outtextxy(start_x+50,start_y+95+45,"      About The Game");
     setfillstyle(1,6);
     bar(start_x+30,start_y+85+45+45,start_x+270,start_y+110+45+45);// menu 4
     outtextxy(start_x+50,start_y+95+45+45,"      Exit the Game");
     show_choice="About...";
     current_menu=3;
     break;
      }
     setfillstyle(9,10);
     bar(start_x+185,start_y+95+45+45+30,start_x+260,start_y+95+45+45+40);
     outtextxy(start_x+185,start_y+95+45+45+30,show_choice);
      return current_menu;
}
int GRAPHIC::movedown() // when returns 1 means menu1,2 means menu2,....
{
     int current_menu;
      switch(menu)
      {
    case 1:
     setfillstyle(1,BLACK);
     bar(start_x+30,start_y+85,start_x+270,start_y+110);// menu 2
     outtextxy(start_x+50,start_y+95,"    Review The History");
     setfillstyle(1,6);
     bar(start_x+30,start_y+40,start_x+270,start_y+65);// menu 1
     outtextxy(start_x+50,start_y+50,"      Start The Game");
     show_choice="Review...";
     current_menu=2;
     break;
    case 2:
     setfillstyle(1,BLACK);
     bar(start_x+30,start_y+85+45,start_x+270,start_y+110+45);// menu 3
     outtextxy(start_x+50,start_y+95+45,"      About The Game");
     setfillstyle(1,6);
     bar(start_x+30,start_y+85,start_x+270,start_y+110);// menu 2
     outtextxy(start_x+50,start_y+95,"    Review The History");
     show_choice="About...";
     current_menu=3;
    break;
       case 3:
     setfillstyle(1,BLACK);
     bar(start_x+30,start_y+85+45+45,start_x+270,start_y+110+45+45);// menu 4
     outtextxy(start_x+50,start_y+95+45+45,"      Exit the Game");
     setfillstyle(1,6);
     bar(start_x+30,start_y+85+45,start_x+270,start_y+110+45);// menu 3
     outtextxy(start_x+50,start_y+95+45,"      About The Game");
     show_choice="Exit...";
     current_menu=4;
    break;
       case 4:
     setfillstyle(1,BLACK);
     bar(start_x+30,start_y+40,start_x+270,start_y+65);// menu 1
     outtextxy(start_x+50,start_y+50,"      Start The Game");
     setfillstyle(1,6);
     bar(start_x+30,start_y+85+45+45,start_x+270,start_y+110+45+45);// menu 4
     outtextxy(start_x+50,start_y+95+45+45,"      Exit the Game");
     show_choice="Start...";
     current_menu=1;
    break;
      }
     setfillstyle(9,10);
     bar(start_x+185,start_y+95+45+45+30,start_x+260,start_y+95+45+45+40);
     outtextxy(start_x+185,start_y+95+45+45+30,show_choice);
     return current_menu;
}
int GRAPHIC::enter() // when returns 1 means entering menu1,2 means menu2,....
{
     int current_menu;
      if (menu==1)  //call "start the game"
    og.question();
      if (menu==2)  //call "Review the history"
      {
    view_history();
      }
      if (menu==3) //call "About the game"
      {
       show_about();
      }
      if (menu==4) //call "exit the game"
      {
    exit(1);
      }
     return current_menu;
}
GRAPHIC:: ~GRAPHIC() //Close the graphic system
{
      closegraph();
}
void GRAPHIC::view_history() // view the history from the file "history.dat"
{
   ifstream read_from_history_file;
   char *name;
   int item_num=0;
   name=new char[255];
   char player1[255],player2[255];
   int year,month,day;
   read_from_history_file.open("history.dat",ios::in|ios::binary);
   if (!read_from_history_file)
    {
     cout<<"file \"history.dat\" not exist!";
     getch();
     return;
    }
   setfillstyle(1,0);
   bar(0,0,getmaxx(),getmaxy());
   cout.unsetf(ios::hex);
   cout<<endl<<endl;
   while (!read_from_history_file.eof())
   {
    item_num++;
    read_from_history_file>>player1;
    read_from_history_file>>player2;
    read_from_history_file>>name;
    if (player1[0]!='\0')
    {
     cout<<"----------------------------------------------------"<<endl;
     cout<<player1<<" VS "<<player2<<", and the Winner is : "<<name<<endl<<endl;
    }
    if (item_num%8==0)
    {
     setfillstyle(2,3);
     bar(260-30,20,440-30,30);
     outtextxy(280-30,20,"Review The History");
     cout<<"Press any to continue..."<<endl;
     getch();
    }
   }
     cout<<"----------------------------------------------------"<<endl;
   cout<<endl<<"Press any key to exit.";
   setfillstyle(2,3);
   bar(260-30,20,440-30,30);
   outtextxy(280-30,20,"Review The History");
   getch();
   read_from_history_file.close();
   menu=1;
   draw_interface();
}
void GRAPHIC::show_about()
{
   setfillstyle(1,0);
   bar(0,0,getmaxx(),getmaxy());
   setfillstyle(1,WHITE);
   bar(getmaxx()/2-150,getmaxy()/2-70,getmaxx()/2+150,getmaxy()/2+70);
   setcolor(BLACK);
   outtextxy(getmaxx()/2-150+100,getmaxy()/2-70+5,"About the Game");
   setfillstyle(1,0);
   bar(getmaxx()/2-150+5,getmaxy()/2-70+20,getmaxx()/2+150-5,getmaxy()/2+65);
   setcolor(WHITE);
   outtextxy(getmaxx()/2-150+50,getmaxy()/2-70+40-5,"   Five-Star Chess 1.0");
   outtextxy(getmaxx()/2-150+50,getmaxy()/2-70+60-5,"  Coded by Alex Ye 2005.6 ");
   outtextxy(getmaxx()/2-150+40,getmaxy()/2-70+80-5,"CAS of Sun Yat Sen University");
   outtextxy(getmaxx()/2-150+20,getmaxy()/2-70+100-5,"QQ:125165304 Email:yxz149@163.com");
   outtextxy(getmaxx()/2-150+40,getmaxy()/2-70+120-5,"    http://tqsoft.178L.com");
   getch();
   menu=1;
   draw_interface();
}

回复列表 (共18个回复)

11 楼

有开发文档的,
中文注释

12 楼

欢迎各位高与俺交流哦
如下:
五子棋游戏开发文档
一、    文件清单
DEF.HPP
GRAPHIC.CPP
ONGAME.CPP
MAIN.CPP
MAP.DAT(游戏运行时必须,存储棋局和一个下棋者)
HISTORY.DAT(游戏运行时必须,存贮战果记录)
EGAVGA.BGI(图形驱动文件)
CHESS.EXE(游戏可执行程序,必须有MAP.DAT和HISTORY.DAT)
(注意:上面文件必须放在同一文件夹中)

二、    源代码说明(源代码共包含四个文件,分别为DEF.HPP、GRAPHIC.CPP、ONGAME.CPP和MAIN.CPP)
1)    DEF.HPP 这是整个程序的类结构声明文件,里面描述了两个类即类ONGAME和类GRAPHC。

2)    GRAPHIC.CPP 这是类GRAPHIC的定义文件,这个类主要功能描述如下:
公有成员函数:
void draw_interface();  // Draw the interface(menus),负责画出菜单界面
  int moveup(); // when returns 1 means menu1,2 means menu2,...负责响应当用户按
下光标向上动作,即向上移动,返回当前选中的选项
  int movedown(); // when returns 1 means menu1,2 means menu2,.... 负责响应当用
户按下光标向下动作,即向下移动,返回当前选中的选项
  int enter(); // when returns 1 means entering menu1,2 means menu2,....当用户按下
ENTER键时,进入相应的菜单选项。
私有成员函数:
void view_history(); //view the history from the file "history.dat" 响应菜单选项2
void show_about(); // show the content of menu of "about the game"响应菜单选项3
        其他主要的成员数据:
          int menu; // the current menu item,记录当前菜单选项的项值,即第一项为1,类此。。

3)    ONGAME.CPP这是类ONGAME的定义文件,这是本程序的核心类,包含了游戏的各个重要功能。
公有成员函数:
  ONGAME(int gdriver),这是构造函数,负责初始化图形驱动,以及初始化在图形中坐标(map_i[],map_j[])和矩阵(status[][])中坐标的对应关系
void draw_map();  // Draw the map of Chess,这个函数负责画出棋盘,它在最后还将调用void init_map()函数。
void question();//to ask you to input your names, and judge whether they are legal,这个函数是负责输入玩家名字以及判断名字是否一样(一样则非法,重新输入)。这个函数在MAIN.CPP文件中通过类ONGAME的对象g调用(对象g是类GRAPHIC的一个公有成员)。注意:这里由于采用了图形和字符界面的混合,可能会出现输入位置错位现象,但不会影响到输入结果。比如:输入两个人名字分别为jack和alex,那输入的方法就是:jack(回车)alex(回车)(空格),就可以进入游戏画面了。
私有成员函数:
void init_map(); // init the map according the external file data,它负责初始化棋盘,其实是从“map.dat”文件中读入“上次由于没有下完棋”而保存的数据(其实就是棋盘的棋子布局,注意:这个函数没有读出“下一个下棋者是那个人”的数据)。最后还调用void controller() 函数
    void controller(); //这个函数负责控制两个棋手的动作,同时处理一些其他事件,但主要是控制棋子的动作(主要通过void move(int player)函数来实现。)
    void move(int player); // move according to the player's action,主要来移动棋子,其中参数player==1时表示player1,player==时表示player2。同时也处理一些如“没有下完棋而退出”等事件。
    void clear_map(); // clear the map(reset the map).这个函数其实就是实现重置棋盘,即重新下棋的功能,通过按键“F1”实现。
    void judge(int p_i,int p_j); // judge whthere the winner has come out,这个函数是整个游戏的核心之一,用来判断是否产生了胜利方。每次下完一个棋就调用一次,是在void move(int player)中调用的(也即是当玩家按下空格键产生一个新棋子时候响应)。判断的方法是从四个方向扫描整个棋盘,依次为竖直方向、左下至右上、横直方向、左上至右下,在程序中对应为case1,case2,case3,case4。
  数据成员(都是私有):
    char name1[255],name2[255]; 分别存贮player1和player2的名字,由函数void question()获得。
    int map_i[8],map_j[8];分别对应图形的棋盘上面的位置(注意显示器坐标和矩阵坐标的不同)
    int status[8][8];存贮当前矩阵,其值为1表示player1,2表示player2,0表示空
    int WINNER;当其为1表示player1赢,2时player2赢,3时表示“没有下完棋”而退出(此时将会询问是否保存“没有下完棋”而退出时的当前棋子布局记录),其他值则没有任何意义,但是可以却在第一次调用void controller()时候有用。
     int first_go;表示是谁应该先走第一步(这在“上次由于没有下完棋”而退出时候,下一此打开是有用),fisrt_go为1时表示player1,2时表示player2。

4)    MAIN.CPP是主函数演示程序。主要用来初始化g.menu的值(即为1,表示第一项菜单),调用g.draw_interface(),画出菜单,以及做一些简单的用户响应。


三、    编译说明:
本程序在TC++3.0 for DOS下通过编译。注意必须把EGAVGA.BGI文件放在源代码所在的文件夹中。同时程序附带了两个执行时必须的文件:map.dat 和 history.dat,也必须把它们放在有源代码同一文件夹中。

四、    游戏功能简介
该游戏是采用DOS模式下的图形界面,最大特点是易玩、有趣。
    主要功能有:
1)    采用8×8格五子棋,背景为浅蓝色,可以有效的保护您的视力。游戏采用人-人对战方式,其中Player1为棕色棋子,player2为白色棋子。
2)    进入正式游戏之前,必须输入两人的姓名,且不能相同。输入的每个姓名中不能有空格,每输入一个姓名按回车,最后别忘了按空格进入游戏。
3)    游戏时,玩家通过光标键移动棋标(就是空心的圆,棋标边界的颜色就是玩家棋子的颜色),确定放时按空格键。
4)    如果您要重新来过,即取消当前的棋的布局,按F1重置棋盘。
5)    如果您因为中途有事情离开,希望下次按照当前棋局接着玩,在按ESC键的之后,您可以看到游戏会询问您是否保存当前期间,按“y”(小写)表示保存,按“n”(小写)不保存,其他键无效。下次您打开游戏时候,游戏将自动加载上次棋局状态,尽管您仍需输入您的大名!
6)    当您下完一盘棋后,产生了胜利者,游戏将自动的为您保存结果。
7)    您可以通过菜单选项“Review The history”来查看您的战果。
8)    您还可以通过菜单选项“About The Game”查看游戏及作者信息。

游戏作者:叶新州 中山大学软件学院 计算机应用软件
2005年6月30日

13 楼

上面的是交给老师的文档。

14 楼

兄弟,能对人机对战设置一下吗?是不是要一个递规?我没有好的算法,一个一个查找太慢了,我是对下的一个子的各个方向上让机器查一下,可以五步最优。不过,太慢。
我想不是好的算法。

15 楼

你是哪个学校的呀~~~
我也是大一的呀 我们学的是c语言 连数据结构和算法都没有学
你们怎么学了那么多呀~~~
厉害~~
我们什么破学校呀~~~ 嘿嘿 好象认识一下呀~~~
交个朋友拉~

16 楼

我也是大一啊,连指针都不懂啊~~,唉~~~
好佩服楼主啊~~~如果是原创的话 ~~~

17 楼

写得不错!!!
我想要源码及中文文档最好能注明用到的面向对象知识点

18 楼

这个论坛不能打包上传吗

我来回复

您尚未登录,请登录后再回复。点此登录或注册