首页 > 其他分享 >三子棋(C语言版)

三子棋(C语言版)

时间:2022-11-10 13:00:50浏览次数:38  
标签:int 三子 C语言 board printf row COL ROW

1:>函数定义

game.h

#define _CRT_SECURE_NO_WARNINGS 1

#define ROW 3
#define COL 3

#include <stdio.h>
#include<stdlib.h>
#include<time.h>

//头文件中声明函数
//
//初始化棋盘
void init_board(char board[ROW][COL], int row, int col);

//打印棋盘
void print_board(char board[ROW][COL], int row, int col);

//玩家下棋
void player_move(char board[ROW][COL], int row, int col);

//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);

//判断输赢的函数
char is_win(char board[ROW][COL], int row, int col);

2:>游戏测试

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"
void menu( )
{
printf("**********************\n");
printf("***** 1.play *******\n");
printf("***** 0.eixt *******\n");
printf("**********************\n");
}
void game()
{
char board[ROW][COL];
char ret = 0;
//初始化一下棋盘全空格
init_board(board,ROW ,COL);
print_board(board, ROW, COL);

while (1)
{
player_move(board, ROW, COL);
print_board(board, ROW, COL);
//判断输赢
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
computer_move(board, ROW, COL);
print_board(board, ROW, COL);
//判断输赢
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '#')
printf("电脑赢了\n");
else if (ret == '*')
printf("玩家赢了\n");
else if (ret == 'Q')
printf("平局\n");

}

//判断输赢
//判断输赢的代码要告诉我: 电脑赢了?玩家赢了?平局?游戏继续?
//电脑赢了:#
//玩家赢了:*
//平局:Q
//游戏继续:C
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
}
int main()
{
test( );
return 0;
}

3:>游戏实现

game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void init_board(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 print_board(char board[ROW][COL], int row, int col)
//{
// int i = 0;
// for (i = 0; i < row; i++)
// {
// printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
// if(i<row-1)
// printf("---|---|---\n");
//
// }
//}

void print_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
/*printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);*/
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
//printf("---|---|---\n");
for (j = 0; j < col; j++)
{
printf("---");
if(j<col-1)
printf("|");
}
printf("\n");
}
}
}

void player_move(char board[ROW][COL], int row, int col)
{
printf("玩家下棋\n");
while (1)
{
printf("请输入要下棋的坐标:>");
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该坐标被占用,请重新输入\n");
}
}
else
{
printf("坐标非法\n");
}
}
}


//电脑下棋
//随机生成坐标,只要坐标没有被占用,就下棋
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}


//我希望is_full这个函数只是为了支持is_win函数的,只是在is_win函数内部使用
// 那我们没不要在头文件中声明
//
//判断棋盘是否满了
static int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}

char is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
//判断三行
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
//判断三列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}

//平局?
if (is_full(board, row, col) == 1)
{
return 'Q';
}

//继续
//没有玩家或者电脑赢,也没有平局,游戏继续
return 'C';
}

标签:int,三子,C语言,board,printf,row,COL,ROW
From: https://blog.51cto.com/u_15501985/5836681

相关文章

  • c语言中位运算符及用法 异或
    a&b: 0000000000000000  a&b=0x0a|b:0000000001011111  a|b=0x5fa^b:0000000001011111  a^b=0x5f~a :1111111111110000   ~a=0xfff0转载:https:......
  • 计算机等级考试二级C语言模拟试卷(八)
    一、选择题(每小题1分,共40分)(1)下列链表种,其逻辑结构属于非线性结构的是 A)循环链表      B)双向链表        C)二叉链表         D)带链的栈(2)设循......
  • 计算机等级考试二级C语言模拟试卷(七)
    一、选择题(每小题1分,共40分)1、下列关于循环队列的叙述,正确的是A.循环队列是队列的一种顺序存储结构B.循环队列是队列的一种链式存储结构C.循环队列是非线性结构D.循环队列......
  • 计算机等级考试二级C语言模拟试卷(六)
    一、选择题(每小题1分,共40分)(1)下列叙述中正确的是A)算法就是程序B)设计算法时只需要考虑数据结构的设计C)设计算法时只需要考虑结果的可靠性D)以上三种说法都不对(2)下列关于......
  • C语言二分查找
    #include<stdio.h>intbinary_search(intarr[],intk,intsz){intleft=0;intright=sz-1;while(left<=right){intmid=(left+right)/2;if(arr[mid]<k){ left=mi......
  • C语言指针运算
    指针运算指针可以加减运算,但不可以乘除运算。在指针中p++并不是加一,而是以素的值为单位加一,指向下一个单位,加多少字节 要看类型是什么。在指针变量名字前面加*比......
  • C语言——程序环境和预处理
    程序的翻译环境和执行环境编译+链接预处理一.程序的翻译环境和执行环境在ANSIC标准的任何一种实现中,存在两种不同的环境:翻译环境:该环境中源代码会被转换为可执行的机器......
  • 计算机等级考试二级C语言模拟试卷(四)
    一、选择题(每小题1分,共40分)   (1)下列关于栈叙述正确的是A)栈顶元素最先能被删除                 B)栈顶元素最后才能被删除C)......
  • C语言选择结构的执行条件
    在C语言中,有些细节常常被忽略:选择结构的执行条件我们知道,if()和elseif()是判断程序是否执行的函数。需要注意的是,这两个函数判断的是括号内的值是逻辑真(true)还是逻辑......
  • C语言的自增自减运算符
    简单去理解,C语言的自增自减运算符的最终结果就是对自身进行加一和减一操作。但是当++、--作为后缀时则具有延后性,可能对程序有一些副作用,并且其的优先级也会对程序产生一......