赞
踩
目录
基本功能
代码编写思路
三子棋游戏首先要实现棋盘的打印,然后读取玩家落子坐标,将玩家的坐标打印在棋盘上。
然后用随机函数实践电脑的下棋。
在每一步玩家和电脑下完棋后都要使用判断输赢的函数判断是否有一方赢得游戏,如果棋盘下满了未有一方赢得游戏则平局。
- void menu() {
- printf("********************************\n");
- printf("**** 0.exit 1.play****\n");
- printf("********************************\n");
- }
当用户输入1时开始游戏
当用户输入0时游戏结束
- int main()
- {
- int input = 0;
- srand((unsigned int)time(NULL));
- do {
- menu();
- printf("请输入你的选择:>");
- scanf("%d", &input);
- switch (input) {
- case 1:
- play();
- break;
- case 0:
- printf("退出游戏\n");
- break;
- default:
- printf("输入无效请重新输入\n");
- break;
- }
- } while (input);
-
-
- return 0;
- }

首先使用do-while循环将menu函数打印出来
然后使用swith语句对用户输入的选择进行判断是否进入游戏。
input变量作为用户输入的变量,当input=0时会退出while循环
当input为1时则进入play函数。
- void play() {
- char board[ROW][COL] = { 0 };
- //初始化棋盘
- InitBoard(board, ROW, COL);
- //打印棋盘
- display(board, ROW, COL);
- //下棋
- char ret = 0;
- while (1) {
- //玩家下棋
- playermove(board,ROW,COL);
- display(board, ROW, COL);
- // 判断输赢
- ret = iswin(board, ROW, COL);
- if (ret != 'C')break;
-
- //电脑下棋
- computermove(board, ROW, COL);
- display(board, ROW, COL);
- //判断输赢
- ret = iswin(board, ROW, COL);
- if (ret != 'C')break;
- }
- if (ret == '*')printf("玩家赢\n");
- else if (ret == '#')printf("电脑赢\n");
- else printf("平局\n");
- }

play函数作为游戏运行的主要函数,游戏棋盘的打印,玩家下棋的各个函数都依托这个函数来实现。
代码
- #define _CRT_SECURE_NO_WARNINGS 1
- #define _CRT_SECURE_NO_WARNINGS 1
- #include"game.h"
-
- void play() {
- char board[ROW][COL] = { 0 };
- //初始化棋盘
- InitBoard(board, ROW, COL);
- //打印棋盘
- display(board, ROW, COL);
- //下棋
- char ret = 0;
- while (1) {
- //玩家下棋
- playermove(board,ROW,COL);
- display(board, ROW, COL);
- // 判断输赢
- ret = iswin(board, ROW, COL);
- if (ret != 'C')break;
-
- //电脑下棋
- computermove(board, ROW, COL);
- display(board, ROW, COL);
- //判断输赢
- ret = iswin(board, ROW, COL);
- if (ret != 'C')break;
- }
- if (ret == '*')printf("玩家赢\n");
- else if (ret == '#')printf("电脑赢\n");
- else printf("平局\n");
- }
-
- void menu() {
- printf("********************************\n");
- printf("**** 0.exit 1.play****\n");
- printf("********************************\n");
- }
-
- int main()
- {
- int input = 0;
- srand((unsigned int)time(NULL));
- do {
- menu();
- printf("请输入你的选择:>");
- scanf("%d", &input);
- switch (input) {
- case 1:
- play();
- break;
- case 0:
- printf("退出游戏\n");
- break;
- default:
- printf("输入无效请重新输入\n");
- break;
- }
- } while (input);
-
-
- return 0;
- }

game.c主要进行函数功能的实现
遍历二维数组将棋盘初始化为空格
- void InitBoard(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] = ' ';
- }
- }
- }
特别注意在打印间隔符时
if (j < col - 1)
printf("|");
使用这串代码将最后的间隔符不打印
- void display(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) {
-
- 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 a = 0, b = 0;
- while (1) {
- printf("请选择棋子落点:>");
- scanf("%d %d",&a,&b);
- if (a >= 1 && a <= row && b >= 1 && b <= col) {
- if (board[a - 1][b - 1] == ' ') {
- board[a - 1][b - 1] = '*';
- break;
- }
- else//不能落子
- {
- printf("坐标被占用,不能落子,请重新输入坐标\n");
-
- }
- }
- else
- {
- printf("坐标非法,请重新输入\n");
- }
-
- }
-
- }

代码
- void computermove(char board[ROW][COL], int row, int col) {
- int x = 0, y = 0;
- printf("电脑下棋\n");
- while (1) {
- x = rand() % row;
- y = rand() % col;
- if (board[x][y] == ' ') {
- board[x][y] = '#';
- break;
- }
- }
- }
代码
-
- int isfull(char board[ROW][COL], int row, int col) {
- int f = 1;
- for (int i = 0; i < row; i++) {
- for (int 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;
- //判断行
- for (i = 0; i < row; i++) {
- if (board[i][0] == board[i][1] && board[i][2] == board[i][1] && board[i][0] != ' ') {
- return board[i][0];
- }
- }
- //判断列
- for (i = 0; i < row; 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[0][0] != ' ')
- 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) == 1) {
- return 'Q';
- }
-
-
- //继续
- return 'C';
- }
-
-

- #define _CRT_SECURE_NO_WARNINGS 1
- #include"game.h"
-
- //初始化为空格棋盘
- void InitBoard(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 display(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) {
-
- 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 a = 0, b = 0;
- while (1) {
- printf("请选择棋子落点:>");
- scanf("%d %d",&a,&b);
- if (a >= 1 && a <= row && b >= 1 && b <= col) {
- if (board[a - 1][b - 1] == ' ') {
- board[a - 1][b - 1] = '*';
- break;
- }
- else//不能落子
- {
- printf("坐标被占用,不能落子,请重新输入坐标\n");
-
- }
- }
- else
- {
- printf("坐标非法,请重新输入\n");
- }
-
- }
-
- }
- //电脑随机下棋
- void computermove(char board[ROW][COL], int row, int col) {
- int x = 0, y = 0;
- printf("电脑下棋\n");
- while (1) {
- x = rand() % row;
- y = rand() % col;
- if (board[x][y] == ' ') {
- board[x][y] = '#';
- break;
- }
- }
- }
- int isfull(char board[ROW][COL], int row, int col) {
- int f = 1;
- for (int i = 0; i < row; i++) {
- for (int 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;
- //判断行
- for (i = 0; i < row; i++) {
- if (board[i][0] == board[i][1] && board[i][2] == board[i][1] && board[i][0] != ' ') {
- return board[i][0];
- }
- }
- //判断列
- for (i = 0; i < row; 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[0][0] != ' ')
- 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) == 1) {
- return 'Q';
- }
-
-
- //继续
- return 'C';
- }
-
-
-

头文件主要用来声明
代码
- #pragma once
- #include<stdio.h>
- #include<stdlib.h>
-
- #define ROW 3
- #define COL 3
-
- void InitBoard(char board[ROW][COL],int row,int rol);
- void display(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);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。