头文件:
(tip:可以改define定义的ROW和COL的值来改变三子棋的为多字棋)
#pragma once
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
//菜单函数
void menu();
//游戏内核
void game();
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//判断下棋先后
void panduanNextOrLast(char board[ROW][COL],char* flag, int fl, char* me, char* you,char * ch,char * cch,int * dian);
//输入坐标
void inputXY(char borad[ROW][COL], int row, int col, char* ch);
//电脑下棋
void computerinputXY(char board[ROW][COL], int row, int col, char* cch);
//判断胜负
void juesheng(char board[ROW][COL], int row, int col, char* ch, char* cch,int * jue);
游戏核心源码:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//初始化棋盘函数
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; ++i)
{
int j = 0;
for (j = 0; j < col; ++j)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
//打印头边分隔线
int k = 0;
for (k = 0; k < col; ++k)
{
if (k != col - 1)
printf(" ___");
else
printf(" ___ \n");
}
//打印数据和随之以下的分隔线
int i = 0;
for (i = 0; i < row; ++i)
{
//打印数据
int j = 0;
for (j = 0; j < col; ++j)
{
if (j != col - 1)
printf("| %c ", board[i][j]);
else
printf("| %c |\n", board[i][j]);
}
//打印随之以下分隔行
int l = 0;
for (l = 0; l < col; ++l)
{
if (l != col - 1)
printf("|___");
else
printf("|___|\n");
}
}
}
//判断下棋先后
void panduanNextOrLast(char board[ROW][COL], char flag[], int fl, char* me, char* you, char* ch, char* cch, int* dian)
{
if ((0 != strcmp(flag, "me")) && (0 != strcmp(flag, "you")))
{
int inputagain = 1;
while (inputagain == 1)
{
inputagain = 0;
while (getchar() != '\n');
printf("谁先下棋(me or you):>");
scanf("%s", flag);
if ((0 != strcmp(flag, "me")) && (0 != strcmp(flag, "you")))
{
printf("输入错误,请重新输入!\n");
inputagain = 1;
}
}
}
else
{
return;
}
if (0 == strcmp(flag, "me"))
{
*ch = *me;
*cch = *you;
*dian = 0;
}
else if (0 == strcmp(flag, "you"))
{
*ch = *me;
*cch = *you;
*dian = 1;
}
//刷新棋盘
DisplayBoard(board, ROW, COL);
}
//玩家输入坐标下棋
void inputXY(char board[ROW][COL], int row, int col, char* ch)
{
//创建并初始化输入坐标
int x = -1;
int y = -1;
int k = 1;
while (1)
{
while (getchar() != '\n');
k = 0;
printf("玩家下棋——输入坐标(x,y):>");
scanf("%d %d", &x, &y);
//换算成数组下标的形式
x--;
y--;
//坐标合法性判断之后再写入
if (row > x && x >= 0 && col > y && y >= 0)
{
if (board[x][y] == ' ')
{
board[x][y] = *ch;
}
else
{
printf("输入错误,请重新输入\n");
//再次初始化输入坐标
x = -1;
y = -1;
k = 1;
DisplayBoard(board, ROW, COL);
}
}
else
{
printf("输入错误,请重新输入\n");
//再次初始化输入坐标
x = -1;
y = -1;
k = 1;
DisplayBoard(board, ROW, COL);
}
if (k == 0)
break;
}
//再次初始化输入坐标
x = -1;
y = -1;
//刷新一下棋盘
DisplayBoard(board, ROW, COL);
}
//电脑下棋
void computerinputXY(char board[ROW][COL], int row, int col, char* cch)
{
printf("电脑下棋:>\n");
//创建临时变量做电脑下棋的坐标
int x = -1;
int y = -1;
while (1)
{
//控制电脑下棋的坐标范围
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = *cch;
break;
}
}
//初始化电脑坐标
x = -1;
y = -1;
//刷新一下棋盘
DisplayBoard(board, ROW, COL);
}
//判断胜负
void juesheng(char board[ROW][COL], int row, int col, char* ch, char* cch, int* jue)
{
//横向
if (*jue == 0) {
int xsuoyin = -1;
int shen = 0;
int i = 0;
for (i = 0; i < ROW; ++i)
{
if (board[i][0] != ' ')
{
int j = 0;
for (j = 0; j < ROW - 1; ++j)
{
if (board[i][j] != board[i][j + 1])
{
shen = 1;
break;
}
}
if (shen == 0)
{
xsuoyin = i;
break;
}
}
}
if (shen == 0 && xsuoyin != -1)
{
if (board[xsuoyin][0] == *ch)
{
*jue = 2;
return;
}
if (board[xsuoyin][0] == *cch)
{
*jue = 3;
return;
}
}
}
//纵向
if (*jue == 0)
{
int ysuoyin = -1;
int shen = 0;
int i = 0;
for (i = 0; i < row; ++i)
{
if (board[0][i] != ' ')
{
int j = 0;
for (j = 0; j < ROW - 1; ++j)
{
if (board[j][i] != board[j + 1][i])
{
shen = 1;
break;
}
}
if (shen == 0)
{
ysuoyin = i;
break;
}
}
}
if (shen == 0 && ysuoyin != -1)
{
if (board[0][ysuoyin] == *ch)
{
*jue = 2;
return;
}
if (board[0][ysuoyin] == *cch)
{
*jue = 3;
return;
}
}
}
//左斜方
if (*jue == 0)
{
if (board[0][0] != ' ')
{
int k = 0;
int i = 0;
for (i = 0; i < ROW - 1; ++i)
{
if (board[i][i] != board[i + 1][i + 1])
{
k = 1;
break;
}
}
if (k != 1)
{
if (board[0][0] == *ch)
{
*jue = 2;
return;
}
if (board[0][0] == *cch)
{
*jue = 3;
return;
}
}
}
}
//右斜方
if (*jue == 0)
{
if (board[0][COL - 1] != ' ')
{
int k = 0;
int i = 0;
for (i = 0; i < ROW - 1; ++i)
{
if (board[i][ROW - i - 1] != board[i + 1][ROW - i - 2])
{
k = 1;
break;
}
}
if (k != 1)
{
if (board[0][COL - 1] == *ch)
{
*jue = 2;
return;
}
if (board[0][COL - 1] == *cch)
{
*jue = 3;
return;
}
}
}
}
//平局
if (*jue == 0)
{
int t = 0;
for (t = 0; t < ROW; ++t)
{
int j = 0;
for (j = 0; j < COL; ++j)
{
if (board[t][j] == ' ')
return;
}
}
*jue = 1;
}
}
//游戏内核
void game()
{
//图案
char me = 'X';
char you = '#';
//棋盘数组
char board[ROW][COL];
//初始化棋盘
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
//输入的先后的数组存储
char flag[5];
int fllength = strlen(flag);
char ch = 0;
char cch = 0;
int dian = 0;//选择先后的int数值0为玩家先,1为电脑先
//判断胜负的变量
int jue = 0;
//输入坐标
while (1)
{
panduanNextOrLast(board, &flag, fllength, &me, &you, &ch, &cch, &dian);
if (dian == 0)
{
inputXY(board, ROW, COL, &ch);//玩家下棋
juesheng(board, ROW, COL, &ch, &cch, &jue);//判断胜负
//得出结果并输出
if (jue != 0)
{
if (jue == 1)
{
printf("平局\n");
}
if (jue == 2)
{
printf("玩家胜!\n");
}
if (jue == 3)
{
printf("电脑胜!\n");
}
printf("游戏结束!\n");
return;
}
computerinputXY(board, ROW, COL, &cch);//电脑下棋
juesheng(board, ROW, COL, &ch, &cch, &jue);//判断胜负
//得出结果并输出
if (jue != 0)
{
if (jue == 1)
{
printf("平局\n");
}
if (jue == 2)
{
printf("玩家胜!\n");
}
if (jue == 3)
{
printf("电脑胜!\n");
}
printf("游戏结束!\n");
return;
}
}
if (dian == 1)
{
computerinputXY(board, ROW, COL, &cch);//电脑下棋
juesheng(board, ROW, COL, &ch, &cch, &jue);//判断胜负
//得出结果并输出
if (jue != 0)
{
if (jue == 1)
{
printf("平局\n");
}
if (jue == 2)
{
printf("玩家胜!\n");
}
if (jue == 3)
{
printf("电脑胜!\n");
}
printf("游戏结束!\n");
return;
}
inputXY(board, ROW, COL, &ch);//玩家下棋
juesheng(board, ROW, COL, &ch, &cch, &jue);//判断胜负
//得出结果并输出
if (jue != 0)
{
if (jue == 1)
{
printf("平局\n");
}
if (jue == 2)
{
printf("玩家胜!\n");
}
if (jue == 3)
{
printf("电脑胜!\n");
}
printf("游戏结束!\n");
return;
}
}
}
}
//菜单函数
void menu()
{
printf("********************\n");
printf("*******1.play*******\n");
printf("*******2.exit*******\n");
printf("********************\n");
}
游戏运行入口测试代码:
#define _CRT_SECURE_NO_WARNINGS
/*
* 利用数组名
*/
#include "game.h"
//游戏流程
int main()
{
srand((unsigned int)time(NULL));//设置随机数的生成起点
int input = 0;
do
{
menu();//打印菜单
printf("请先选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("三子棋:\n");
game();
printf("____________________\n");
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
(以上就是三字棋的黑色命令符窗口的游戏代码)