<pre name="code" class="csharp">/***********************************************
*版权所有 (c++)2015 巩凯强
*文件名:main.cpp
*文件标识 :无
*内容摘要:该文件中的代码用于输出菜单选项
*作者:巩凯强
*完成日期:20151224
************************************************/
#include "touwenjian.h"
/*************************
*main()函数
*功能描述:输出菜单选项
*输入参数:无
*输出参数:main1()
*返回值:0
**************************/
int main()
{
chuangjian();
main1();
return 0;
}
/*************************
*main1()函数
*功能描述:输出菜单选项
*输入参数:1或2
*输出参数:denglu()或zhuce()
*返回值:无
**************************/
void main1() //主登陆界面
{
system("color f9");
cout<<"如果你有帐号就选择登录,没有帐号就选择注册"<<endl;
cout<<"1 登录"<<endl;
cout<<"2 注册"<<endl;
char q;
cin>>q;
switch(q)
{
case '1':
denglu();
break;
case '2':
zhuce();
break;
default:
system("cls");
cout<<"输入错误,请重新输入"<<endl;
main1();
break;
}
}
/*************************
*mainmenu()函数
*功能描述:输出菜单选项
*输入参数:1或2或3或4
*输出参数:start()或paihang()或lishishuju()或exit1()
*返回值:无
**************************/
void mainmenu() // 游戏界面
{
system("color f9");
cout<<"请按提示输入,并按确定键继续"<<endl;
cout<<"1 开始游戏"<<endl;
cout<<endl;
cout<<"2 历史得分记录 "<<endl;
cout<<endl;
cout<<"3 历史闯关记录"<<endl;
cout<<endl;
cout<<"4 退出游戏"<<endl;
cout<<endl;
char choice;
cin>>choice;
switch(choice)
{
case '1':
start();
break;
case '2':
paihang();
break;
case '3':
lishijilu();
break;
case '4':
exit1();
break;
default:
system("cls");
cout<<"输入错误,请重新输入"<<endl;
mainmenu();
break;
}
}
/***********************************************
*版权所有 (c++)2015 巩凯强
*文件名:denglu.cpp
*文件标识 :无
*内容摘要:该文件中的代码用于用户注册或登录
*作者:巩凯强
*完成日期:20151224
************************************************/
#include "touwenjian.h"
string g;
struct test
{
char M2[100];
char N1[100];
char M1[100];
} t[100];
char m[100];
char n[100];
/*************************
*zhuce()函数
*功能描述:输出注册界面
*输入参数:无
*输出参数:main1()
*返回值:无
**************************/
void zhuce() //注册账户
{
int p=0;
ofstream write;
write.open("用户名及密码.txt",ios::app);
cout<<"请输入注册名:"<<endl;
cin>>t[p].N1;
g=t[p].N1;
ifstream write1("用户名及密码.txt",ios::in);
if (!write1)
{
system("cls");
cout<<"您还没有注册,请先注册再登录"<<endl;
main1();
}
for(int i=0 ; i<100; i++)
{
write1>>t[i].N1; //读取用户名信息
}
write1.close();
int q=1;
while (strlen(t[q].N1)) //顺序查找用户名是否存在
{
if(t[q].N1==g)
{
system("cls");
cout<<"用户名已存在,请重新输入"<<endl;
zhuce();
}
q++;
}
cout<<"请输入密码"<<endl;
getPass(t[p].M1);
cout<<"请再次输入密码:"<<endl;
getPass(t[p].M2);
if(strcmp(t[p].M1,t[p].M2)==0) //strcmp比较函数
{
cout<<"两次密码输入相同,注册成功,请登录"<<endl;
write <<g<<" "<<t[p].M1<<endl;
p++;
write.close();
main1();
}
else
{
cout<<"两次密码不相同,请重新输入"<<endl;
zhuce(); //递归调用
}
cout<<endl;
}
/*************************
*denglu()函数
*功能描述:输出登陆界面
*输入参数:无
*输出参数:start()
*返回值:无
**************************/
void denglu() //登陆界面
{
int p;
ifstream write1("用户名及密码.txt",ios::in);
if (!write1)
{
cout<<"您还没有注册,请先注册再登录"<<endl;
main1();
}
for(int i=0 ; i<100; i++)
{
write1>>t[i].N1;
write1>>t[i].M1;
}
cout<<"请输入用户名:";
cin>>m;
cout<<"请输入密码:";
getPass(n);
bool blogon=false;
while(blogon != true)
{
p = 0;
while (strlen(t[p].N1)) //判断文本文件中的本行是否为空
{
if(strcmp(m,t[p].N1)==0&&strcmp(n,t[p].M1)==0)
{
system("cls");
mainmenu();
blogon=true;
break;
}
else if(strcmp(m,"admin")==0&&strcmp(n,"admin")==0)
{
system("cls");
mainmenu();
blogon=true;
break;
}
p++;
}
if(!blogon) //判断用户名和密码是否正确
{
system("cls");
cout<<"用户名或密码不正确,请重新输入"<<endl;
cout<<"请输入用户名:";
cin>>m;
cout<<"请输入密码:";
getPass(n);
if(strcmp(m,"admin")==0&&strcmp(n,"admin")==0)
{
system("cls");
mainmenu();
blogon=true;
break;
}
else if(strcmp(m,t[p].N1)==0&&strcmp(n,t[p].M1)==0)
{
system("cls");
mainmenu();
blogon=true;
break;
}
}
}
}
/***********************************************
*版权所有 (c++)2015 巩凯强
*文件名:touwenjian.h
*文件标识 :无
*内容摘要:该文件中的代码主要是对函数的声明
*作者:巩凯强
*完成日期:20151224
************************************************/
#ifndef TOUWENJIAN_H_INCLUDED
#define TOUWENJIAN_H_INCLUDED
#include<iostream>
#include <fstream>
#include <iomanip>
#include<string.h>
#include<math.h>
#include <malloc.h>
#include<stdlib.h> //随机函数的头文件
#include<time.h>
#include <conio.h> //为了读取方向键的头文件
#include<windows.h> //调用系统时间的头文件
using namespace std;
#define MaxSize 100
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];
int top; //栈指针
} SqStack; //顺序栈类型定义
typedef int KeyType; //定义关键字类型
typedef char InfoType[100];
typedef struct //记录类型
{
KeyType key; //关键字项
InfoType data; //其他数据项,类型为InfoType
} RecType;
void InitStack(SqStack *&s); //初始化栈
bool StackEmpty(SqStack *s); //栈是否为空
int StackLength(SqStack *s); //返回栈中元素个数——栈长度
bool Push(SqStack *&s,ElemType e); //入栈
bool Pop(SqStack *&s,ElemType &e); //出栈
void mainmenu(); //游戏的主菜单
void main1(); //登陆界面的主菜单
void exit1(); //退出游戏函数
void denglu(); //登陆界面
void zhuce(); //注册界面
void getPass(char password[100]) ; //将密码变成*
int panemax(); //棋盘最大数
void showpane(); //显示棋盘
void newgame(); //开始游戏
bool if2n(int x); //判断x是否是2的n次方
int upmove(); //上移
int downmove(); //下移
int leftmove() ;//左移
int rightmove(); //右移
int testup(); //能否上移测试
int testdown(); //测试能否下移
int testleft(); //测试能否左移
int testright(); //测试能否右移
bool ifwin(); //判断是否胜利
bool ifGameOver(); //判断是否游戏结束
bool isPaneFull() ; // 判断是否有空位置增加数
void addNewNumber(); // 随即增加数字
int GetDirection(); //读取方向
void BubbleSort(RecType R[],int n);//冒泡排序
void paihang(); // 用栈知识点做的排行
void start(); //主游戏函数
void chuangjian();//调用初始化栈的函数
void lishijilu();//调用文件做的历史得分
#endif // TOUWENJIAN_H_INCLUDED
/***********************************************
*版权所有 (c++)2015 巩凯强
*文件名:youxijiemian.cpp
*文件标识 :无
*内容摘要:该文件中的代码用于开始游戏
*作者:巩凯强
*完成日期:20151224
************************************************/
#include "touwenjian.h"
ElemType e;
SqStack *s;
int score;
int step;
int pane[4][4]; //棋盘
int N = 11; //最大值为2的N次方
/*************************
*getPass()函数
*功能描述:输出*号
*输入参数:无
*输出参数:*
*返回值:无
**************************/
void getPass(char password[100]) //将密码变成*号
{
int length=0;
char ch;
while((ch=getch())!='\r')
{
if(ch=='\b')
{
cout<<'\b';
length--;
continue;
}
else
{
cout<<"*";
password[length]=ch;
length++;
}
}
cout<<endl;
}
/*************************
*panemax()函数
*功能描述:棋盘的最大数
*输入参数:无
*输出参数:无
*返回值:max
**************************/
int panemax() //棋盘最大数
{
int max = pane[0][0];
for (int i = 0; i <= 3; i++)
for (int j = 0; j <= 3; j++)
if (pane[i][j] > max)
max = pane[i][j];
return max;
}
/*************************
*InitStack()函数
*功能描述:初始化栈
*输入参数:无
*输出参数:无
*返回值:无
**************************/
void InitStack(SqStack *&s) //初始化栈
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
/*************************
*StackEmpty()函数
*功能描述:判断栈是否为空
*输入参数:无
*输出参数:无
*返回值:s->top
**************************/
bool StackEmpty(SqStack *s) //判断栈是否为空
{
return(s->top==-1);
}
/*************************
*StackLength()函数
*功能描述:返回栈中的元素个数
*输入参数:无
*输出参数:无
*返回值:s->top
**************************/
int StackLength(SqStack *s) //返回栈中元素个数——栈长度
{
return(s->top+1);
}
/*************************
*Push()函数
*功能描述:进栈操作
*输入参数:无
*输出参数:无
*返回值:true或false
**************************/
bool Push(SqStack *&s,ElemType e)
{
if (s->top==MaxSize-1) //栈满的情况,即栈上溢出
return false;
s->top++;
s->data[s->top]=e;
return true;
}
/*************************
*Pop()函数
*功能描述:出栈操作
*输入参数:无
*输出参数:无
*返回值:true或false
**************************/
bool Pop(SqStack *&s,ElemType &e)
{
if (s->top==-1) //栈为空的情况,即栈下溢出
return false;
e=s->data[s->top];
s->top--;
return true;
}
/*************************
*showpane()函数
*功能描述:显示棋盘
*输入参数:无
*输出参数:游戏界面
*返回值:无
**************************/
void showpane() //显示棋盘
{
SYSTEMTIME sys; //调用系统时间
GetLocalTime( &sys );
cout<<sys.wYear<<"年/"<<sys.wMonth<<"月/"<<sys.wDay<<"日 "<<sys.wHour<<"时:"<<sys.wMinute<<"分:"<<sys.wSecond<<"秒."<<sys.wMilliseconds<<" 星期";
switch(sys.wDayOfWeek)
{
case 0:
cout<<"日"<<endl;
break;
case 1:
cout<<"一"<<endl;
break;
case 2:
cout<<"二"<<endl;
break;
case 3:
cout<<"三"<<endl;
break;
case 4:
cout<<"四"<<endl;
break;
case 5:
cout<<"五"<<endl;
break;
case 6:
cout<<"六"<<endl;
break;
}
cout<<"用上下左右键控制方向"<<endl;
cout<<"score:"<<score<<" "<<"max:"<<panemax()<<" "<<"step:"<<step<<endl;
cout<<" |-----+-----+-----+------|"<<endl;
for(int i=0; i<=3; i++)
{
cout<<setw(1)<<"";
for(int j=0; j<=3; j++)
{
if(pane[i][j]==0)
cout<<setw(2)<<"|"<<setw(4)<<" "; //setw()函数用于对齐且保持“|”不动
else
cout<<setw(2)<<"|"<<setw(4)<<pane[i][j];
if(j==3)
{
cout<<setw(3)<<"|"<<endl;
cout<<setw(1)<<" |-----+-----+-----+------|"<<endl;
}
}
}
}
/*************************
*newgame()函数
*功能描述:开始游戏
*输入参数:无
*输出参数:pane【m】【n】
*返回值:无
**************************/
void newgame() //开始游戏
{
score=0;
step=0;
for (int i = 0; i <= 3; i++) //初始化棋盘
for (int j = 0; j <= 3; j++)
pane[i][j] = 0;
srand((unsigned)time(NULL)); //srand函数是随机数发生器的初始化函数
int m = rand() % 4;
int n = rand() % 4;
pane[m][n] = 2; //在随机的位置产生数
showpane();
}
/*************************
*if2n()函数
*功能描述:判断是否是2^n
*输入参数:无
*输出参数:无
*返回值:flag
**************************/
bool if2n(int x) //判断x是否是2的n次方
{
bool flag = false;
int n;
for (n = 1; n <= N; n++)
{
if (x == pow(2, n))
{
flag = true;
}
}
return flag;
}
/*************************
*upmove()函数
*功能描述:上移
*输入参数:无
*输出参数:无
*返回值:flag
**************************/
int upmove() //上移
{
int flag = 0;
for (int j = 0; j <= 3; j++)
for (int i=0; i < 3; i++)
{
int count = 0;
for (int k = 0; k < 4; k++) //第三个for循环是为了上移的时候一步过去
{
if (pane[k][j] != 0)
{
pane[count][j] = pane[k][j];
if (k != count)
pane[k][j] = 0;
count++;
}
}
if (if2n(pane[i][j] + pane[i + 1][j]) == 1)
{
if(pane[i][j]==pane[i+1][j]) //当两个数相同时,进行相加
{
pane[i][j] = pane[i][j] + pane[i + 1][j];
score+=pane[i][j]; //累计得分
}
pane[i + 1][j] = 0;
flag = 1;
}
}
return flag;
}
/*************************
*downmove()函数
*功能描述:下移
*输入参数:无
*输出参数:无
*返回值:flag
**************************/
int downmove() //下移
{
int flag = 0;
for (int j = 0; j <= 3; j++)
for (int i = 3; i > 0; i--)
{
int count = 3;
for (int k = 3; k >= 0; k--) //第三个for循环是为了下移的时候一步过去
{
if (pane[k][j] != 0)
{
pane[count][j] = pane[k][j];
if (k != count)
pane[k][j] = 0;
count--;
}
}
if (if2n(pane[i][j]+pane[i-1][j])== 1)
{
if(pane[i][j]==pane[i-1][j]) // 当两个数相同时,进行相加
{
pane[i][j] = pane[i][j] + pane[i-1][j];
score+=pane[i][j]; //累计得分
}
pane[i-1][j] = 0;
flag=1;
}
}
return flag;
}
/*************************
*leftmove()函数
*功能描述:左移
*输入参数:无
*输出参数:无
*返回值:flag
**************************/
int leftmove() //左移
{
int flag=0;
for (int i=0; i<= 3; i++)
for (int j=0; j<3; j++)
{
int count = 0;
for (int k = 0; k < 4; ++k) //第三个for循环是为了左移的时候一步过去
{
if (pane[i][k] != 0)
{
pane[i][count] = pane[i][k];
if (k != count)
pane[i][k] = 0;
count++;
}
}
if (if2n(pane[i][j] + pane[i][j + 1]) == 1)
{
if(pane[i][j]==pane[i ][j+1]) //当两个数相同时,进行相加
{
pane[i][j] = pane[i][j] + pane[i][j + 1];
score+=pane[i][j]; //累计得分
}
pane[i][j + 1] = 0;
flag = 1;
}
}
return flag;
}
/*************************
*rightmove()函数
*功能描述:右移
*输入参数:无
*输出参数:无
*返回值:flag
**************************/
int rightmove() //右移
{
int flag = 0;
for (int i=0; i<=3; i++)
for (int j=3; j>0; j--)
{
int count = 3;
for (int k = 3; k >= 0; --k) //第三个for循环是为了右移的时候一步过去
{
if (pane[i][k] != 0)
{
pane[i][count] = pane[i][k];
if (k != count)
pane[i][k] = 0;
count--;
}
}
if (if2n(pane[i][j] + pane[i][j - 1]) == 1)
{
if(pane[i][j]==pane[i][j-1]) //当两个数相同时,进行相加
{
pane[i][j] = pane[i][j] + pane[i][j - 1];
score+=pane[i][j]; //累计得分
}
pane[i][j - 1] = 0;
flag = 1;
}
}
return flag;
}
/*************************
*testup()函数
*功能描述:能否上移测试
*输入参数:无
*输出参数:无
*返回值:flag
**************************/
int testup() //能否上移测试
{
int flag = 0;
for (int j = 0; j <= 3; j++)
for (int i = 0; i < 3; i++)
{
if (if2n(pane[i][j] + pane[i + 1][j]) == 1 && pane[i + 1][j] != 0)//就近的两个相加是否等于2^N
{
flag = 1;
}
}
return flag;
}
/*************************
*testdown()函数
*功能描述:能否下移测试
*输入参数:无
*输出参数:无
*返回值:flag
**************************/
int testdown() //测试能否下移
{
int flag=0;
for(int j=0; j<=3; j++)
for(int i=3; i>0; i--)
{
if((if2n(pane[i][j]+pane[i-1][j])==1))
{
flag=1;
}
}
return flag;
}
/*************************
*testleft()函数
*功能描述:能否左移测试
*输入参数:无
*输出参数:无
*返回值:flag
**************************/
int testleft() //测试能否左移
{
int flag = 0;
for (int i = 0; i <= 3; i++)
for (int j = 0; j < 3; j++)
{
if (if2n(pane[i][j] + pane[i][j + 1]) == 1)
{
flag = 1;
}
}
return flag;
}
/*************************
*testright()函数
*功能描述:能否右移测试
*输入参数:无
*输出参数:无
*返回值:flag
**************************/
int testright() //测试能否右移
{
int flag = 0;
for (int i = 0; i <= 3; i++)
for (int j = 3; j > 0; j--)
{
if (if2n(pane[i][j] + pane[i][j - 1]) == 1)
{
flag = 1;
}
}
return flag;
}
/*************************
*ifwin()函数
*功能描述:判断是否胜利
*输入参数:无
*输出参数:无
*返回值:true或false
**************************/
bool ifwin() //判断是否胜利
{
if (panemax() == pow(2, N))
{
cout << "You Win!" << endl;
cout <<"你已达到2048"<<endl;
return true;
}
else
{
return false;
}
}
/*************************
*ifGameOver()函数
*功能描述:判断是否游戏结束
*输入参数:无
*输出参数:无
*返回值:true或false
**************************/
bool ifGameOver() //判断是否游戏结束
{
if (testup() + testdown() + testleft() + testright() == 0)
{
cout << "Game Over!" << endl;
return true;
}
else
{
return false;
}
}
/*************************
*isPaneFull()函数
*功能描述:判断是否有空位置增加数
*输入参数:无
*输出参数:无
*返回值:true或false
**************************/
bool isPaneFull() // 判断是否有空位置增加数
{
bool flag = true;
for (int i = 0; i < 4; ++i)
for (int j = 0; j < 4; ++j)
{
if (pane[i][j] == 0)//
flag = false;
}
return flag;
}
/*************************
*addNewNumber()函数
*功能描述:随即增加数字
*输入参数:无
*输出参数:无
*返回值:无
**************************/
void addNewNumber() // 随即增加数字
{
if (isPaneFull())
return;
int m, n;
srand(int(time(0)));
do
{
m = rand() % 4;
n = rand() % 4;
}
while (pane[m][n] != 0);
if (rand() % 4 == 3)
pane[m][n] = 4;//随机出2,和4 但是2的概率要大一点。
else
pane[m][n] = 2;
}
/*************************
*GetDirection()函数
*功能描述:读取方向
*输入参数:无
*输出参数:无
*返回值:ret
**************************/
int GetDirection() //读取方向
{
int ret = 0;
while (ret == 0)
{
int ch = getch();
if (isascii(ch)) //检查参数ch是否为ASCII 码字符
continue;
ch = getch();
switch (ch)
{
case 72:
ret = 2; // up
break;
case 75:
ret = 1; // left
break;
case 77:
ret = 3; // right
break;
case 80:
ret = 4; // down
break;
default:
break;
}
}
return ret;
}
/*************************
*BubbleSort()函数
*功能描述:冒泡排序
*输入参数:无
*输出参数:无
*返回值:无
**************************/
void BubbleSort(RecType R[],int n)//冒泡排序
{
int i,j;
RecType tmp;
for (i=0; i<n-1; i++)
{
for (j=n-1; j>i; j--) //比较,找出本趟最小关键字的记录
if (R[j].key<R[j-1].key)
{
tmp=R[j]; //R[j]与R[j-1]进行交换,将最小关键字记录前移
R[j]=R[j-1];
R[j-1]=tmp;
}
}
}
/*************************
*paihang()函数
*功能描述:用栈知识点做的排行
*输入参数:无
*输出参数:无
*返回值:无
**************************/
void paihang() // 用栈知识点做的排行
{
if(StackEmpty(s))
{
char a;
cout<<"暂无历史战绩."<<endl;
cout<<"是否开始新的游戏?(y/n)"<<endl;
cin>>a;
if(a=='y')
start();
else
mainmenu();
}
cout<<"历史战绩为:"<<endl;
int i=0;
RecType R[MaxSize];
int n=StackLength(s);
while (!StackEmpty(s))
{
Pop(s,e);
R[i].key=e;
i++;
}
BubbleSort(R,n);
for (int i=0; i<n; i++)
cout<<R[i].key<<endl;
system("pause");
system("cls");
mainmenu();
}
/*************************
*lishijilu()函数
*功能描述:历史数据
*输入参数:无
*输出参数:无
*返回值:无
**************************/
void lishijilu()
{
int line=0;
char c,v;
int guanka;
int i;
ifstream write3("历史纪录.txt",ios::in);
if (!write3)
{
system("cls");
cout<<"还没有历史记录,请先开始游戏"<<endl;
mainmenu();
}
while(write3.get(c))
{
if(c=='\n')
line++;
}
write3.close();
int max=0;
ifstream write4("历史纪录.txt",ios::in);
if (!write4)
{
system("cls");
cout<<"还没有历史记录,请先开始游戏"<<endl;
mainmenu();
}
for(i=0; i<line; i++)
{
write4 >> guanka; //读取历史记录
if(max<=guanka)
{
max=guanka;
}
cout<<"第"<<guanka<<"关"<<endl;
}
cout<<"目前最大的关卡是第"<<max<<"关"<<endl;
write4.close();
cout<<"是否进行新的游戏(y/n)"<<endl;
cin>>v;
if(v=='y')
{
start();
}
else
{
cout << "再见!" << endl;
system("pause");
}
}
/*************************
*exit1()函数
*功能描述:退出游戏
*输入参数:无
*输出参数:无
*返回值:无
**************************/
void exit1()//退出游戏
{
cout << "再见!" << endl;
system("pause");
}
/*************************
*start()函数
*功能描述:主游戏函数
*输入参数:无
*输出参数:无
*返回值:无
**************************/
void start() //主游戏函数
{
system("color f9"); //默认输出窗口为白色
int makesure = 1;
int guanka=1;
while (makesure==1)
{
while(guanka==1)
{
system("cls");
newgame();
while (ifwin() + ifGameOver() == 0&&step<25)
{
if(score>=100)
{
guanka++;
break;
}
if(guanka==1)
{
cout<<"第一关:25步内得分100"<<endl;
}
int c = GetDirection();
switch (c)
{
case 2:
upmove();
step++;
break;
case 4:
downmove();
step++;
break;
case 1:
leftmove();
step++;
break;
case 3:
rightmove();
step++;
break;
default:
break;
}
system("cls");
addNewNumber();
showpane();
}
break;
}
while(guanka==2)
{
system("cls");
cout<<"请按上下左右键继续"<<endl;
while (ifwin() + ifGameOver() == 0&&step<50)
{
if(score>=300)
{
guanka++;
break;
}
if(guanka==2)
{
cout<<"第二关:50步内得分300"<<endl;
}
int c = GetDirection();
switch (c)
{
case 2:
upmove();
step++;
break;
case 4:
downmove();
step++;
break;
case 1:
leftmove();
step++;
break;
case 3:
rightmove();
step++;
break;
default:
break;
}
system("cls");
addNewNumber();
showpane();
}
break;
}
while(guanka==3)
{
system("cls");
cout<<"请按上下左右键继续"<<endl;
while (ifwin() + ifGameOver() == 0&&step<100)
{
if(score>=800)
{
guanka++;
break;
}
if(guanka==3)
{
cout<<"第三关:100步内得分800"<<endl;
}
int c = GetDirection();
switch (c)
{
case 2:
upmove();
step++;
break;
case 4:
downmove();
step++;
break;
case 1:
leftmove();
step++;
break;
case 3:
rightmove();
step++;
break;
default:
break;
}
system("cls");
addNewNumber();
showpane();
}
break;
}
while(guanka==4)
{
system("cls");
cout<<"请按上下左右键继续"<<endl;
while (ifwin() + ifGameOver() == 0&&step<200)
{
if(score>=2000)
{
guanka++;
break;
}
if(guanka==4)
{
cout<<"第四关:200步内得分2000"<<endl;
}
int c = GetDirection();
switch (c)
{
case 2:
upmove();
step++;
break;
case 4:
downmove();
step++;
break;
case 1:
leftmove();
step++;
break;
case 3:
rightmove();
step++;
break;
default:
break;
}
system("cls");
addNewNumber();
showpane();
}
break;
}
while(guanka==5)
{
system("cls");
cout<<"请按上下左右键继续"<<endl;
while (ifwin() + ifGameOver() == 0&&step<300)
{
if(score>=3500)
{
guanka++;
break;
}
if(guanka==5)
{
cout<<"第五关:300步内得分3500"<<endl;
}
int c = GetDirection();
switch (c)
{
case 2:
upmove();
step++;
break;
case 4:
downmove();
step++;
break;
case 1:
leftmove();
step++;
break;
case 3:
rightmove();
step++;
break;
default:
break;
}
system("cls");
addNewNumber();
showpane();
}
break;
}
while(guanka==6)
{
system("cls");
cout<<"请按上下左右键继续"<<endl;
while (ifwin() + ifGameOver() == 0&&step<400)
{
if(score>=5000)
{
guanka++;
break;
}
if(guanka==6)
{
cout<<"第六关:400步内得分5000"<<endl;
}
int c = GetDirection();
switch (c)
{
case 2:
upmove();
step++;
break;
case 4:
downmove();
step++;
break;
case 1:
leftmove();
step++;
break;
case 3:
rightmove();
step++;
break;
default:
break;
}
system("cls");
addNewNumber();
showpane();
}
break;
}
while(guanka==7)
{
system("cls");
cout<<"请按上下左右键继续"<<endl;
while (ifwin() + ifGameOver() == 0&&step<500)
{
if(score>=7000)
{
guanka++;
break;
}
if(guanka==7)
{
cout<<"第七关:500步内得分7000"<<endl;
}
int c = GetDirection();
switch (c)
{
case 2:
upmove();
step++;
break;
case 4:
downmove();
step++;
break;
case 1:
leftmove();
step++;
break;
case 3:
rightmove();
step++;
break;
default:
break;
}
system("cls");
addNewNumber();
showpane();
}
break;
}
while(guanka==8)
{
system("cls");
cout<<"请按上下左右键继续"<<endl;
while (ifwin() + ifGameOver() == 0&&step<600)
{
if(score>=9000)
{
guanka++;
break;
}
if(guanka==8)
{
cout<<"第八关:600步内得分9000"<<endl;
}
int c = GetDirection();
switch (c)
{
case 2:
upmove();
step++;
break;
case 4:
downmove();
step++;
break;
case 1:
leftmove();
step++;
break;
case 3:
rightmove();
step++;
break;
default:
break;
}
system("cls");
addNewNumber();
showpane();
}
break;
}
while(guanka==9)
{
system("cls");
cout<<"请按上下左右键继续"<<endl;
while (ifwin() + ifGameOver() == 0&&step<700)
{
if(score>=11500)
{
guanka++;
break;
}
if(guanka==9)
{
cout<<"第九关:700步内得分11500"<<endl;
}
int c = GetDirection();
switch (c)
{
case 2:
upmove();
step++;
break;
case 4:
downmove();
step++;
break;
case 1:
leftmove();
step++;
break;
case 3:
rightmove();
step++;
break;
default:
break;
}
system("cls");
addNewNumber();
showpane();
}
break;
}
while(guanka==10)
{
system("cls");
cout<<"请按上下左右键继续"<<endl;
while (ifwin() + ifGameOver() == 0&&step<800)
{
if(score>=14000)
{
guanka++;
break;
}
if(guanka==10)
{
cout<<"第十关:800步内得分14000"<<endl;
}
int c = GetDirection();
switch (c)
{
case 2:
upmove();
step++;
break;
case 4:
downmove();
step++;
break;
case 1:
leftmove();
step++;
break;
case 3:
rightmove();
step++;
break;
default:
break;
}
system("cls");
addNewNumber();
showpane();
}
break;
}
while(guanka==11)
{
system("cls");
cout<<"请按上下左右键继续"<<endl;
while (ifwin() + ifGameOver() == 0&&step<900)
{
if(score>=17000)
{
cout<<"恭喜您已通关"<<endl;
break;
}
if(guanka==11)
{
cout<<"第十一关:900步内得分17000"<<endl;
}
int c = GetDirection();
switch (c)
{
case 2:
upmove();
step++;
break;
case 4:
downmove();
step++;
break;
case 1:
leftmove();
step++;
break;
case 3:
rightmove();
step++;
break;
default:
break;
}
system("cls");
addNewNumber();
showpane();
}
break;
}
Push(s,panemax());
ofstream write2;
write2.open("历史纪录.txt",ios::app);
write2 <<guanka<<endl;
write2.close();
cout << "你的闯关成绩为第" << guanka<<"关"<<endl;
cout << "若要返回主菜单请输入2,若要重新开始游戏请输入1,若要结束请输入0." << endl;
cin >> makesure;
while (makesure!=2&&makesure!=1&&makesure!=0)
{
cout << "输入不正确,请重新输入!" << endl;
cin >> makesure;
}
if(makesure==1)
{
guanka=1;
}
if(makesure==2)
{
mainmenu();
}
}
}
/*************************
*chuangjian()函数
*功能描述:调用初始化栈的函数
*输入参数:无
*输出参数:无
*返回值:无
**************************/
void chuangjian()//调用初始化栈的函数
{
InitStack(s);
}
运行结果:
知识点总结:
所谓课程设计,就是对这一学期所学知识的运用,一方面是要做一个具体的实践项目,另一方面是巩固知识,我在本次课程设计中所用到的知识有:顺序栈,顺序查找,冒泡排序(虽然复杂度有点高),递归调用,调用系统时间,以及读文件,写文件等操作,断断续续花费了我一个半月的时间,才做到今天这样,我想如果时间更充足的话,我会加上更多的功能。
学习心得:
只有掌握了知识才是最重要的。