几个小游戏希望采纳
---------------------------------------------------------------------------------------------------------------------------------
九个女人的故事(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