helloxiaoc 发表于 2018-5-29 20:58:16

一个简单的 井字棋 小游戏

这个程序比较适合新手培养编程兴趣,程序比较简单,主要是坐标的跳转,代码比较乱,去掉改变颜色的函数可能会好很多!

static/image/hrline/man.gif

首先用一个数组来存放每个棋子的坐标
struct // 存棋盘坐标以及是否有棋子类型,0为无棋,1为叉叉,二为勾勾
{
        POINT xy;
        int type;
}chessboard = { // 给他们一个坐标 && 和初值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 = { // 我们画一个棋盘
        "┃┃",
        "━╋━╋━",
        "┃┃",
        "━╋━╋━",
        "┃┃"
};
接下来定义几个全局变量
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.type = 0;

using namespace std;

struct // 存棋盘坐标以及是否有棋子类型,0为无棋,1为叉叉,二为勾勾
{
        POINT xy;
        int type;
}chessboard = { // 给他们一个坐标 && 和初值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 = { // 我们画一个棋盘
        "┃┃",
        "━╋━╋━",
        "┃┃",
        "━╋━╋━",
        "┃┃"
};

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.type == 0) // 首先判断这个位置有没有棋子
                        {
                                chessboard.type = (now ? 1:2); // 如果没有棋子,把该点打上标记
                                gotoxy(chessboard.xy.x, chessboard.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 << "\n";
        gotoxy(7,15);cout << map << "\n";
        gotoxy(8,15);cout << map << "\n";
        gotoxy(9,15);cout << map << "\n";
        gotoxy(10,15);cout << map << "\n";
       
        gotoxy(chessboard.xy.x, chessboard.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.xy.x, chessboard.xy.y );
                        if(chessboard.type == 0)
                        cout << " ";
                        else if(chessboard.type == 1)
                        cout << "√";
                        else if(chessboard.type == 2)
                        cout << "×";
                        gotoxy(chessboard[--nowPos.x].xy.x, chessboard.xy.y );
                        setcolor(14);
                        cout << obj;
                }
        }
        else if(aspect == 's')
        {
                if(nowPos.x < 2)
                {
                        gotoxy(chessboard.xy.x, chessboard.xy.y );
                        if(chessboard.type == 0)
                        cout << " ";
                        else if(chessboard.type == 1)
                        cout << "√";
                        else if(chessboard.type == 2)
                        cout << "×";
                        gotoxy(chessboard[++nowPos.x].xy.x, chessboard.xy.y );
                        setcolor(14);
                        cout << obj;
                }
        }
        else if(aspect == 'a')
        {
                if(nowPos.y > 0)
                {
                        gotoxy(chessboard.xy.x, chessboard.xy.y );
                        if(chessboard.type == 0)
                        cout << " ";
                        else if(chessboard.type == 1)
                        cout << "√";
                        else if(chessboard.type == 2)
                        cout << "×";
                        gotoxy(chessboard.xy.x, chessboard[--nowPos.y].xy.y );
                        setcolor(14);
                        cout << obj;
                }
        }
        else if(aspect == 'd')
        {
                if(nowPos.y < 2)
                {
                        gotoxy(chessboard.xy.x, chessboard.xy.y );
                        if(chessboard.type == 0)
                        cout << " ";
                        else if(chessboard.type == 1)
                        cout << "√";
                        else if(chessboard.type == 2)
                        cout << "×";
                        gotoxy(chessboard.xy.x, chessboard[++nowPos.y].xy.y );
                        setcolor(14);
                        cout << obj;
                }
        }
}

BOOL estimate(POINT pos, int x) // 判断有没有赢,这里使用没有技术含量的搞法
{
        if(chessboard.type == x && chessboard.type == x && chessboard.type == x) return TRUE;
        if(chessboard.type == x && chessboard.type == x && chessboard.type == x) return TRUE;
        if(chessboard.type == x && chessboard.type == x && chessboard.type == x) return TRUE;
       
        if(chessboard.type == x && chessboard.type == x && chessboard.type == x) return TRUE;
        if(chessboard.type == x && chessboard.type == x && chessboard.type == x) return TRUE;
        if(chessboard.type == x && chessboard.type == x && chessboard.type == x) return TRUE;
       
        if(chessboard.type == x && chessboard.type == x && chessboard.type == x) return TRUE;
        if(chessboard.type == x && chessboard.type == x && chessboard.type == x) return TRUE;
       
        return FALSE;
}

caoliang@524 发表于 2018-5-29 21:14:28

有兴趣

mr_chen_ 发表于 2018-5-30 18:22:41

6
页: [1]
查看完整版本: 一个简单的 井字棋 小游戏