![]() |
#2
幽竹烟雨2018-11-09 20:35
#include<iostream>
#include<windows.h> #include<time.h> #include<stdlib.h> #include<conio.h> #define N 21 using namespace std; void gotoxy(int x,int y) { COORD pos; pos.X=2*x; pos.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); } void color(int a) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a); } void init(int apple[2]) { int i,j; int wall[N+1][N+1]={{0}}; for(i=1;i<=N;i++) { for(j=1;j<=N;j++) wall[i][j]=1; } color(11); for(i=0;i<N+1;i++) { for(j=0;j<N+1;j++) { if(wall[i][j]) cout<<"■"; else cout<<"□" ; } cout<<endl; } gotoxy(N+2,1); color(10); cout<<" 哈哈哈哈哈"<<endl; gotoxy(N+2,2); color(28); cout<<"按 W S A D 移动方向"<<endl; gotoxy(N+2,3); color(28); cout<<"按任意键暂停"<<endl; gotoxy(N+2,4); color(18); cout<<"得分:"<<endl; apple[0]=rand()%N+1; apple[1]=rand()%N+1; gotoxy(apple[0],apple[1]); color(12); cout<<"●"<<endl; } int main() { int i,j; int** snake=NULL; int apple[2]; int score=0; int tail[2]; int len=3; char ch='p'; srand((unsigned)time(NULL)); init(apple); snake=(int**)realloc(snake,sizeof(int*)*len); for(i=0;i<len;i++) snake[i]=(int*)malloc(sizeof(int)*2); for(i=0;i<len;i++) { snake[i][0]=N/2; snake[i][1]=N/2+i; gotoxy(snake[i][0],snake[i][1]); color(14); cout<<"★"<<endl; } while(1) { tail[0]=snake[len-1][0]; tail[1]=snake[len-1][1]; gotoxy(tail[0],tail[1]); color(11); cout<<"■"<<endl; for(i=len-1;i>0;i--) { snake[i][0]=snake[i-1][0]; snake[i][1]=snake[i-1][1]; gotoxy(snake[i][0],snake[i][1]); color(14); cout<<"★"<<endl; } if(kbhit()) { gotoxy(0,N+2); ch=getche(); } switch(ch) { case 'w':snake[0][1]--;break; case 's':snake[0][1]++;break; case 'a':snake[0][0]--;break; case 'd':snake[0][0]++;break; default: break; } gotoxy(snake[0][0],snake[0][1]); color(14); cout<<"★"<<endl; Sleep(abs(200-0.5*score)); if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//吃掉苹果后蛇分数加1,蛇长加1 { score++; len++; snake=(int**)realloc(snake,sizeof(int*)*len); snake[len-1]=(int*)malloc(sizeof(int)*2); apple[0]=rand()%N+1; apple[1]=rand()%N+1; gotoxy(apple[0],apple[1]); color(12); cout<<"●"<<endl; gotoxy(N+5,3); color(20); cout<<score<<endl; } if(snake[0][1]==0||snake[0][1]==N||snake[0][0]==0||snake[0][0]==N)//撞到围墙后失败 { gotoxy(N/2,N/2); color(30); cout<<"Game Over"<<endl; for(i=0;i<len;i++) free(snake[i]); Sleep(INFINITE); exit(0); } } return 0; } ![]() |
#include <iostream.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h> //使用当前时间做种子;
enum dir{up,down,left,right}; //枚举类型enum dir;
//围墙;
class Fence{
public:
void InitFence();
void OutputF();
public:
char game[20][20];
}f; //定义对象;
//画框框;
void Fence::InitFence(){
for(int i=0; i<20; i++)
for(int j=0; j<20; j++){
if(i==0||i==19||j==0||j==19)
game[i][j]= '*';
else game[i][j]= ' ';
}
}
//显示框框;
void Fence::OutputF(){
for(int i=0; i<20; i++){
for(int j=0; j<20; j++)
cout<<game[i][j]<<' ';
cout<<endl;
}
}
//蛇结点;
class SnakeNode{
private:
int x,y;
SnakeNode *prior,*next;
public:
void add_head(int x,int y);
int get_x();
int get_y();
void delete_tail();
}*head=NULL, *tail =NULL;
//插入头结点;
void SnakeNode::add_head(int x,int y){
SnakeNode *q=new SnakeNode;
q->x =x; q->y =y;
q->next =head;
q->prior =NULL;
if(head) head->prior =q;
head =q;
if(!tail) tail =head;
f.game[x][y]= '*'; //f对象可以在定义Fence类时定义; 且Fence类在SnakeNode类前定义;
}
int SnakeNode::get_x(){
return x;
}
int SnakeNode::get_y(){
return y;
}
//删除尾结点;
void SnakeNode::delete_tail(){
SnakeNode *p =tail;
f.game[tail->get_x()][tail->get_y()]= ' ';//把尾结点的坐标表示的'*'置为空格;
if(tail==head)
tail= head= NULL;
else{
tail= tail->prior;
tail->next= NULL;
}
delete p;
}
//move移动;
class move{
public:
dir point; //枚举变量point: 控制方向;
int food_x;
int food_y;
public:
void moving();
void change_point(char); //改变方向;
void get_food();
};
void move::moving(){
int a,b;
a= head->get_x(); //取得头结点横坐标
b= head->get_y(); //头结点纵坐标
switch(point){
case up: --a; break;
case down: ++a; break;
case left: --b; break;
case right: ++b; break;
}
if(a==19||b==19||a==0||b==0){ //判断是否撞墙;
cout<<"game over!!!"<<endl;
exit(0);
}
if(a==food_x && b==food_y){ //吃food;
head->add_head(a,b);
get_food();
}
else{
head->add_head(a,b); //插入头结点;
head->delete_tail(); //删除尾结点;
}
}
void move::change_point(char keydown){
switch(keydown){
case 'w': point= up; break;
case 's': point= down; break;
case 'a': point= left; break;
case 'd': point= right; break;
}
}
void move::get_food(){
srand((unsigned int) time(NULL)); //做种子(程序运行时间);
food_x= rand()%18+1;
food_y= rand()%18+1;
f.game[food_x][food_y]= '*';
}
//main();
int main(){
cout<<"Using 'w,s,a,d'to control direction!!!\n\n\n";
//画框框和小蛇;
move m;
f.InitFence();
head->add_head(4,3);
head->add_head(4,4);
head->add_head(4,5);
m.get_food();
f.OutputF();
while (true){
char keydown= getch(); //getch()返回键盘上读取的字符;包含头文件<conio.h>
m.change_point(keydown);
while(!kbhit()){ //判断有没有按键落下;
system("cls"); //清屏函数;
m.moving();
f.OutputF();
Sleep(200);
}
}
return 0;
}