| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 747 人关注过本帖
标题:C++写hangman程序,用curses清除屏幕显示内容出现了问题,请大家指点一下。
只看楼主 加入收藏
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
结帖率:96.23%
收藏
已结贴  问题点数:10 回复次数:2 
C++写hangman程序,用curses清除屏幕显示内容出现了问题,请大家指点一下。
/* hangman游戏就是从字典(dictionary)文件里面随机选取一个单词,然后让玩家猜这个单词,每次玩家输入一个字母,如果这个字母属于这个单词,就在这个单词的正确位置显示这个字母。
玩家一共有6次机会猜这个词,如果玩家猜错了6次,那么就输了。不管赢了还是输了,程序都会问玩家是否要继续或者退出。我这个程序现在总体上满足了要求,但是问题是,程序执行了一次后
我想继续玩,之前显示在屏幕上的东西不能清除。所以恳请各位高手帮我指点一下,非常感谢。另外这个程序需要读入的dictionary文件我上传的附件里面了。谢谢
*/
#include<iostream>
#include<ncurses.h>
#include<fstream>
#include<string>
#include<vector>
#include<time.h>
#include<stdlib.h>
using namespace std;
vector<string> words;  //  这个容器是用来储存dictionary 文件中的所有单词

void read_dictionary(string &s)  //this function is used to read the words in the dictionary
{ ifstream infile(s.c_str());
     if(infile.good()==false)
     cout<<" can't open this dictionary."<<endl;
      for( string word; infile>>word; )
        words.push_back( word ); // 这个函数用来读入dictionary 中的单词到words容器
                                 
}
int main()
{
   int row,col;
   int wrongnumbers=0;// 这个变量是用来统计猜错的次数
   bool t;
     char quit='s';
     while(quit!='q')    //这个while循环是这个程序的主体
       { initscr();
     char line[9][10]={
       "  _______",
       "  |     |",           //这是一个绞刑架
       "  |      ",
       "  |      ",
       "  |      ",
       "|_|______",
       "|       |",
       "|_______|",};
     int i,j,n=0;
     for(i=0;i<=7;++i)        // 这个for循环是用来画绞刑架
       {
         for(j=0;j<=8;++j)
           {  mvprintw(5+i,3+j,"%c",line[i][j]);
           }
       }
      string fileName = "dictionary";
     read_dictionary(fileName); //调用read_dictionary 函数
     int m;
     m=words.size();
      string owords[24000];
      for(i=0;i<23718;++i)     //容器words里面有23718个单词,我重新把容器words中的单词,复制到了一个名字叫owords的数组里面。
      {
         owords[i]=words[i];
      }
      int num,l;
      char marks[5]; //这个marks数组里面的一些符号是用来画绞刑架上的人,‘o'代表着头,’/‘是胳膊,’|‘是身体
      marks[0]='o';
      marks[1]='/';
      marks[2]='|';
      marks[3]='?';
      srand((unsigned)time(0));
      num=rand()%23717;      //得到一个随机数
      char w[50];
      l=words[num].size();  //通过这个随机数,得到一个随机的单词,并将这个随机的单词保存在变量l中
      for(i=0;i<l;i++)  //这个for循环是用来显示"---------"在屏幕上,比如这个随机单词是“hello”那么就在屏幕上显示5个’-‘,这五个横杆可以告诉玩家这个单词里面有几个字母
      {
        w[i]='-';
        mvprintw(5,20+i,"%c",w[i]);
      }
      refresh();
      move(5,40);
      printw("%s","please guess the word");
      refresh();
      char guess[50];
      for(i=0;i<l+6;i++)  //因为玩家有6次猜错的机会,所以玩家可以输入字母的次数为单词中字母的个数加上6
     {  cin>>guess[i];
        t=false;
        int rightnumber=0;
        for(j=0;j<l;j++) // 比较玩家输入的字母和单词中的每一个字母
        {
          if(guess[i]==owords[num][j])
            {
               mvprintw(7,20+j,"%c",owords[num][j]); // 如果玩家猜对了字母,就将这个对的字母显示在对应的横杠下
               refresh();
               owords[num][j]=',';
               t=true;
               rightnumber++;
               break;
            }
         }
         if(t==false)  //如果玩家没能猜对,就将这个字母显示在屏幕另外的位置,用来告诉玩家这个字母已经猜过了。
            {   mvprintw(12,55+i,"%c",guess[i]);
                refresh();
                wrongnumbers++;
            }

         switch(wrongnumbers) //这个switch循环是用来画绞刑架上的人,因为人有6个部分,头,左手,右手,左腿,右腿,身体,所以才有6次机会
          {
             case 1:
             mvprintw(7,11,"%c",marks[0]);
             refresh();
             break;
             case 2:
             mvprintw(8,10,"%c",marks[1]);
             refresh();
             break;
             case 3:
             mvprintw(8,12,"%c",marks[2]);
             refresh();
             break;
             case 4:
             mvprintw(8,11,"%c",marks[3]);
             refresh();
             break;
             case 5:
             mvprintw(9,10,"%c",marks[1]);
             refresh();
             break;
             case 6:
             mvprintw(9,12,"%c",marks[2]);
             move(17,23);
             printw("%s","you lose the game,this word is");
             move(17,55);
             printw("%s",words[num].c_str());
             refresh();
             break;
             default:
             break;
          }
           if(wrongnumbers==6||rightnumber==l)
            break;
       }
      move(33,33);
      printw("%s","if you want to quit,press q");
      quit=getch();
      if(quit=='q')//如果你不想玩了按q退出,如果按的是其他的键,那么游戏继续,
       endwin();
      else
    noecho();//这里我希望的是如果玩家选择继续游戏,那么我需要将上一次游戏运行时候显示在屏幕上的东西清除,比如上次游戏中猜的词,横杠,还有绞刑架的人,但是
             //没有成功,希望大家给我建议
      refresh();
    }

     return 0;
}
搜索更多相关主题的帖子: dictionary 单词 游戏 字母 
2013-12-05 02:59
kevin_01
Rank: 2
等 级:论坛游民
帖 子:36
专家分:83
注 册:2013-11-23
收藏
得分:5 
试试这个:
#include<windows.h>
system("cls");

Hello  World !
2013-12-05 21:29
a190205460
Rank: 2
来 自:湖南
等 级:论坛游民
帖 子:29
专家分:59
注 册:2013-10-26
收藏
得分:5 
哇,...........
2013-12-05 21:31
快速回复:C++写hangman程序,用curses清除屏幕显示内容出现了问题,请大家指点一 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016792 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved