鱼C论坛

 找回密码
 立即注册
查看: 2131|回复: 2

[技术交流] 一个简单的 井字棋 小游戏

[复制链接]
发表于 2018-5-29 20:58:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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;
}

界面

界面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-29 21:14:28 | 显示全部楼层
有兴趣
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-30 18:22:41 | 显示全部楼层
6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-29 22:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表