代码在一个项目里完成,分成三个.c.h文件(game.c,game.h,main.c)
在Clion软件中通过运行调试。
//main.c
//#include<stdio.h>
//#include<stdlib.h>
//#include<time.h>
#include"game.h"
// 显示菜单
void menu(){
printf("*********1.game***0.退出*********\n");
printf("*********输入数字进行选择***********\n");
}
//游戏核心
void game() {
char array[ROW][COL] = {0};
char judge =0;
//初始化棋盘
Init(array, ROW, COL);
//显示棋盘
display(array, ROW, COL);
//落子
while (1) {
//玩家下棋
Play_game(array, ROW, COL);
//显示
display(array, ROW, COL);
//判断输赢
judge = Judge_end(array, ROW, COL);
if (judge != ' ')
break;
//电脑落子
Computer_play(array, ROW, COL);
//显示
display(array, ROW, COL);
//判断输赢
judge = Judge_end(array, ROW, COL);
if (judge != ' ')
break;
}
if (judge == '*')
printf("玩家赢\n");
else if (judge == '#')
printf("电脑赢\n");
else
printf("平局\n");
}
int main()
{
setbuf(stdout,NULL);
int number=0;
srand((unsigned int )time(NULL));//由时间戳生产电脑的随机坐标值
do{
menu();
scanf("%d",&number);
getchar();
switch(number)
{
case 1:
game();
break;
case 0:
printf("正在退出\n");
break;
default:
printf("选择错误,重新输入\n");
break;
}
}while(number);
}
//game.c
#include"game.h"
void Init(char array[][COL],int row,int col){
//棋盘初始化为空白
for(int x=0;x<ROW;x++){
for(int y=0;y<ROW;y++){
array[x][y]=' ';
}
}
}
// | |
//---|---|---
// | |
//---|---|---
// | |
//显示初始化棋盘
void display(char array[][COL],int row,int col){
for(int x=0;x<row;x++){
for(int y=0;y<col;y++){
printf(" %c ",array[x][y]);
if(y<col-1)
printf("|");
}
printf("\n");
for(int y=0;y<col;y++){
if(x<row-1)
printf("---");
if(y<col-1&&x<row-1)
printf("|");
}
printf("\n");
}
}
// 玩家输入坐标
void Play_game(char array[][COL],int row,int col){
int x=0;
int y=0;
char arr[5]="\0";
printf("玩家输入落子坐标值(x,y):\n");
while(1) {
//将玩家输入信息当作字符处理,只要用户输入信息格式为1.1或1-1等都可,只要确保第一个字符和第三个字符正确
gets(arr);
x=arr[0]-'0';
y=arr[2]-'0';
//坐标有效
if((x>=1&&x<=row)&&(y>=1&&y<=col))
{
if (array[x - 1][y - 1] == ' ') {
array[x - 1][y - 1] = '*';
break;
}
else
printf("此坐标已有子,请重新输入\n");
}
else
printf("坐标无效,请重新输入\n");
}
}
// 电脑随机函数生成电脑落子坐标
void Computer_play(char array[][COL],int row,int col){
int x=0;
int y=0;
printf("电脑落子:\n");
while(1) {
x=rand()%row;//和main函数里的时间戳一起生成随机坐标
y=rand()%col;
if (array[x][y] == ' '){
array[x][y] = '#';
break;
}
}
}
//玩家赢
//电脑赢
//平局
//棋盘未满
//判断电脑的输赢 基本就是判断玩家输赢代码复制了一份 由*改成了#
char Judge_end(char array[][COL],int row,int col) {
int x = 0, y = 0;
int flag = 0, temp = 0;
//行列采用1& 假如每行/每列都是*/# 最后结果就是1
//对角线判断规则是:是想要的*/# 次数++ 最后看次数是不是对角线长度
//玩家
//行
for (x = 0; x < row; x++) {
flag = 1;
for (y = 0; y < col; y++) {
if (array[x][y] == '*')
flag &= 1;
else
flag &= 0;
}
if (flag == 1) {
printf("①玩家行规则\n");
return '*';
}
}
//列
for (x = 0; x < col; x++) {
flag = 1;
for (y = 0; y < row; y++) {
if (array[y][x] == '*')
flag &= 1;
else
flag &= 0;
}
if (flag == 1) {
printf("②玩家列规则\n");
return '*';
}
}
//左对角线
flag = 0;
for (x = 0; x < row; x++) {
for (y = 0; y < col; y++) {
if ((array[x][y] == '*')&&(x == y))
flag ++;
}
}
if (flag == row) {
printf("③玩家左对角线规则\n");
return '*';//左对角线
}
//右对角线
flag = 0;
for (x = row - 1; x >= 0; x--) {
for (y = 0; y < col; y++) {
if ((array[x][y] == '*')&&((x + y) == (row-1)))
flag ++;
}
}
if (flag == row) {
printf("④玩家右对角线规则\n");
return '*';//右对角线
}
//电脑
//行
for (x = 0; x < row; x++) {
temp = 1;
for (y = 0; y < col; y++) {
if (array[x][y] == '#')
temp &= 1;
else
temp &= 0;
}
if (temp == 1) {
printf("①电脑行规则\n");
return '#';
}
}
//列
for (x = 0; x < col; x++) {
temp = 1;
for (y = 0; y < row; y++) {
if (array[y][x] == '#')
temp &= 1;
else
temp &= 0;
}
if (temp == 1) {
printf("②电脑列规则\n");
return '#';
}
}
//左对角线
temp = 0;
for (x = 0; x < row; x++) {
for (y = 0; y < col; y++) {
if ((array[x][y] == '#')&&(x == y))
temp++;
}
}
if (temp == row) {
printf("③电脑左对角线规则\n");
return '#';//左对角线
}
//右对角线
temp = 0;
for (x = row - 1; x >= 0; x--) {
for (y = 0; y < col; y++) {
if ((array[x][y] == '#')&&((x + y) == (row-1)))
temp ++;
}
}
if (temp == row) {
printf("④电脑右对角线规则\n");
return '#';//右对角线
}
//棋盘未满
for (x = 0; x < row; x++) {
for (y = 0; y < col; y++) {
if (array[x][y] == ' ')
return ' ';
}
}
//平局
return 'r';
}
//game.h
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 4//棋盘行数字可改
#define COL 4//棋盘列数字可改
#ifndef TEXT1_GAME_H
#define TEXT1_GAME_H
//初始化棋盘
void Init(char array[][COL],int row,int col);
//显示
void display(char array[][COL],int row,int col);
//玩家输入坐标
void Play_game(char array[][COL],int row,int col);
//电脑随机坐标
void Computer_play(char array[][COL],int row,int col);
//判断输赢
char Judge_end(char array[][COL],int row,int col);
#endif
//TEXT1_GAME_H