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;
}