C++『低龄儿童』游戏收录

几个小游戏希望采纳

---------------------------------------------------------------------------------------------------------------------------------

九个女人的故事(9王后)

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <string>
#include <cstdio>
#define clear() cout << "\033c" << flush
using namespace std;

const int SIZE = 9;
int Queen[15][15]; 
// 值为0表示不在攻击范围内,可以放置新皇后;
// 1表示在攻击范围内,不可放置
// 9和-9表示皇后

// 游戏规则展示
void intro()
{
    cout << "===============================================" << endl;
    cout << "***欢迎运行九皇后游戏!***" << endl;
    cout << "【游戏规则如下:】" << endl;
    cout << "在这个游戏里会有一个 9*9 的国际象棋棋盘,我们可以在在国际象棋的棋盘上放置皇后," << endl;
    cout << "使其不能相互攻击,即任意两个皇后不能处于棋盘的同一行、同一列和同一条对角线上。" << endl;
    cout << "1. 如果一方放置皇后时位于其他皇后的攻击范围内,该方失败,游戏结束!" << endl;
    cout << "2. 若您不能进行任何放置,游戏结束!" << endl; 
    cout << "================================================" << endl << endl;
}

// 打印当前棋盘
void drawBoard()
{
    // 输出行号
    cout << " ";
    for (int i = 1; i <= SIZE; i++) cout << "   " << i;
    cout << "\n";
    // 输出上边框
    cout << "  ╔";
    for (int i = 1; i <= SIZE-1; i++) cout << "═══╤";
    cout << "═══╗\n";
    // 输出中间部分
    for (int i = 1; i <= SIZE; i++) // 行
    {
        cout << i << " ║";
        for (int j = 1; j <= SIZE; j++) // 列
        {
            if (Queen[i][j] == 9) // 玩家
            {
                cout << " A ";
            }
            if (Queen[i][j] == -9) // 电脑
            {
                cout << " A ";
            }
            if (Queen[i][j] == 0 || Queen[i][j] == 1) // 空格或不可放置
            {
                cout << "   ";
            }
            if (j != SIZE)
                cout << "│";
            else
                cout << "║";
        }
        cout << " \n";
        // 输出下边框
        if (i != SIZE)
        {
            cout << "  ╟";
            for (int i = 1; i <= SIZE-1; i++) cout << "───┼";
            cout << "───╢\n";
        }
        else
        {
            cout << "  ╚";
            for (int i = 1; i <= SIZE-1; i++) cout << "═══╧";
            cout << "═══╝\n";
        }
    }
}

// 判断一次放置皇后是否有效
bool isValid(int hang, int lie) 
{
    if (Queen[hang][lie] != 0)
        return false;
    return true;
}

// 放置皇后、标记皇后的攻击范围
void mark(int who, int hang, int lie) // who为9表示玩家,-9表示电脑
{
    // 划定攻击范围
    for (int i = 1; i <= 9; i++)
    {
        for (int j = 1; j <= 9; j++)
        {
            // 跳过已经不能放置的位置
            if (Queen[i][j] != 0) continue;
            // 判断是否在皇后所管辖的 行
            if (hang - i == 0 && lie - j != 0)
            {
                Queen[i][j] = 1;
            }
            // 判断是否在皇后所管辖的 列
            if (hang - i != 0 && lie - j == 0)
            {
                Queen[i][j] = 1;
            }
            // 判断是否在皇后所管辖的 左右斜线
            if (abs(hang - i) == abs(lie - j))
            {
                Queen[i][j] = 1;
            }
        }
    }
    // 放置皇后
    if (who == 9) Queen[hang][lie] = 9;
    else Queen[hang][lie] = -9;
}

// 开始游戏
void game() 
{
    cout << "【玩家先开始!】" << endl << endl; 
    while (true)
    {
        // (1)玩家策略
        cout << "请玩家输入行列数字(例:行列数字:1 2)" << endl;
        int hang1, lie1;
        cin >> hang1 >> lie1;
        if (isValid(hang1, lie1) == false) // 该位置不可放置
        {
            cout << "胜败乃兵家常事!大侠请重新来过!" << endl;
            exit(0);
        }
        else
        {
            // 放置后标记皇后的攻击范围
            mark(9, hang1, lie1);
            // 打印放置结果
            drawBoard();
        }
        
        // (2)电脑策略
        srand(time(0));
        int hang2, lie2;
        for (int i = 1; i <= 1000000; i++)
        {
            hang2 = rand() % 9 + 1;
            lie2 = rand() % 9 + 1;
            if (isValid(hang2, lie2) == false) continue;
            else break;
        }
        if (isValid(hang2, lie2) == false)
        {
            cout << "计算机不能进行任何位置放置,恭喜玩家胜利!游戏结束" << endl;
            exit(0);
        }
        else
        {
            // 放置后标记皇后的攻击范围
            mark(-9, hang2, lie2);
            cout << "电脑在 (" << hang2 << ", " << lie2 << ") 处放置皇后" << endl;
            cout << "按下回车,查看电脑回合……" << endl;
            getchar();
            getchar();
            // 打印放置结果
            drawBoard();
        }
    }
}

int main()
{
    intro(); // 游戏规则展示
    drawBoard(); // 打印棋盘
    game(); // 开始游戏
    
    return 0;
}

天上下像素了(俄罗斯方块)

#include<iostream>
#include<string>
#include<cstdlib>
#include<windows.h>
#include<ctime>
#include<conio.h>
#include<cstdio>
using namespace std;

class Tetris
{
private:
	int rank;				//游戏难度等级
	int score;				// 得分
	int id;					//图形ID
	int point[2];			//两基点
	int top;					//最高点高度
public:
	Tetris();
	void Welocme();			//首界面
	void DrawMap();			//游戏界面
	void SetColor(int);		//控制颜色
	void Draw(int , int , int );		//画图形
	void Run();				//运行游戏
	void ReDraw(int, int, int);			//清除图形
	bool Judge(int, int , int );			
	void Turn(int);				//旋转
	void Updata();				// 更新界面
	void Pause();				//游戏暂停
	void Input_score();
};

const int sharp[15][8]=					//组成图形的各个点的各个坐标,先纵后横
{
{0,0,1,0,2,0,3,0},{0,0,0,1,0,2,0,3},
{0,0,1,0,0,1,1,1},
{0,0,1,0,1,1,1,2},{0,1,1,1,2,0,2,1},{0,0,0,1,0,2,1,2},{0,0,0,1,1,0,2,0},
{1,0,1,1,1,2,0,2},{0,0,0,1,1,1,2,1},{0,0,0,1,0,2,1,0},{0,0,1,0,2,0,2,1},
{0,0,0,1,1,1,1,2},{0,1,1,0,1,1,2,0},
{0,1,0,2,1,0,1,1},{0,0,1,0,1,1,2,1}
};

const int high[15]={4,1,2,2,3,2,3,2,3,2,3,2,3,2,3};
int map[28][16];

#define a1  0			//条形
#define a2  1

#define b 2					// 方块

#define c1 3					//L形
#define c2 4
#define c3 5
#define c4 6

#define d1 7					//T形
#define d2 8 
#define d3 9
#define d4 10

#define e1 11				//闪电1形
#define e2 12

#define f1 13				//闪电2形
#define f2 14

Tetris::Tetris()				//构造函数, 初始化各个值
{
	point[0] = 0;
	point[1] = 5;
	score = 0;
	top = 25;
}

void Tetris::Turn(int num)				//旋转函数
{
	switch(num)
	{
	case a1: id = a2; break;					//条形互换
	case a2: id = a1; break;

	case b: id = b; break;					//方块无法旋转

	case c1: id = c2; break;					//各种L形互换
	case c2: id = c3; break;
	case c3: id = c4; break;
	case c4: id = c1; break; 

	case d1: id = d2; break;					//各种T形互换
	case d2: id = d3; break;
	case d3: id = d4; break;
	case d4: id = d1; break;

	case e1: id = e2; break;					//两种闪电形互换
	case e2: id = e1; break;	

	case f1: id = f2; break;
	case f2: id = f1; break;
	}
}

void SetPos(int i, int j)			//控制光标位置, 列, 行
{
	COORD pos={i,j};
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

void Tetris::Pause()				// 暂停函数
{
	SetPos(32, 10);
	cout << "游戏暂停!" << endl;
	SetPos(30, 11);
	cout << "你的分数为 " << score;
	char temp;
	while(1)
	{
		while(1)
		{
			if(_kbhit())
			{
				temp = _getch();
				break;
			}
		}
		if(temp == 32)
			break;
	}
	SetPos(32, 10);					// 清除暂停时显示的信息
	cout << "         ";
	SetPos(30, 11);
	cout << "              ";
}

void Tetris::Updata()					//更新函数
{
	int i, flag;
	int nx, ny;
	for(i = 0; i < 4; i++)
	{
		nx = point[0] + sharp[id][i * 2];
		ny = point[1] + sharp[id][i * 2 + 1];
		SetPos((ny + 1) * 2, nx + 1);
		SetColor(0);
		cout << "■";
		map[nx][ny] = 1;					//界面各个点是否为空的更新
	}

	if(point[0] < top)
		top = point[0];					//最高点的更新

	for(i = point[0]; i < point[0] + high[id]; i++)			//消除行
	{
		flag = 1;
		for(int j = 0; j < 13; j++)					//判定某一行是否满, 用flag来标记
			if(map[i][j] == 0)
				flag = 0;
		if(flag == 1)
		{
			for(int k = i; k >= top; k--)
			{
				for(int p = 0; p < 13; p++)
				{
					map[k][p] = map[k - 1][p];
					SetPos((p + 1) * 2, k + 1);
					if(map[k][p] == 1)
						cout << "■";
					else cout << "  ";

				}
			}
			score += 10;
			Input_score();
		}
	}
}

void Tetris::Input_score()
{
	SetColor(3);
	SetPos(30, 19);
	cout << "得分: " << score;
}

void Tetris::Welocme()			//欢迎界面
{
	SetColor(1);
	char x;
	while(1)
	{
		system("cls");
		cout<<"■■■■■■■■■■■■■■■■■■■■■"<<endl;
		cout <<"		俄罗斯方块		" << endl;
		cout<<"■■■■■■■■■■■■■■■■■■■■■"<<endl;
		cout << "		操作方式:" << endl;
		cout << "		↑ - 旋转" << endl;
		cout << "		↓ - 加速下移"  << endl;
		cout << "		← - 左移" << endl;
		cout << "		→ - 右移" << endl;
		cout << "		空格 - 暂停" << endl;
		cout<<"■■■■■■■■■■■■■■■■■■■■■"<<endl;
		cout <<"■ 按1—3选择难度■" << endl;
		SetPos(20, 10);
		x = getchar();
		if(x <= '9' && x >= '0')
		{
			rank = x - '0';
			break;
		}
	}
}

void Tetris::SetColor(int color_num)			//设置颜色
{
	int n;
	switch(color_num)
	{
		case 0: n = 0x08; break;
		case 1: n = 0x0C; break;
		case 2: n = 0x0D; break;
		case 3: n = 0x0E; break;
		case 4: n = 0x0A; break;
	}
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), n);
}

void Tetris::DrawMap()				//画游戏时界面
{
	int i;
	SetColor(0);

	for(i = 0; i < 24; i++)		//宽24格
	{
		SetPos(i * 2, 0);
		cout << "■";
		SetPos(i * 2, 26);
		cout << "■";
	}
	
	for(i = 0; i < 26; i++)		//高26格
	{
		SetPos(0, i);
		cout << "■";
		SetPos(28, i);
		cout << "■";
		SetPos(46, i);
		cout << "■";
	}
	
	for(i = 14; i < 24; i++)
	{
		SetPos(i * 2, 16);
		cout << "■";
	}

	SetColor(3);
	Input_score();
	SetPos(30, 21);
	cout << "难度等级: " << rank; 
	SetPos(32, 2);
	cout << "下一图形";
}

void Tetris::Draw(int x, int y, int num)				//画图形
{
	int nx, ny;

	for(int i = 0; i < 4; i++)
	{
		nx = x + sharp[num][2 * i];
		ny = y + sharp[num][2 * i + 1];
		SetPos((ny + 1) * 2, nx + 1);
		SetColor(i + 1);
		cout << "■";
	}
}

void Tetris::ReDraw(int x, int y, int num)				//为更新图形的位置清除图形
{
	int nx, ny;

	for(int i = 0; i < 4; i++)
	{
		nx = x + sharp[num][2 * i];
		ny = y + sharp[num][2 * i + 1];
		SetPos((ny + 1) * 2, nx + 1);
		cout << "  ";
	}
}

bool Tetris::Judge(int x, int y, int num)				//判定在x, y 所指位置是否可画编号为
{													//num 的图形, 若不可画则反回true
	int nx, ny;
	for(int i = 0; i < 4; i++)
	{
		nx = x + sharp[num][2 * i];
		ny = y + sharp[num][2 * i + 1];
		if(!(nx < 25 && nx >= 0 && ny < 13 && ny >= 0 && !map[nx][ny]))
			return true;
	}
	return false;
}

void Tetris::Run()					//运行游戏
{
	int next_id;
	srand((int)time(0));

	id = rand() % 15;
	next_id = rand() % 15;

	Draw(point[0], point[1], id);
	Draw(5, 16, next_id);
	
	int count;
	if(rank == 1)
		count = 150;
	else if(rank == 2)
		count = 100;
	else if(rank==3) 
		count = 50;
	else
		count = 5;
	int i = 0;  //不同等级对应不同count
	
	while(1)
	{
		if(!(i < count))				//i 与 count 用于控制时间
		{
			i = 0;
			if(Judge(point[0] + 1, point[1], id))			//在某一位置不能下落的话
			{
				Updata();
				id = next_id;

				ReDraw(5, 16, next_id);
				next_id = rand() % 15;

				point[0] = 0; point[1] = 5;
				Draw(point[0], point[1], id);
				Draw(5, 16, next_id);

				if(Judge(point[0] , point[1], id))
				{
					system("cls");
					SetPos(20, 10);
					cout << "游戏结束!" << endl;
					SetPos(20, 11);
					cout << "你的分数为 " << score << endl;
					system("pause");
					exit(1);
				}
			}
			else					//继续下落
			{
				ReDraw(point[0], point[1], id);
				point[0]++;
				Draw(point[0], point[1], id);
			}
		}

		if(_kbhit())				//键盘输入值时 
		{
			int key, key2;
			key = _getch();
			if (key==224) 
			{
				key2 = _getch();

				if (key2 == 72)			//按向上方向键时
				{
					int temp = id;
					Turn(id);
					if(Judge(point[0], point[1], id))
						id = temp;
					ReDraw(point[0], point[1], temp);
					Draw(point[0], point[1], id);
				}
				 if (key2== 80)				//按向下方向键时
				{
					if(!Judge(point[0] + 2, point[1], id))
					{
						ReDraw(point[0], point[1], id);
						point[0] += 2;
						Draw(point[0], point[1], id);
					}
				}
				else if (key2== 75)				//按向左方向键时
				{
					if(!Judge(point[0], point[1] - 1, id))
					{
						ReDraw(point[0], point[1], id);
						point[1]--;
						Draw(point[0], point[1], id);
					}
				}
				else if (key2== 77)					//按向右方向键时
				{
					if(!Judge(point[0], point[1] + 1, id))
					{
						ReDraw(point[0], point[1], id);
						point[1]++;
						Draw(point[0], point[1], id);
					}
				}
			}
			else if(key == 32)					// 按下空格暂停
				Pause();
		}
			
		Sleep(1);		//等待1毫秒
		i++;				//控制下落间隔
	}
}

int main()
{
	Tetris game;
	game.Welocme();
	system("cls");				//清除欢迎界面
	game.DrawMap();
	game.Run();
}

左拐右拐左拐右拐左拐右拐左拐右拐左拐右拐(贪吃蛇)

#include <cstdio>
#include <cstdlib>
#include <windows.h>//windows编程头文件
#include <time.h>
#include <conio.h>//控制台输入输出头文件
#define SNAKESIZE 100//蛇的身体最大节数
#define MAPWIDTH 118 //宽度
#define MAPHEIGHT 29//高度
//食物的坐标

struct {
    int x;
    int y;
}food;
//蛇的相关属性
struct {
    int speed;//蛇移动的速度
    int len;//蛇的长度
    int x[SNAKESIZE];//组成蛇身的每一个小方块中x的坐标
    int y[SNAKESIZE];//组成蛇身的每一个小方块中y的坐标
 
}snake;
//绘制游戏边框
void drawMap();
//随机生成食物
void createFood();
//按键操作
void keyDown();
//蛇的状态
bool snakeStatus();
//从控制台移动光标
void gotoxy(int x, int y);
int key = 72;//表示蛇移动的方向,72为按下“↑”所代表的数字
//用来判断蛇是否吃掉了食物,这一步很重要,涉及到是否会有蛇身移动的效果以及蛇身增长的效果
int changeFlag = 0;
int sorce = 0;//记录玩家的得分

//将光标移动到控制台的(x,y)坐标点处
void gotoxy(int x, int y)
{
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
//蛇的状态 
bool snakeStatus()
{
    //蛇头碰到上下边界,游戏结束
    if (snake.y[0] == 0 || snake.y[0] == MAPHEIGHT)
        return false;
    //蛇头碰到左右边界,游戏结束
    if (snake.x[0] == 0 || snake.x[0] == MAPWIDTH)
        return false;
    //蛇头碰到蛇身,游戏结束
    for (int i = 1; i < snake.len; i++)
    {
        if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
            return false;
    }
    return true;
}

//画地图 
void drawMap()
{
    //打印上下边框
    for (int i = 0; i <= MAPWIDTH; i += 2)//i+=2是因为横向占用的是两个位置
    {
        //将光标移动依次到(i,0)处打印上边框
        gotoxy(i, 0);
        printf("■");
        //将光标移动依次到(i,MAPHEIGHT)处打印下边框
        gotoxy(i, MAPHEIGHT);
        printf("■");
    }

    //打印左右边框
    for (int i = 1; i < MAPHEIGHT; i++)
    {
        //将光标移动依次到(0,i)处打印左边框
        gotoxy(0, i);
        printf("■");
        //将光标移动依次到(MAPWIDTH, i)处打印左边框
        gotoxy(MAPWIDTH, i);
        printf("■。");
    }
 
    //随机生成初试食物
    while (1)
    {
        srand((unsigned int)time(NULL));
        food.x = rand() % (MAPWIDTH - 4) + 2;
        food.y = rand() % (MAPHEIGHT - 2) + 1;
        //生成的食物横坐标的奇偶必须和初试时蛇头所在坐标的奇偶一致,因为一个字符占两个字节位置,若不一致
        //会导致吃食物的时候只吃到一半
        if (food.x % 2 == 0)
            break;
    }
    //将光标移到食物的坐标处打印食物
    gotoxy(food.x, food.y);
    printf("●");
 
    //初始化蛇的属性
    snake.len = 3;
    snake.speed = 200;
 
    //在屏幕中间生成蛇头
    snake.x[0] = MAPWIDTH / 2 + 1;//x坐标为偶数
    snake.y[0] = MAPHEIGHT / 2;
    //打印蛇头
    gotoxy(snake.x[0], snake.y[0]);
    printf("■");
 
    //生成初试的蛇身
    for (int i = 1; i < snake.len; i++)
    {
        //蛇身的打印,纵坐标不变,横坐标为上一节蛇身的坐标值+2
        snake.x[i] = snake.x[i - 1] + 2;
        snake.y[i] = snake.y[i - 1];
        gotoxy(snake.x[i], snake.y[i]);
        printf("■");
    }
    //打印完蛇身后将光标移到屏幕最上方,避免光标在蛇身处一直闪烁
    gotoxy(MAPWIDTH - 2, 0);
    return;
}
void keyDown()
{
    int pre_key = key;//记录前一个按键的方向
    if (_kbhit())//如果用户按下了键盘中的某个键
    {
        fflush(stdin);//清空缓冲区的字符
 
        //getch()读取方向键的时候,会返回两次,第一次调用返回0或者224,第二次调用返回的才是实际值
        key = _getch();//第一次调用返回的不是实际值
        key = _getch();//第二次调用返回实际值
    }
 
    /*
    *蛇移动时候先擦去蛇尾的一节
    *changeFlag为0表明此时没有吃到食物,因此每走一步就要擦除掉蛇尾,以此营造一个移动的效果
    *为1表明吃到了食物,就不需要擦除蛇尾,以此营造一个蛇身增长的效果
    */
    if (changeFlag == 0)
    {
        gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);
        printf("  ");//在蛇尾处输出空格即擦去蛇尾
    }
 
    //将蛇的每一节依次向前移动一节(蛇头除外)
    for (int i = snake.len - 1; i > 0; i--)
    {
        snake.x[i] = snake.x[i - 1];
        snake.y[i] = snake.y[i - 1];
    }
 
    //蛇当前移动的方向不能和前一次的方向相反,比如蛇往左走的时候不能直接按右键往右走
    //如果当前移动方向和前一次方向相反的话,把当前移动的方向改为前一次的方向
    if (pre_key == 72 && key == 80)
        key = 72;
    if (pre_key == 80 && key == 72)
        key = 80;
    if (pre_key == 75 && key == 77)
        key = 75;
    if (pre_key == 77 && key == 75)
        key = 77;
 
    /**
    *控制台按键所代表的数字
    *“↑”:72
    *“↓”:80
    *“←”:75
    *“→”:77
    */
 
    //判断蛇头应该往哪个方向移动
    switch (key)
    {
    case 75:
        snake.x[0] -= 2;//往左
        break;
    case 77:
        snake.x[0] += 2;//往右
        break;
    case 72:
        snake.y[0]--;//往上
        break;
    case 80:
        snake.y[0]++;//往下
        break;
    }
    //打印出蛇头
    gotoxy(snake.x[0], snake.y[0]);
    printf("■");
    gotoxy(MAPWIDTH - 2, 0);
    //由于目前没有吃到食物,changFlag值为0
    changeFlag = 0;
    return;
}
//创造食物 
void createFood()
{
    if (snake.x[0] == food.x && snake.y[0] == food.y)//蛇头碰到食物
    {
        //蛇头碰到食物即为要吃掉这个食物了,因此需要再次生成一个食物
        while (1)
        {
            int flag = 1;
            srand((unsigned int)time(NULL));
            food.x = rand() % (MAPWIDTH - 4) + 2;
            food.y = rand() % (MAPHEIGHT - 2) + 1;
 
            //随机生成的食物不能在蛇的身体上
            for (int i = 0; i < snake.len; i++)
            {
                if (snake.x[i] == food.x && snake.y[i] == food.y)
                {
                    flag = 0;
                    break;
                }
            }
            //随机生成的食物不能横坐标为奇数,也不能在蛇身,否则重新生成
            if (flag && food.x % 2 == 0)
                break;
        }
 
        //绘制食物
        gotoxy(food.x, food.y);
        printf("●");
 
        snake.len++;//吃到食物,蛇身长度加1
        sorce += 10;//每个食物得10分
        snake.speed -= 10;//随着吃的食物越来越多,速度会越来越快
        changeFlag = 1;//很重要,因为吃到了食物,就不用再擦除蛇尾的那一节,以此来造成蛇身体增长的效果
    }
    return;
}
int main()
{
	system("color 03");
    drawMap();
    while (1)
    {
        keyDown();
        if (!snakeStatus())
            break;
        createFood();
        Sleep(snake.speed);
    }
 
    gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2);
    printf("Game Over!\n");
    gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 1);
    printf("本次游戏得分为:%d\n", sorce);
    Sleep(5000);
    return 0;
}

下次继续

----------------------------------------by Barbatos

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值