赞
踩
前言:在通往未来的路上,每个人都是孤独的旅行者。你的人生不会辜负你的。那些转错的弯,那些流下的泪水,那些滴下的汗水,全都让你成为独一无二的自己。今天小编带大家来制作一个简易的三子棋小游戏。
目录
1.创建test.c game.h 源文件和game.h头文件
用C语言实现小游戏三子棋
1.菜单界面选择开始或者退出游戏。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子(玩家输入行列坐标的方式来落子),'*’表示玩家落子。
5.判定胜负关系(输,赢,和棋),'Q’表示和棋。
6.电脑落子(随机位置落子) ,'#’表示电脑落子。
7.判定胜负关系。
分别在编译其中创建test.c test.h 原文件和game.h头文件,这样会是代码更加简练,便于观察,方便初学者理解。
首先在test.c源文件中创建菜单函数
- void menu()
- {
- printf("******************************\n");
- printf("*********1.play 0.exit********\n");
- printf("******************************\n");
- }
首先创建棋盘
- char board[ROW][COL] = { 0 };
- #define ROW 3
- #define COL 3
使用宏定义的原因:
1.推高代码可读性,后续代码中遇到3,方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。
其次初始化棋盘
- 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]=' ';
- }
- }
- }
注意:形参中的row和col主要是与宏定义中的ROW和COL做区分
- void DispalyBoard(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++)
- {
- //%c前后必须要有空格
- 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");
- }
- }
- }
注意:
1.玩家落子需要在棋盘范围内。
2.玩家要在棋盘上空的地方落子。
3.如果输入的坐标不满足要重新输入。
4.这里之所以x,y要从1开始循环是因为这样更符合生活场景
- void PlayerMove(char board[ROW][COL], int row, int col)
- {
- int x = 0;
- int y = 0;
- printf("玩家下棋");
- 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;
- //这里的x,y之所以要从一开始计算是因为这样更符合生活场景
- }
- else
- {
- printf("坐标已被占用,不能下棋,请选择其他位置\n");
- }
- }
- else
- {
- printf("坐标违法,请重新输入\n");
- }
- }
- }
注意:这里之所以x,y要从1开始循环是因为这样更符合生活场景
注意:
1.要在主函数中使用srand((unsigned int)time(0))
将时间作为随机数种子,确保得到的行列坐标是真随机。
2.要在棋盘上空的地方下棋。
- void ComputerMove(char board[ROW][COL],int row, int col)
- {
- printf("电脑下棋");
- int x = 0;
- int y = 0;
- while (1)
- {
- //电脑随机生成
- x = rand() % row;//0-2
- y = rand() % col;
- if (board[x][y] == ' ')
- {
- board[x][y] = '#';
- break;
- }
- }
- }
1.判定是否和棋
(1)调用IsFull函数。
(2)如果数组中有元素为’ ‘,那么没满,返回0。如果全不为’ ',满了,返回1。
(3)如果棋盘满了未分出胜负,和棋。
- //满了就返回1
- //不满 返回0
- 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;
- }
-
此处约定返回结果的含义:
(1)‘*’ 表示玩家获胜
(2)‘#’ 表示电脑获胜
(3)’ Q’ 表示胜负未分
(4) ‘C’ 表示和棋
2.判定电脑玩家胜利
(1)判定所有的行
(2)判定所有的列
(3)判定两条对角线
- 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][1] == board[i][2] && board[i][1] != ' ')
- {
- return board[i][1];//
- }
- }
-
- //列
- int j = 0;
- 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';
- }
- #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 DispalyBoard(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);
- int IsFull(char board[ROW][COL], int row, int col);
- char IsWin(char board[ROW][COL], int row, int col);
- #define _CRT_SECURE_NO_WARNINGS 1
- #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 DispalyBoard(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;
- int y = 0;
- printf("玩家下棋");
- 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;
- //这里的x,y之所以要从一开始计算是因为这样更符合生活场景
- }
- else
- {
- printf("坐标已被占用,不能下棋,请选择其他位置\n");
- }
- }
- else
- {
- printf("坐标违法,请重新输入\n");
- }
- }
- }
- void ComputerMove(char board[ROW][COL],int row, int col)
- {
- printf("电脑下棋\n");
- int x = 0;
- int y = 0;
- while (1)
- {
- //电脑随机生成
- x = rand() % row;//0-2
- y = rand() % col;
- if (board[x][y] == ' ')
- {
- board[x][y] = '#';
- break;
- }
- }
- }
- 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 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][1] == board[i][2] && board[i][1] != ' ')
- {
- return board[i][1];//
- }
- }
-
- //列
- int j = 0;
- 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';
- }
- #define _CRT_SECURE_NO_WARNINGS 1
- #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);
- DispalyBoard(board, ROW, COL);
- //下棋
- while (1)
- {
- PlayerMove(board, ROW, COL);
- //判断输赢
- ret = IsWin(board, ROW, COL);
-
- if (ret != 'C')
- {
- break;
- }
- DispalyBoard(board, ROW, COL);
- ComputerMove(board, ROW, COL);
- //判断输赢
- ret = IsWin(board, ROW, COL);
- if (ret != 'C')
- {
- break;
- }
- DispalyBoard(board, ROW, COL);
- }
- if (ret == '*')
- {
- printf("玩家赢\n");
- }
- else if (ret == '#')
- {
- printf("电脑赢\n");
- }
- else
- {
- printf("平局\n");
- }
- DispalyBoard(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 0:
- printf("退出游戏\n");
- default:
- printf("退出游戏\n");
- break;
- }
- } while (input);
-
- return 0;
- }
结语:
每个人的成长都是能力和想要得到的东西,不断匹配的过程,当你的才华和欲望不匹配时,你就该静下心来学习了,如果小编的总结能对你有所帮助,希望小伙伴们三连加关注哦,你的支持是小编创作的最大动力。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。