游戏规则:同一横竖或斜线如果为同一符号,即可获胜。
游戏结果:任意一方获胜或平局。
首先游戏的流程:
@选择菜单@
1.初始化棋盘
2.默认电脑先走
@展示棋盘@
3.判断是否连成三子或平局
4.玩家走
@展示棋盘@
5.判断是否连成三子或平局
@游戏结束进入选择菜单@
开始代码编辑
1.首先创建一个main.c的文件,写一个菜单函数
int menu()//这里返回值是整形
{
int choose = 0;
srand((unsigned)time(NULL));//随机数生成
printf("---------------------\n");
printf("------1.开始游戏-----\n");
printf("------0.退出游戏-----\n");
printf("---------------------\n");
scanf("%d", &choose);
return choose;
}
2.在主函数里完成基本流程控制
int main()
{
int choose = 0;
char arr[ROW][COL];
do
{
choose = menu();
switch (choose)
{
case 1:
game(arr);
break;
case 0:
break;
default:
break;
}
} while (choose);
system("pause");
return 0;
}
3.游戏函数game();
void game(char arr[ROW][COL])
{
printf("\n开始游戏\n");
init(arr);
char ret;
do
{
computer(arr);
show(arr);
iswin(arr);
ret = iswin(arr);
if (ret == 'X')
{
printf("电脑赢\n");
break;
}
else if (ret == 'O')//注意要用else if
{
printf("你赢\n");
break;
}
else if (ret == 'F')
{
printf("平局\n");
break;
}
player(arr);
show(arr);
ret = iswin(arr);
if (ret == 'X')
{
printf("电脑赢\n");
break;
}
else if (ret == 'O')
{
printf("你赢\n");
break;
}
} while (1);
}
4.以上需要的头文件和其他
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include"three.h"
#include<time.h>
5.新建的three.h头文件写出了我们需要的各种方法
#pragma once
#ifndef __THREE_H__
#define __THREE_H__
#define ROW 3
#define COL 3
void init(char arr[ROW][COL]);//初始化棋盘
void show(char arr[ROW][COL]);//展示目前的棋盘状态
void computer(char arr[ROW][COL]);//电脑下子
void player(char arr[ROW][COL]);//玩家下子
char iswin(char arr[ROW][COL]);//判断输赢和平局
#endif
6.新建的three.c文件里具体实现了three.h里面的函数方法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include"three.h"
void init(char arr[ROW][COL])//初始化
{
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
arr[i][j] = ' ';//空格表示没有下子
}
}
}
void show(char arr[ROW][COL])//展示目前棋盘
{
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
printf("------------\n");
for (j = 0; j < COL; j++)
{
printf("%2c |", arr[i][j]);
}
printf("\n");
}
printf("------------\n");
}
void computer(char arr[ROW][COL])
{
printf("电脑下子:\n");
do
{
int i = rand() % 3;//随机化坐标
int j = rand() % 3;
if (arr[i][j] == ' ')//判断条件:有空格才可以下子
{
arr[i][j] = 'X';
break;
}
} while (1);
}
void player(char arr[ROW][COL])
{
int x = 0;
int y = 0;
do
{
printf("请输入坐标:>");
scanf("%d%d", &x, &y);
x -= 1;
y -= 1;
if (arr[x][y] == ' ')
{
arr[x][y] = 'O';
break;
}
else
{
printf("您输入的坐标位置非法!请重新输入!");
}
} while (1);
}
char iswin(char arr[ROW][COL])
{
int i = 0;
int j = 0;
for (j = 0; j < COL; j++)
{
//竖列相同
if (
(arr[0][j] == arr[1][j]) && (arr[1][j] == arr[2][j])
)
{
if (arr[0][j] == 'X')//只要有一个是X,说明是电脑
{
return 'X';
}
if (arr[0][j] == 'O')
{
return 'O';
}
}
//行相同
if (
(arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2])
)
{
if (arr[i][0] == 'X')
{
return 'X';
}
if (arr[i][0] == 'O')
{
return 'O';
}
}
//对角线相同,左上到右下
if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]))
{
if (arr[0][0] == 'X')
{
return 'X';
}
if (arr[0][0] == 'O')
{
return 'O';
}
}
//右上到左下对角线相同
if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]))
{
if (arr[0][2] == 'X')
{
return 'X';
}
if (arr[0][2] == 'O')
{
return 'O';
}
}
}
//判断是否平局,遍历全部元素
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (arr[i][j] == ' ')//只要出现空格,说明没有平局,随便返回一个字符
{
return 'a';
}
}
}
return 'F';//说明平局了,主函数里的判断条件会用到这个返回值
}