|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这个程序比较适合新手培养编程兴趣,程序比较简单,主要是坐标的跳转,代码比较乱,去掉改变颜色的函数可能会好很多!
首先用一个数组来存放每个棋子的坐标struct // 存棋盘坐标以及是否有棋子类型,0为无棋,1为叉叉,二为勾勾
{
POINT xy;
int type;
}chessboard[3][3] = { // 给他们一个坐标 && 和初值0
{6,15,0, 6,19,0, 6,23,0},
{8,15,0, 8,19,0, 8,23,0},
{10,15,0, 10,19,0, 10,23,0}
};
用制表符号画一个棋盘const char map[5][11] = { // 我们画一个棋盘
" ┃ ┃ ",
"━╋━╋━",
" ┃ ┃ ",
"━╋━╋━",
" ┃ ┃ "
};
接下来定义几个全局变量POINT nowPos = {0,0}; // 这个代表这当前光标的位置
int now = 1; // 这个表示当前落子
设想游戏需要的功能
1 首先需要有一个光标指向你要下棋的位置
2 下棋之后需要判断你赢了没有
3 我们需要将大图打印出来
.......
用到的函数如下void setcolor(unsigned short); // 这个设置字体的颜色
void gotoxy(int,int); // 这个函数跳转到参数指点的坐标处
void printMap(); // 打印上面那个地图
void bymove(const char,const char[]); // 对光标进行移动
BOOL estimate(POINT, int); // 判断当前的落子后是否会胜利
程序界面如下
代码如下
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <iostream>
#define W(key) key == 'W' || key == 'w' ?TRUE:FALSE
#define S(key) key == 'S' || key == 's' ?TRUE:FALSE
#define A(key) key == 'A' || key == 'a' ?TRUE:FALSE
#define D(key) key == 'D' || key == 'd' ?TRUE:FALSE
#define IMOK(key) key == 13 ?TRUE:FALSE
#define TONULL for(int i = 0; i < 3 * 3; i++) chessboard[i/3][i%3].type = 0;
using namespace std;
struct // 存棋盘坐标以及是否有棋子类型,0为无棋,1为叉叉,二为勾勾
{
POINT xy;
int type;
}chessboard[3][3] = { // 给他们一个坐标 && 和初值0
{6,15,0, 6,19,0, 6,23,0},
{8,15,0, 8,19,0, 8,23,0},
{10,15,0, 10,19,0, 10,23,0}
};
POINT nowPos = {0,0}; // 这个代表这当前光标的位置
int now = 1; // 这个表示当前落子
const char map[5][11] = { // 我们画一个棋盘
" ┃ ┃ ",
"━╋━╋━",
" ┃ ┃ ",
"━╋━╋━",
" ┃ ┃ "
};
void setcolor(unsigned short); // 这个设置字体的颜色
void gotoxy(int,int); // 这个函数跳转到参数指点的坐标处
void printMap(); // 打印上面那个地图
void bymove(const char,const char[]); // 对光标进行移动
BOOL estimate(POINT, int); // 判断当前的落子后是否会胜利
int main() // 程序从此处开始执行
{
system("mode 40,20"); // 改变窗口的大小
system("title 井字棋"); // 设置窗口的标题
TONULL // 为了重新开始游戏 ,将储存信息的数字重置一遍
printMap(); // 打印地图 && 打印第一个光标
while(TRUE) // 开始进入死循环
{
char key = getch(); // 获取用户的输入 getch() 不回显,不懂自己百度
if(W(key)) // 主要判断输入的字符是不是 ‘w’下面类似
{
bymove('w',">"); // 这个函数的参数试一个方向,和光标的样式
}
else if(S(key))
{
bymove('s',">");
}
else if(A(key))
{
bymove('a',">");
}
else if(D(key))
{
bymove('d',">");
}
else if(IMOK(key)) // 如果用户按下回车键
{
if(chessboard[nowPos.x][nowPos.y].type == 0) // 首先判断这个位置有没有棋子
{
chessboard[nowPos.x][nowPos.y].type = (now ? 1:2); // 如果没有棋子,把该点打上标记
gotoxy(chessboard[nowPos.x][nowPos.y].xy.x, chessboard[nowPos.x][nowPos.y].xy.y);
setcolor(13);
cout << (now ?"√":"×"); // 在改点打印一个棋子
if(estimate(nowPos,now ? 1:2) == TRUE) // 落子后判断赢了没有
{
if(MessageBox(NULL, TEXT((!now ? "叉叉胜利":"勾勾胜利")), TEXT("是否重新开始游戏"),MB_YESNO) == IDYES) main(); else return 0;
}
now = !now;
}
}
}
}
void setcolor(unsigned short color)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}
void gotoxy(int x,int y)
{
COORD f = {y,x};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), f);
}
void printMap() // 胡乱打印一波
{
setcolor(11);
gotoxy(6,15);cout << map[0] << "\n";
gotoxy(7,15);cout << map[1] << "\n";
gotoxy(8,15);cout << map[2] << "\n";
gotoxy(9,15);cout << map[3] << "\n";
gotoxy(10,15);cout << map[4] << "\n";
gotoxy(chessboard[0][0].xy.x, chessboard[0][0].xy.y);
setcolor(14);
cout << ">"; // 这个试第一个光标
}
void bymove(const char aspect,const char obj[])
{
setcolor(13);
if(aspect == 'w') // wsad 表示上下左右
{
if(nowPos.x > 0) // 这个坐标信息是存放在一个数组里面的
{
gotoxy(chessboard[nowPos.x][nowPos.y].xy.x, chessboard[nowPos.x][nowPos.y].xy.y );
if(chessboard[nowPos.x][nowPos.y].type == 0)
cout << " ";
else if(chessboard[nowPos.x][nowPos.y].type == 1)
cout << "√";
else if(chessboard[nowPos.x][nowPos.y].type == 2)
cout << "×";
gotoxy(chessboard[--nowPos.x][nowPos.y].xy.x, chessboard[nowPos.x][nowPos.y].xy.y );
setcolor(14);
cout << obj;
}
}
else if(aspect == 's')
{
if(nowPos.x < 2)
{
gotoxy(chessboard[nowPos.x][nowPos.y].xy.x, chessboard[nowPos.x][nowPos.y].xy.y );
if(chessboard[nowPos.x][nowPos.y].type == 0)
cout << " ";
else if(chessboard[nowPos.x][nowPos.y].type == 1)
cout << "√";
else if(chessboard[nowPos.x][nowPos.y].type == 2)
cout << "×";
gotoxy(chessboard[++nowPos.x][nowPos.y].xy.x, chessboard[nowPos.x][nowPos.y].xy.y );
setcolor(14);
cout << obj;
}
}
else if(aspect == 'a')
{
if(nowPos.y > 0)
{
gotoxy(chessboard[nowPos.x][nowPos.y].xy.x, chessboard[nowPos.x][nowPos.y].xy.y );
if(chessboard[nowPos.x][nowPos.y].type == 0)
cout << " ";
else if(chessboard[nowPos.x][nowPos.y].type == 1)
cout << "√";
else if(chessboard[nowPos.x][nowPos.y].type == 2)
cout << "×";
gotoxy(chessboard[nowPos.x][nowPos.y].xy.x, chessboard[nowPos.x][--nowPos.y].xy.y );
setcolor(14);
cout << obj;
}
}
else if(aspect == 'd')
{
if(nowPos.y < 2)
{
gotoxy(chessboard[nowPos.x][nowPos.y].xy.x, chessboard[nowPos.x][nowPos.y].xy.y );
if(chessboard[nowPos.x][nowPos.y].type == 0)
cout << " ";
else if(chessboard[nowPos.x][nowPos.y].type == 1)
cout << "√";
else if(chessboard[nowPos.x][nowPos.y].type == 2)
cout << "×";
gotoxy(chessboard[nowPos.x][nowPos.y].xy.x, chessboard[nowPos.x][++nowPos.y].xy.y );
setcolor(14);
cout << obj;
}
}
}
BOOL estimate(POINT pos, int x) // 判断有没有赢,这里使用没有技术含量的搞法
{
if(chessboard[0][0].type == x && chessboard[0][1].type == x && chessboard[0][2].type == x) return TRUE;
if(chessboard[1][0].type == x && chessboard[1][1].type == x && chessboard[1][2].type == x) return TRUE;
if(chessboard[2][0].type == x && chessboard[2][1].type == x && chessboard[2][2].type == x) return TRUE;
if(chessboard[0][0].type == x && chessboard[1][0].type == x && chessboard[2][0].type == x) return TRUE;
if(chessboard[0][1].type == x && chessboard[1][1].type == x && chessboard[2][1].type == x) return TRUE;
if(chessboard[0][2].type == x && chessboard[1][2].type == x && chessboard[2][2].type == x) return TRUE;
if(chessboard[0][0].type == x && chessboard[1][1].type == x && chessboard[2][2].type == x) return TRUE;
if(chessboard[0][2].type == x && chessboard[1][1].type == x && chessboard[2][0].type == x) return TRUE;
return FALSE;
} |
-
界面
|