本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下
game.h
设置头文件
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//声明函数
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);
//判断输赢
char CheckWin(char board[ROW][COL], int row, int col);
|
game.c
实现三子棋游戏功能模块
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
#include"game.h"
void InitBoard(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++) {
board[i][j] = ' ';
}
}
}
void DisplayBoard(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");
if (i < row - 1) {
for (j = 0; j < col; j++) {
printf("---");
if (j < col - 1) {
printf("|");
}
}
}
printf("\n");//打印完分割线换行
}
}
void PlayerMove(char board[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
printf("玩家走:\n");
while (1)
{
printf("请输入坐标:");
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 ComputerMove(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;
}
}
}
static int IsFull(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 CheckWin(char board[ROW][COL], int row, int col) {
int i = 0;
int j = 0;
int count = 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 < row; i++) {
count = 0;
for (j = 0; j < col - 1; j++) {
if (board[i][j] == board[i][j + 1] && board[i][j] != ' ') {
count++;
}
else
{
break;
}
//if (count == col - 1) {
// return board[i][0];
//}
}
if (count == col - 1) {
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];
// }
//}
for (i = 0; i < col; i++) {
count = 0;
for (j = 0; j < row - 1; j++) {
if (board[j][i] == board[j+1][i] && board[j][i] != ' ') {
count++;
}
else
{
break;
}
//if (count == row - 1) {
// return board[0][i];
//}
}
if (count == row - 1) {
return board[0][i];
}
}
//对角线
//if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') {
// return board[0][0];
//}
//if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ') {
// return board[1][1];
//}
//分别判断两条对角线
int count1 = 0;
for (i = 0; i < row-1; i++) {
//count = 0;
if ((board[i][i] == board[i + 1][i + 1])&&(board[0][0]!=' ')) {//循环判断第一条对角线 如果相同计数器累加 不相同就跳出循环
count1++;
}
else
{
break;
}
//if (count1 == row - 1) {//到此时 第一条对角线上所有元素相同 游戏结束 返回胜利条件 count达不到row-1!!
// return board[0][0];
//}
}
if (count1 == row - 1) {//到此时 需要在外层判断!! 第一条对角线上所有元素相同 游戏结束 返回胜利条件
return board[0][0];
}
int count2 = 0;
for (i = 0; i < row - 1; i++) {
//count = 0;
if (board[i][row-1-i] == board[i + 1][row-2-i] && board[row-1-i][0] != ' ') {
count2++;
}
else
{
break;
}
//if (count2 == row - 1) {
// return board[row-1][0];
//}
}
if (count2 == row - 1) {
return board[row - 1][0];
}
//判断平局 棋盘是否满了 是否有空格
if (IsFull(board,ROW,COL)==1) {
return 'Q';
}
//不是平局
return 'C';
}
|
test.c
主函数
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
#include"game.h"
void game() {
char ret = 0;
//printf("game start");
char board[ROW][COL] = { 0 };//数组应该初始化为空格
InitBoard(board, ROW, COL);//初始化棋盘
//打印棋盘
DisplayBoard(board, ROW, COL);
//分析:
//1、玩家赢 * 2、电脑赢 # 3、平局 Q 4、继续 C
//要判断输赢
while (1)
{
//玩家下棋
PlayerMove(board,ROW,COL);
DisplayBoard(board, ROW, COL);
//判断输赢
ret = CheckWin(board, ROW, COL);
if (ret != 'C') {
break;
}
//电脑下棋
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断输赢
ret = CheckWin(board, ROW, COL);
if (ret != 'C') {
break;
}
}
if (ret == '*') {
printf("玩家赢\n");
}
else if(ret == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
void menu() {
printf("##########################\n");
printf("######### 1、play ########\n");
printf("######### 0、exit ########\n");
printf("##########################\n");
}
int main() {
int input = 0;
srand((unsigned int)time(NULL));//生成随机数
do {
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();//三子棋游戏
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_47641376/article/details/118884135








发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。