思路:首先在test文件把放main函数用于初始化游戏界面,然后在game.c中实现玩家下棋棋盘打印,电脑下棋,对连续和不连续的下棋方式进行堵住,包括对角线,但是game.h文件中我比较懒,函数声明放得比较少,各位参考的时候可以看情况添加进去。(c表示继续C表示平局*有人赢了,#表示输了,但是在判断是不是快赢了那个函数调用只是单纯用来凑数,分别代表列行对角线有要赢了)
game.h
#pragma once
#include <stdio.h>
#define ROW 3
#define COL 3
#include <time.h>
void menu();
void print(char board[ROW][COL]);
void game();
void change(char board[ROW][COL]);
game.c
#include "game.h"
void menu() {
printf("----------------------\n");
printf("-----1.play 0.exit----\n");
printf("----------------------\n");
}
void print(char board[ROW][COL]) {//打印棋盘
int i = 0, j = 0;
for (j = 0; j < COL; j++) {
for (i = 0; i < ROW; i++) {
printf(" %c ", board[j][i]);
if (i < ROW - 1)
printf("|");
}printf("\n");
if (j < COL - 1) {
for (i = 0; i < ROW; i++) {
printf("---");
if (i < ROW - 1)
printf("|");
}printf("\n");
}
}
printf("\n");
}
void change(char board[ROW][COL]) {//让棋盘的元素都成为空格
int i = 0, j = 0;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
board[i][j] = ' ';
}
}
}
void player(char board[ROW][COL]) {//玩家下棋
printf("玩家下棋\n");
while (1) {
int x = 0, y = 0;
scanf("%d %d", &x, &y);
if (x > ROW || x < 0 || y>COL || y < 0) {
printf("输入有误,请重新输入\n");
continue;
}
if (board[x - 1][y - 1] == ' ') {
board[x - 1][y - 1] = '*';
print(board);
break;
}
else
printf("该位置已经填入东西,错误");
}
}
char ifwink(char board[ROW][COL]) {//判断是不是快赢了
int i = 0, j = 0;
int cnt = 0;
for (j = 0; j < COL; j++) {
cnt = 0;
for (i = 0; i < ROW - 1; i++) {//判断列
if (board[i][j] == board[i + 1][j] && board[i][j] == '*') {//判断连续
cnt++;
}if (i <= ROW - 3 && board[i + 1][j] == ' ' && board[i][j] == board[i + 2][j]&&board[i][j]!=' ') {//这个是用于判断非连续
cnt++;
}
if (cnt == ROW - 2)
return '*';
}
}
for (i = 0; i < ROW; i++) {//判断行
cnt = 0;
for (j = 0; j < COL - 1; j++) {
if (board[i][j] == board[i][j + 1] && board[i][j] == '*')
cnt++;
if (j <= ROW - 3 && board[i ][j+1] == ' ' && board[i][j] == board[i][j+2] && board[i][j] != ' ') {
cnt++;
}
if (cnt == ROW - 2)
return '#';
}
}
for (i = 0, cnt = 0; i < ROW - 1; i++) {//判断正对角线
if (board[i][i] == board[i + 1][i + 1] && board[i][i] == '*')
cnt++;
if (i <= ROW - 3 && board[i+1][i+1] == ' ' && board[i][i] == board[i+2][i+2] && board[i][i] != ' ') {
cnt++;
}
if (cnt == ROW - 2)
return '&';
}for (i = 0, cnt = 0; i < ROW - 1; i++) {//判断反对角线
if (board[i][ROW - i - 1] == board[i + 1][ROW - i - 2] && board[i][ROW - i - 1] == '*')
cnt++;
if (i <= ROW - 3 && board[i+1][ROW-i-2] == ' ' && board[i][ROW-i-1] == board[i + 2][ROW-i-3] && board[i][ROW-i-1] != ' ') {
cnt++;
}
if (cnt == ROW - 2)
return 'v';
}
return 'c';
}
void computer(char board[ROW][COL]) {//电脑下棋
printf("电脑下棋\n");
int ret = 1;
if (ifwink(board) == '*') {
int i = 0, j = 0;
int cnt = 0;
int biaozhi = 0;
for (j = 0; j < ROW;j++) {//用于找到空格去填
cnt = 0;
for (i = 0; i < COL - 1; i++) {
if (board[i+1][j] == board[i][j ] && board[i][j] == '*')
cnt++;
if (i <= ROW - 3 && board[i + 1][j] == ' ' && board[i][j] == board[i + 2][j] && board[i][j] != ' ')
cnt++;
if (cnt == ROW - 2) {
biaozhi = 1;
break;
}
}for (i = 0; i < COL; i++) {
if (board[i][j] ==' '&&biaozhi) {
board[i][j] = '#';
ret = 0;
print(board);
goto chukou2;
}
}
}
}chukou2:
if (ifwink(board) == '#') {
int i = 0, j = 0;
int cnt = 0;
int biaozhi = 0;
for (i= 0; i < ROW; i++) {
cnt = 0;
for (j = 0;j < COL - 1; j++) {
if (board[i][j] == board[i ][j+1] && board[i][j] == '*')
cnt++;
if (j <= ROW - 3 && board[i][j + 1] == ' ' && board[i][j] == board[i][j + 2] && board[i][j] != ' ') {
cnt++;
}
if (cnt == ROW - 2) {
biaozhi = 1;
break;
}
}
for (j = 0; j < COL ; j++) {
if (board[i][j] == ' '&&biaozhi) {
board[i][j] = '#';
ret = 0;
print(board);
goto chukou1;
}
}
}
}chukou1:
if (ifwink(board) == '&') {
int i = 0, j = 0;
int cnt = 0;
int biaozhi = 0;
for (i = 0, cnt = 0; i < ROW - 1; i++) {
if (board[i][i] == board[i + 1][i + 1] && board[i][i] == '*')
cnt++;
if (i <= ROW - 3 && board[i + 1][i + 1] == ' ' && board[i][i] == board[i+2][i + 2] && board[i][i] != ' ') {
cnt++;
}
if (cnt == ROW - 2)
biaozhi = 1;
}
for (i = 0; i < ROW; i++) {
if (board[i][i] == ' '&&biaozhi) {
board[i][i] = '#';
print(board);
ret = 0;
break;
}
}
}
if (ifwink(board) == 'v') {
int i = 0;
int cnt = 0;
int biaozhi = 0;
for (i = 0, cnt = 0; i < ROW - 1; i++) {
if (board[i][ROW - i - 1] == board[i + 1][ROW - i - 2] && board[i][ROW - i - 1] == '*')
cnt++;
if (i <= ROW - 3 && board[i + 1][ROW - i - 2] == ' ' && board[i][ROW - i - 1] == board[i + 2][ROW - i - 3] && board[i][ROW - i - 1] != ' ') {
cnt++;
}if (cnt == ROW - 2)
biaozhi = 1;
}for (i = 0; i < ROW; i++) {
if (board[i][ROW-i-1] == ' ' && biaozhi) {
board[i][ROW-i-1] = '#';
print(board);
ret = 0;
break;
}
}
}
while (ret) {//如果前面都没有特殊情况的话就会随机填
int x = rand() % 3;
int y = rand() % 3;
if (board[x][y] == ' ') {
board[x][y] = '#';
print(board);
break;
}
}
}
char ifwin(char board[ROW][COL]){//判断玩家是否赢了
int i = 0, j = 0;
int cnt = 0;
for (j = 0; j < COL; j++) {
cnt = 0;
for (i = 0; i < ROW - 1; i++) {
if (board[i][j] == board[i + 1][j] && board[i][j] == '*')
cnt++;
if (cnt == ROW - 1)
return '*';
}
}
for (i = 0; i < ROW; i++) {
cnt = 0;
for (j = 0; j < COL - 1; j++) {
if (board[i][j] == board[i][j + 1] && board[i][j] == '*')
cnt++;
if (cnt == ROW - 1)
return '*';
}
}
for (i = 0, cnt = 0; i < ROW - 1; i++) {
if (board[i][i] == board[i + 1][i + 1] && board[i][i] == '*')
cnt++;
if (cnt == ROW - 1)
return '*';
}
for (i = 0, cnt = 0; i < ROW - 1; i++) {
if (board[i][ROW - i - 1] == board[i + 1][ROW - i - 2] && board[i][ROW - i - 1] == '*')
cnt++;
if (cnt == ROW - 1)
return '*';
}
return 'c';
}
char iffail(char board[ROW][COL]) {//判断电脑是不是赢了
int i = 0, j = 0;
int cnt = 0;
for (j = 0; j < COL; j++) {
cnt = 0;
for (i = 0; i < ROW - 1; i++) {
if (board[i][j] == board[i + 1][j] && board[i][j] == '#')
cnt++;
if (cnt == ROW - 1)
return '#';
}
}
for (i = 0; i < ROW; i++) {
cnt = 0;
for (j = 0; j < COL - 1; j++) {
if (board[i][j] == board[i][j + 1] && board[i][j] == '#')
cnt++;
if (cnt == ROW - 1)
return '#';
}
}
for (i = 0, cnt = 0; i < ROW - 1; i++) {
if (board[i][i] == board[i + 1][i + 1] && board[i][i] == '#')
cnt++;
if (cnt == ROW - 1)
return '#';
}
for (i = 0, cnt = 0; i < ROW - 1; i++) {
if (board[i][ROW - i-1] == board[i+1][ROW-i-2] && board[i][ROW-i-1] == '#')
cnt++;
if (cnt == ROW - 1)
return '#';
}
return 'c';
}
char goon(char board[ROW][COL]) {//判断有没有平局
int i = 0, j = 0;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (board[i][j] == ' ')
return 'c';
}
}
return 'C';
}
void gameing(char board[ROW][COL]) {//真正的游戏算法
int ret = 'c';
while (ret == 'c') {
player(board);
ret = ifwin(board);
if (ret == '*') {
printf("玩家赢了\n");
print(board);
break;
}
computer(board);
ret = iffail(board);
if (ret == '#') {
printf("电脑赢了\n");
print(board);
break;
}
ret = goon(board);
if (ret == 'C') {
printf("平局\n");
print(board);
break;
}
}
}
void game() {//游戏数据初始化
char board[ROW][COL] = { 0 };
change(board);
print(board);
gameing(board);
}
tese.c
#include "game.h"
int main() {
srand((unsigned int)time(NULL));
int input = 1;
while (input) {
menu();
scanf("%d", &input);
switch (input) {
case 1:
game();
break;
case 0:
break;
default:
printf("您的输入有误");
}
}
}