三子棋—c语言版本
- 一、问题描述
- 二、基本思路
- 三、操作步骤
- 1.打印菜单
- 2.初始化棋盘
- 3.打印棋盘
- 4.玩家下棋
- 5.电脑下棋
- 5.判断胜负
- 四、全部代码
- 1.game.h
- 2.game.c
- 3.test.c
一、问题描述
本次三子棋小游戏代码全部由C语言实现,运用了C语言的二维数组,循环,函数等基本知识来完成的。
二、基本思路
1.菜单界面2.初始化棋盘3.打印棋盘4.玩家下棋5.电脑下棋6.判断胜负
三、操作步骤
1.打印菜单
void menu()
{printf("****************\n");printf("**1.play 0.exit**\n");printf("****************\n");
}
2.初始化棋盘
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{int i = 0, j = 0;for (i = 0; i < row; i++) {for (j = 0; j < col; j++) {board[i][j] = ' ';}}
}
3.打印棋盘
//打印棋盘
void DisplayBoard(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++) {printf(" %c ", board[i][j]);if (j < col - 1)printf("|");}printf("\n");if (i < row - 1) {int j = 0;for (j = 0; j < col; j++) {printf("---");if (j < col -1)printf("|");} }printf("\n");}
}
4.玩家下棋
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{int x = 0, 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");}}printf("坐标非法,请重新输入\n");}
}
5.电脑下棋
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑下棋->\n");int x = 0, y = 0;while (1){x = rand() % row;//0~2y = rand() % col;//0~2if (board[x][y] == ' ') {board[x][y] = '#';break;}}
}
5.判断胜负
//判断输赢
//满了返回1,不满返回0
int IsFull(char board[ROW][COL], int row, int col)
{int i = 0, j = 0;for (i = 0; i < row; i++) {for (j = 0; j < col; j++) {if (board[i][j] == ' ') {return 0;}}}return 1;
}char IsWin(char board[ROW][COL], int row, int col)
{//判断行行int i = 0, j = 0;/*for (i = 0; i < row; i++) {if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')return board[i][1];}*/for(i = 0;i<row;i++){int count = 0;for (j = 0; j < col-1; j++){if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')count++;}if(count == col - 1)return board[i][1];}//判断列for (j = 0; j < col; j++){if(board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' '){return board[1][j];}}//判断对角线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 (IsFull(board, row, col)){return 'Q';}//游戏继续return 'C';
}
四、全部代码
1.game.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define ROW 3
#define COL 3
//初始化棋盘
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 IsWin(char board[ROW][COL], int row, int col);
//判断棋盘是否满了
int IsFull(char board[ROW][COL], int row, int col);
2.game.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"game.h"//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{int i = 0, 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++) {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) {int j = 0;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, 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");}}printf("坐标非法,请重新输入\n");}
}
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑下棋->\n");int x = 0, y = 0;while (1){x = rand() % row;//0~2y = rand() % col;//0~2if (board[x][y] == ' ') {board[x][y] = '#';break;}}
}
//判断输赢
//满了返回1,不满返回0
int IsFull(char board[ROW][COL], int row, int col)
{int i = 0, j = 0;for (i = 0; i < row; i++) {for (j = 0; j < col; j++) {if (board[i][j] == ' ') {return 0;}}}return 1;
}char IsWin(char board[ROW][COL], int row, int col)
{//判断行行int i = 0, j = 0;/*for (i = 0; i < row; i++) {if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')return board[i][1];}*/for(i = 0;i<row;i++){int count = 0;for (j = 0; j < col-1; j++){if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')count++;}if(count == col - 1)return board[i][1];}//判断列for (j = 0; j < col; j++){if(board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' '){return board[1][j];}}//判断对角线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 (IsFull(board, row, col)){return 'Q';}//游戏继续return 'C';
}
3.test.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"game.h"void menu()
{printf("****************\n");printf("**1.play 0.exit**\n");printf("****************\n");
}void game() {char ret = 0;char board[ROW][COL] = { 0 };//初始化棋盘InitBoard(board, ROW, COL);DisplayBoard(board, ROW, COL);while (1){PlayerMove(board, ROW, COL);//判断输赢ret = IsWin(board, ROW, COL);if (ret != 'C'){break;}DisplayBoard(board, ROW, COL);ComputerMove(board, ROW, COL);// 判断输赢if (ret != 'C'){break;}DisplayBoard(board, ROW, COL);}if (ret == '*'){printf("玩家赢!\n");}else if (ret == '#'){printf("电脑赢!\n");}elseprintf("平局\n");DisplayBoard(board, ROW, COL);}int main() {srand((unsigned int)time(NULL));//设置随机数int input = 0;do {menu();//打印菜单printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 2:printf("退出游戏\n");default:printf("选择错误!\n");break;}} while (input);return 0;
}